2017-04-24 102 views
0

http://csrc.nist.gov/groups/STM/cavp/documents/aes/AESAVS.pdf蒙特卡洛试验上AES 128 CBC

对于第一次迭代的预期矢量结果说明我上AES 128 CBC执行MCT是

KEY = 9dc2c84a37850c11699818605f47958c

IV = 256953b2feab2a04ae0180d8335bbed6

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 4B A3 41 BD AF 51 D9

与预期结果不符。 我怀疑上述功能中有些东西不对,但是AESAVS pdf中给出的伪代码也有点混淆。 请澄清它出错的地方..

+0

哎呀..我的坏,它需要1000迭代产生一个输出..我只做999 ..改变循环为(INT我= 0;我<1000;我++),它的工作 – akhilbaai

回答

0

糟糕..我的坏,它需要1000次迭代用于产生一个输出。我只999在做.. for循环来变更(INT I = 0;我< 1000;我++)和它的工作

0

请注意那里是NIST文档中AES的三个和两个参数版本。您为三参数版本正确使用CBC模式,但您需要为两参数版本使用ECB模式。对于无填充的单个完整块

If (j=0) 
    CT[j] = AES(Key[i], IV[i], PT[j]) 
    PT[j+1] = IV[i] 
Else 
    CT[j] = AES(Key[i], PT[j]) 
    PT[j+1] = CT[j-1] 

ECB模式基本上是纯AES块密码这正是ELSE - 嵌段需要。你可能会遇到问题,因为IV是ctx中的一个有状态值,如果没有任何控制权,它将自行前进。您必须将CBC用于第一个区块,将ECB用于所有其他区块。

相关问题