Javascript CryptoJS到OpenSSL加密转换

Javascript CryptoJS到OpenSSL加密转换,javascript,c,encryption,openssl,cryptojs,Javascript,C,Encryption,Openssl,Cryptojs,我需要将一些JavaScript代码移植到C99后端。在Javascript代码中,他们使用CryptoJS执行AES加密: var key = CryptoJS.MD5(Math.random().toString()).toString(); key = CryptoJS.enc.Hex.parse(key); var iv = CryptoJS.MD5(Math.random().toString()).toString(); iv = CryptoJS.enc.Hex.parse(iv

我需要将一些JavaScript代码移植到C99后端。在Javascript代码中,他们使用CryptoJS执行AES加密:

var key = CryptoJS.MD5(Math.random().toString()).toString();
key = CryptoJS.enc.Hex.parse(key);

var iv = CryptoJS.MD5(Math.random().toString()).toString();
iv = CryptoJS.enc.Hex.parse(iv);

var data = "testdata";
var encrypted = CryptoJS.AES.encrypt(data, key, { iv:iv, mode:CryptoJS.mode.CBC, padding:CryptoJS.pad.ZeroPadding });
现在,我需要在C中用OpenSSL库实现相同的代码。我已经毫无问题地创建了随机MD5字符串,但是我看不到如何使用零填充实现AES加密。这就是我所拥有的:

bool crypto_aes_encrypt(const char* data, unsigned char *key, unsigned char *iv, unsigned char **out_buf, int *out_buf_len)
{
    ERR_load_crypto_strings();
    OPENSSL_add_all_algorithms_conf();

    /* Initialize the cipher context */
    EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();
    if(!ctx) {
        return NULL;
    }

    /* Initialize the AES encryption */
    if(EVP_EncryptInit_ex(ctx, EVP_aes_256_cbc(), NULL, key, iv) != 1) {
        return NULL;
    }

    /* Encrypt the data */
    *out_buf = (unsigned char*) malloc(2048 * sizeof(char));
    *out_buf_len = 0;
    if(EVP_EncryptUpdate(ctx, *out_buf, out_buf_len, (const unsigned char*) data, strlen(data)) != 1) {
        free(out_buf);
        return NULL;
    }

    if(EVP_EncryptFinal(ctx, *out_buf + *out_buf_len, out_buf_len) != 1) {
        free(out_buf);
        return NULL;
    }

    EVP_CIPHER_CTX_free(ctx);
    EVP_cleanup();
    ERR_free_strings();

    return true;
}

如何在CryptoJS中使用的OpenSSL中实现零填充?

另请参见OpenSSL wiki。它有一个关于填充的简短部分。简而言之,如果禁用PKCS填充,则必须自己处理填充。在零填充的情况下,您负责在加密块之前将尾部字节归零。还有,我现在很接近了。加密输出字符串的开头是相同的,但是OpenSSL在结尾添加了一些额外的字节;而不是让尾部字节未初始化。记住,分组密码总是在一个块上工作。在AES的情况下,每个块16个字节。我让它工作了。我用OpenSSL加密了一个额外的16B空字节块,这当然不是必需的。谢谢你的帮助,非常好。一定要发布一个答案,并在期限过后接受它。我尝试对促进互操作的问题和答案进行投票。早些时候,我不清楚这个问题的方向。现在答案已经到了,我很清楚这是一个高质量的问答。它有一个关于填充的简短部分。简而言之,如果禁用PKCS填充,则必须自己处理填充。在零填充的情况下,您负责在加密块之前将尾部字节归零。还有,我现在很接近了。加密输出字符串的开头是相同的,但是OpenSSL在结尾添加了一些额外的字节;而不是让尾部字节未初始化。记住,分组密码总是在一个块上工作。在AES的情况下,每个块16个字节。我让它工作了。我用OpenSSL加密了一个额外的16B空字节块,这当然不是必需的。谢谢你的帮助,非常好。一定要发布一个答案,并在期限过后接受它。我尝试对促进互操作的问题和答案进行投票。早些时候,我不清楚这个问题的方向。现在答案已经到了,我很清楚这是一个高质量的问答。