使用KEY的Openssl / libcrypto AES 128编码

我正在使用AES-128-ECB加密某个字符串,然后将结果保存在文件中,例如test.enc这是我执行加密的方法:

int do_crypt(char *outfile) { unsigned char outbuf[1024]; int outlen, tmplen; unsigned char key[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}; char intext[] = "Some Text"; EVP_CIPHER_CTX ctx; FILE *out; EVP_CIPHER_CTX_init(&ctx); EVP_EncryptInit_ex(&ctx, EVP_aes_128_ecb(), NULL, key, NULL); if(!EVP_EncryptUpdate(&ctx, outbuf, &outlen, intext, strlen(intext))) { /* Error */ return 0; } /* Buffer passed to EVP_EncryptFinal() must be after data just * encrypted to avoid overwriting it. */ if(!EVP_EncryptFinal_ex(&ctx, outbuf + outlen, &tmplen)) { /* Error */ return 0; } outlen += tmplen; EVP_CIPHER_CTX_cleanup(&ctx); /* Need binary mode for fopen because encrypted data is * binary data. Also cannot use strlen() on it because * it wont be null terminated and may contain embedded * nulls. */ out = fopen(outfile, "wb"); fwrite(outbuf, 1, outlen, out); fclose(out); return 1; 

}

如您所见,密钥是实际密码,为了解码加密文件,应执行以下命令行:

 openssl aes-128-ecb -in test.enc -K 000102030405060708090A0B0C0D0E0F -d 

“000102030405060708090A0B0C0D0E0F”是我在0123456789191112131415上面的代码中使用的密码hex表示。据我所知,密码也可以使用MD5算法加密。

问题是如何使用从密码派生的实际KEY加密数据,而不是使用libcrypto来密码本身?

看看EVP_BytesToKey 。

我在一个旧应用程序中的评论告诉我BytesToKey已经过时了,您应该考虑查看PKCS5_v2_PBE_keyivgen或类似内容。 但实际上,一种高度简化的方法是将密钥从密码和适当的盐值派生为哈希值:

 EVP_DigestInit_ex(...) EVP_DigestUpdate(...Password...) EVP_DigestUpdate(...Salt...) EVP_DigestFinal_ex(...) 

然后你使用新生成的密钥来导出你的IV:

 EVP_DigestInit_ex(...) EVP_DigestUpdate(...Key...) EVP_DigestUpdate(...Password...) EVP_DigestUpdate(...Salt...) EVP_DigestFinal_ex(...) 

浏览OpenSSL源代码对于查找这样的东西最有用。

免责声明:我不是C程序员(有问题的应用程序是使用OpenSSL DLL的Delphi),也不是安全专家,所以请将这些建议作为起点,阅读正确的文档并尽可能使用正确的函数!! …