첫 번째 반복에 대한 http://csrc.nist.gov/groups/STM/cavp/documents/aes/AESAVS.pdf몬테카를로 시험 CBC
예상 벡터 결과에 기술 된 바와 같이 I는 AES 128 CBC에
KEY = 9dc2c84a37850c11699818605f47958c
IV = 256953b2feab2a04ae0180d8335bbed6
을 MCT이다 수행있어PLAINTEXT = 2e586692e647f5028ec6fa47a55a2aab
암호문 = 1b1ebd1fc45ec4 함수 아래
3037fd4844241a437f 먼저 반복 출력을 생성하는데 사용된다
void
do_mct()
{
EVP_CIPHER_CTX *ctx = NULL;
unsigned char key[16] =
{ 0x9d, 0xc2, 0xc8, 0x4a, 0x37, 0x85, 0x0c, 0x11, 0x69, 0x98, 0x18, 0x60, 0x5f, 0x47, 0x95, 0x8c };
unsigned char iv[16] =
{ 0x25, 0x69, 0x53, 0xb2, 0xfe, 0xab, 0x2a, 0x04, 0xae, 0x01, 0x80, 0xd8, 0x33, 0x5b, 0xbe, 0xd6 };
unsigned char pt[16] =
{ 0x2e, 0x58, 0x66, 0x92, 0xe6, 0x47, 0xf5, 0x02, 0x8e, 0xc6, 0xfa, 0x47, 0xa5, 0x5a, 0x2a, 0xab };
unsigned char ct_current[16] = { };
unsigned char ct_previous[16] = { };
int ptlen = 16, ctlen = 0;
ctx = EVP_CIPHER_CTX_new();
if (ctx)
{
for (int i = 0; i < 999 ; i++)
{
if (0 == i)
{
if (1 == EVP_EncryptInit(ctx, EVP_aes_128_cbc(), &key[0], &iv[0]))
{
EVP_CIPHER_CTX_set_padding(ctx, 0);
if (1 == EVP_EncryptUpdate(ctx, &ct_current[0] , &ctlen, &pt[0], ptlen))
{
printf("\nctlen= %d\n", ctlen);
memcpy(&pt[0],&iv[0],16);
}
else
{
printf(" error");
}
}
else
{
printf(" error");
}
}
else
{
memcpy(&ct_previous[0],&ct_current[0],ctlen);
if (1 == EVP_EncryptUpdate(ctx, &ct_current[0] , &ctlen, &pt[0], ptlen))
{
memcpy(&pt[0],&ct_previous[0],ctlen);
}
else
{
printf(" error");
}
}
}
printf("\nCT :- ");
for(int i=0;i<ctlen;i++)
{
printf("%02x ", ct_current[i]);
}
EVP_CIPHER_CTX_free(ctx);
}
}
그것은 같은 결과를 인쇄 CT : - C1 B7의 7E의 D5 25 21 52 5F 0A의 (b)의 A3 41 BD AF 51 D9
은 예상 결과와 일치하지 않습니다. 내가 뭔가를 의심하고있어 는 위의 함수의 권리가 아니라 AESAVS의 PDF 파일에 주어진 의사 코드뿐만 아니라 혼란 조금 .. 가 잘못 갔다 위치에 대한 몇 가지 빛을 흘렸다하시기 바랍니다했다 ..
근무 죄송합니다 .. 내 나쁜, 그것은 하나의 출력을 생산하기 위해 1000 반복이 필요합니다 .. 나는 999 .. 루프에 대한 변경 (int i = 0; i <1000; i ++) 그리고 그것은 효과가있다. – akhilbaai