使用Visual Studio和Openssl进行AES 256 CTR加密/解密

时间:2014-06-15 13:39:23

标签: c encryption openssl aes

美好的一天,绅士!我正在尝试使用带有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);
    }

1 个答案:

答案 0 :(得分:4)

在解密期间,替换

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

AES_set_encrypt_key((unsigned char*)rkey, 256, &key);
相关问题