2014-06-15 60 views
2

美好的一天,绅士!我正在尝试使用带有256位密钥的aes ctr来加密和解密字符串。下面我发布了代码。我错过了什么,但我无法弄清楚什么。由解密产生的Checktext与明文不同。提前致谢!AES 256 CTR加密/解密使用Visual Studio和Openssl

struct ctr_state 
{ 
    unsigned char ivec[16]; 
    unsigned int num; 
    unsigned char ecount[16]; 
}; 

int init_ctr(struct ctr_state *state, const unsigned char iv[16]) 
{ 
    state->num = 0; 

    memset(state->ecount,0,16); 
    memset(state->ivec + 8, 0, 8); /* Copy IV into 'ivec' */ 
    memcpy(state->ivec, iv, 8); 

    return 0; 
} 

struct ctr_state state; 

void ctr_encrypt(const size_t encslength, AES_KEY key, int length) 
    { 
     init_ctr(&state, iv); 
     unsigned char my_data[16], output[16]; 

     AES_set_encrypt_key((unsigned char*)rkey, 256, &key); 

     for (int i=1; i<encslength/16+1; i++) 
     { 
      memset(my_data,0,16); 
      memcpy(my_data,plaintext+((i-1)*16),16); 
      AES_ctr128_encrypt((unsigned char*)my_data, (unsigned char*)output, 16, &key, state.ivec, state.ecount, &state.num); 
      memcpy(ciphertext+((i-1)*16),output,16); 
     } 

     hexdump(stdout, "ciphertext", (unsigned char*)ciphertext, length); 
    } 


    void ctr_decrypt(const size_t encslength, AES_KEY key, int length) 
    { 
     init_ctr(&state, iv); 
     unsigned char my_data[16], output[16]; 

     AES_set_decrypt_key((unsigned char*)rkey, 256, &key); 

     for (int i=1; i<encslength/16+1; i++) 
     { 
      memset(my_data,0,16); 
      memcpy(my_data,ciphertext+((i-1)*16),16); 
      AES_ctr128_encrypt((unsigned char*)my_data, (unsigned char*)output, 16, &key, state.ivec, state.ecount, &state.num); 
      memcpy(checktext+((i-1)*16),output,16); 
     } 

     hexdump(stdout, "checktext", (unsigned char*)checktext, length); 
    } 
+0

这是什么问题更换

AES_set_decrypt_key((unsigned char*)rkey, 256, &key); 

? – SLaks

+0

@SLaks对不起。由解密产生的Checktext与明文不同。 –

+0

[OpenSSL上的AES CTR 256加密操作模式]的可能重复(http://stackoverflow.com/questions/3141860/aes-ctr-256-encryption-mode-of-operation-on-openssl) – jww

回答

4

解密时,与

AES_set_encrypt_key((unsigned char*)rkey, 256, &key); 
+0

事实上,它工作。从我读过的内容看来,AES_set_decrypt_key仅适用于某些模式。 (它为aes cbc工作)。非常感谢! –

+0

很高兴帮助:) – ChiaraHsieh