美好的一天,绅士!我正在尝试使用带有256位密钥的aes ctr加密和解密字符串。下面我发布了代码。我错过了一些东西,但我无法弄清楚是什么。解密产生的Checktext与明文不同。提前谢谢!
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 :(得分:4)
在解密期间,替换
AES_set_decrypt_key((unsigned char*)rkey, 256, &key);
与
AES_set_encrypt_key((unsigned char*)rkey, 256, &key);