AES 256 CTR encryption/decryption with Visual Studio and Openssl
Tanatos Daniel
Hello, gentlemen! I am trying to encrypt and decrypt a string using aes ctr with a 256 bit key. I have posted the code below. I'm missing something, but I don't know what. The Checktext produced by decryption is different from the plaintext. Thanks in advance!
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);
}
Xie Jia ara
During decryption, replace
AES_set_decrypt_key((unsigned char*)rkey, 256, &key);
and
AES_set_encrypt_key((unsigned char*)rkey, 256, &key);