这是将文件test.txt
加密为test.enc
的代码。密钥对key.pem
和key.pub
是使用openssl
生成的:
openssl genrsa -out key.pem
openssl rsa -in key.pem -out key.pub -pubout
个字符
然后使用openssl
命令对加密文件进行解密:
openssl rsautl -in test.enc -out test.dec -inkey key.pem -decrypt
型
然后出现此错误:
RSA operation error
407D290301000000:error:0200009F:rsa routines:RSA_padding_check_PKCS1_type_2:pkcs decoding error:crypto/rsa/rsa_pk1.c:269:
407D290301000000:error:02000072:rsa routines:rsa_ossl_private_decrypt:padding check failed:crypto/rsa/rsa_ossl.c:499:
型
似乎有一个问题与填充,但我不知道如何解决它。先谢谢你。
1条答案
按热度按时间sqxo8psd1#
“看起来填充有问题,”--实际上问题是你只做了一半的工作。
EVP_Seal/Open
执行混合加密,也称为信封(envelope)加密。这是described almost correctly in wikipedia,但我将重新措辞以匹配OpenSSL实现和我的首选项。加密由三个步骤和 * 两种不同的 * 加密组成:
1.为对称算法(称为DEK)生成随机数密钥
1.使用RSA和收件人的公钥加密DEK(您必须已经有了,所以这可能被认为是第-1步,但不需要对每个消息重复)
1.使用对称密码(在您的示例中为AES-256-CBC)使用DEK加密数据,有时根据模式随机IV/nonce(CBC使用IV);还取决于模式,这可以另外产生认证标签(CBC不)
加密步骤1和2可以按任意顺序完成,但我相信这种顺序更常见,它肯定是OpenSSL中使用的顺序(
SealInit
执行0和1,SealUpdate
和SealFinal
一起执行2)。解密需要步骤1和步骤2生成的所有2-4个数据项:RSA加密-DEK、IV(如果适用)、加密数据和标签(如果适用)。在真实的系统中,存在将这些数据项打包的数据结构,以及附加的元数据:维基百科提到PKCS 7(现在被CMS及其变体SMIME取代)和PGP;还有JOSE/JWE、XMLenc等。解密同样需要 * 两个步骤 *:
1.使用RSA和本地已知的私钥解密传输的加密DEK
1.使用相同的对称算法、解密的DEK、如果适用的话发送的IV/nonce以及如果适用的话发送的标签来解密发送的加密数据
(and这一次你必须按这个顺序做)。
但是,要使用OpenSSL命令行 * 解密 *,您需要将这些项放在单独的文件中(除了用于身份验证模式的标记,
enc
命令行根本无法处理)。因此,我修改了你的程序,将加密的DEK,IV和密文写入3个文件,并稍微重构以减少混乱,更改文件名以避免冲突,并添加最小的错误处理:字符串
在运行这个之后,我有:
型