2017-04-24 2 views
0

첫 번째 반복에 대한 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 파일에 주어진 의사 코드뿐만 아니라 혼란 조금 .. 가 잘못 갔다 위치에 대한 몇 가지 빛을 흘렸다하시기 바랍니다했다 ..

+0

근무 죄송합니다 .. 내 나쁜, 그것은 하나의 출력을 생산하기 위해 1000 반복이 필요합니다 .. 나는 999 .. 루프에 대한 변경 (int i = 0; i <1000; i ++) 그리고 그것은 효과가있다. – akhilbaai

답변

0

아차 ... 내 나쁜, 그것이 내가 .. 단지 999로 루프에 대한 변화를하고 있었는데 .. 하나 개의 출력을 생산하는 1000 반복을 요구 (INT I = 0; 나는 < 1000; 내가 ++)과는

0

참고가 는 NIST 문서에서 AES의 3 가지 및 2 가지 인수 버전입니다. 세 매개 변수 버전에 대해 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 모드는 기본적으로 ELSE - 블록이 요구하는 것입니다 일반 AES 블록 암호이다. IV는 ctx의 상태 값이므로 사용자가 아무런 제어를받지 않아도 계속 진행됩니다. 첫 번째 블록에는 CBC를 사용해야하고 다른 모든 블록에는 ECB를 사용해야합니다.

관련 문제