我正在尝试在一个较大的项目中编写一个简单的文件加密/解密。 由于许可证问题,我想避免使用 libgpgme。 openPGP 标准对于我的项目时间框架来说太复杂了。 我想用 openssl 做我的加密工作。
现在我已经实现了以下内容:
加密(伪代码):
RAND_bytes(aes_key)
RAND_bytes(aes_salt)
EVP_BytesToKey(EVP_aes_256_cbc(), EVP_sha1(), (const unsigned char *)aes_salt, aes_key, sizeof(aes_key), 5, key, iv);
然后我aes256我的数据
EVP_EncryptInit_ex(&e_ctx, EVP_aes_256_cbc(), NULL, key, iv);
然后我用RSA加密 key 和iv
RSA_public_encrypt(flen, (unsigned char *)key, encryptedKey, rsa, RSA_PKCS1_PADDING );
RSA_public_encrypt(flen, (unsigned char *)iv, encryptedIV, rsa, RSA_PKCS1_PADDING );
然后我将 128 位 key 和 iv 保存在文件的“顶部”(256 字节 header )。
解密: -> 读取前 256 个字节(分成 key 和 iv) -> 用本地 RSA 私钥解密 key 和 iv(当然 RSA 私钥不在文件中) -> 使用 key 和iv解密数据
我对那个代码安全吗?
最佳答案
由于这是一种新格式,您应该使用 OAEP 填充。只需将 RSA_PKCS1_PADDING
更改为 RSA_PKCS1_OAEP_PADDING
。您实际上不需要加密 IV(据我所知,这不会造成伤害,而且可能会有所帮助)。
否则,只要RSA_size(rsa)==16
,这个方法应该没问题。当然,不能解密文件的任何人都不能知道私钥。
关于c - 我的加密是否像 openPGP/SMIME 一样安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7868754/