QByteArray QTinyAes::encryptRaw(const QByteArray &plain) const { Q_ASSERT_X(!d->key.isEmpty(), Q_FUNC_INFO, "The key must not be empty to encrypt data"); Q_ASSERT_X(plain.size() % BlockSize == 0, Q_FUNC_INFO, "plain must be a multiple of QTinyAes::BlockSize"); auto buffer = plain; AES_ctx ctx; if(d->iv.isNull()) AES_init_ctx(&ctx, (uint8_t*)d->key.constData()); else AES_init_ctx_iv(&ctx, (uint8_t*)d->key.constData(), (uint8_t*)d->iv.constData()); switch(d->mode) { case CTR: AES_CTR_xcrypt_buffer(&ctx, (uint8_t*)buffer.data(), (uint32_t)buffer.size()); break; case CBC: AES_CBC_encrypt_buffer(&ctx, (uint8_t*)buffer.data(), (uint32_t)buffer.size()); break; case ECB: for(auto i = 0; i < buffer.size(); i += BlockSize) { auto ctxCopy = ctx; AES_ECB_encrypt(&ctxCopy, (uint8_t*)(buffer.data() + i)); } break; default: Q_UNREACHABLE(); break; } memset(&ctx, 0, sizeof(AES_ctx)); return buffer; }
int main(void) { //256 uint8_t key[] = { 0x60, 0x3d, 0xeb, 0x10, 0x15, 0xca, 0x71, 0xbe, 0x2b, 0x73, 0xae, 0xf0, 0x85, 0x7d, 0x77, 0x81, 0x1f, 0x35, 0x2c, 0x07, 0x3b, 0x61, 0x08, 0xd7, 0x2d, 0x98, 0x10, 0xa3, 0x09, 0x14, 0xdf, 0xf4 }; uint8_t in[] = { 0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96, 0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a}; uint8_t out[16]; for(int i = 0; i < 16; i++) { out[i] = in[i]; } phex(out,16); struct AES_ctx ctx; AES_init_ctx(&ctx, key); AES_ECB_encrypt(&ctx, in); phex(in,16); AES_init_ctx(&ctx, key); AES_ECB_decrypt(&ctx, in); phex(out,16); return 0; }
int main(){ AES_KEY key; AES_KEY decrypt_key; uint8_t *PLAINTEXT; uint8_t *CIPHERTEXT; uint8_t *DECRYPTEDTEXT; uint8_t *EXPECTED_CIPHERTEXT; uint8_t *CIPHER_KEY; int i,j; int key_length; if (!Check_CPU_support_AES()){ printf("Cpu does not support AES instruction set. Bailing out.\n"); return 1; } printf("CPU support AES instruction set.\n\n"); #ifdef AES128 #define STR "Performing AES128 ECB.\n" CIPHER_KEY = AES128_TEST_KEY; EXPECTED_CIPHERTEXT = ECB128_EXPECTED; key_length = 128; #elif defined AES192 #define STR "Performing AES192 ECB.\n" CIPHER_KEY = AES192_TEST_KEY; EXPECTED_CIPHERTEXT = ECB192_EXPECTED; key_length = 192; #elif defined AES256 #define STR "Performing AES256 ECB.\n" CIPHER_KEY = AES256_TEST_KEY; EXPECTED_CIPHERTEXT = ECB256_EXPECTED; key_length = 256; #endif PLAINTEXT = (uint8_t*)malloc(LENGTH); CIPHERTEXT = (uint8_t*)malloc(LENGTH); DECRYPTEDTEXT = (uint8_t*)malloc(LENGTH); for(i=0 ;i<LENGTH/16/4; i++){ for(j=0; j<4; j++){ _mm_storeu_si128(&((__m128i*)PLAINTEXT)[i*4+j], ((__m128i*)AES_TEST_VECTOR)[j]); } } for(j=i*4 ; j<LENGTH/16; j++){ _mm_storeu_si128(&((__m128i*)PLAINTEXT)[j], ((__m128i*)AES_TEST_VECTOR)[j%4]); } if (LENGTH%16){ _mm_storeu_si128(&((__m128i*)PLAINTEXT)[j], ((__m128i*)AES_TEST_VECTOR)[j%4]); } AES_set_encrypt_key(CIPHER_KEY, key_length, &key); AES_set_decrypt_key(CIPHER_KEY, key_length, &decrypt_key); AES_ECB_encrypt(PLAINTEXT, CIPHERTEXT, LENGTH, key.KEY, key.nr); AES_ECB_decrypt(CIPHERTEXT, DECRYPTEDTEXT, LENGTH, decrypt_key.KEY, decrypt_key.nr); printf("%s\n",STR); printf("The Cipher Key:\n"); print_m128i_with_string("",((__m128i*)CIPHER_KEY)[0]); if (key_length > 128) print_m128i_with_string_short("",((__m128i*)CIPHER_KEY)[1],(key_length/8) -16); printf("The Key Schedule:\n"); for (i=0; i< key.nr; i++) print_m128i_with_string("",((__m128i*)key.KEY)[i]); printf("The PLAINTEXT:\n"); for (i=0; i< LENGTH/16; i++) print_m128i_with_string("",((__m128i*)PLAINTEXT)[i]); if (LENGTH%16) print_m128i_with_string_short("",((__m128i*)PLAINTEXT)[i],LENGTH%16); printf("\n\nThe CIPHERTEXT:\n"); for (i=0; i< LENGTH/16; i++) print_m128i_with_string("",((__m128i*)CIPHERTEXT)[i]); if (LENGTH%16) print_m128i_with_string_short("",((__m128i*)CIPHERTEXT)[i],LENGTH%16); for(i=0; i<LENGTH; i++){ if (CIPHERTEXT[i] != EXPECTED_CIPHERTEXT[i%(16*4)]){ printf("The CIPHERTEXT is not equal to the EXPECTED CIHERTEXT.\n\n"); return 1; } } printf("The CIPHERTEXT equals to the EXPECTED CIHERTEXT.\n\n"); for(i=0; i<LENGTH; i++){ if (DECRYPTEDTEXT[i] != PLAINTEXT[i%(16*4)]){ printf("The DECRYPTED TEXT isn't equal to the original PLAINTEXT!"); printf("\n\n"); return 1; } } printf("The DECRYPTED TEXT equals to the original PLAINTEXT.\n\n"); }