使用OpenSSL进行PKCS7加密解密图片文件失败求助
PKCS7加密图片文件失败,解密后文件过小的问题
我用OpenSSL对图片文件做PKCS7加密解密操作,已准备好密钥对及自签名证书。小型文本文件的加密解密往返操作完全正常:
加密文本文件(使用证书)
openssl smime -encrypt -in data.txt -outform der -out data-encrypted.p7 self-signed-cert-cert.pem
解密(使用私钥)
openssl smime -decrypt -inform der -in data-encrypted.p7 -out data-decrypted.txt -inkey self-signed-cert-key.pem
解密后的data-decrypted.txt与原始data.txt完全一致。但对jpg图片执行相同操作时失败:
加密jpg(使用证书)
openssl smime -encrypt -in image.jpg -outform der -out image-encrypted.p7 self-signed-cert-cert.pem
解密(使用私钥)
openssl smime -decrypt -inform der -in image-encrypted.p7 -out image-decrypted.jpg -inkey self-signed-cert-key.pem
原始image.jpg大小为82KB,但解密后的image-decrypted.jpg体积极小。用OpenSSL检查image-encrypted.p7时,发现仅包含部分数据:
$ openssl pkcs7 -in image-encrypted.p7 -inform der -print PKCS7: type: pkcs7-envelopedData (1.2.840.113549.1.7.3) d.enveloped: version: 0 recipientinfo: version: 0 issuer_and_serial: issuer: C=AU, ST=Some-State, O=mbc-mls-for-xlp-1 serial: 0x012FFE04FE2573870D8B737E0D09C8B05233DB30 key_enc_algor: algorithm: rsaEncryption (1.2.840.113549.1.1.1) parameter: NULL enc_key: 0000 - 0d 3f 5f 0f 24 bd cf b3-27 d2 58 79 6c 52 36 .?_.$...'.XylR6 000f - c3 64 da c3 c0 23 65 df-d8 a5 e7 7e 4e ab a6 .d...#e....~N.. 001e - ea 3e cf ef 36 7f c8 30-d9 71 5f b7 e9 fb 7b .>..6..0.q_...{ 002d - d6 a4 c5 2d fb b1 c5 f3-09 a3 a4 97 5c fe f7 ...-........\.. 003c - b7 ab 20 84 1f 86 8a 24-63 7c 20 a7 83 62 43 .. ....$c| ..bC 004b - fb 5d 6b 85 d0 90 a0 a3-31 95 e3 91 89 0f 60 .]k.....1.....` 005a - b5 98 78 41 f0 f5 75 ce-fe d1 4b af 33 74 9e ..xA..u...K.3t. 0069 - 53 2a ba 60 85 cf 36 22-53 8f 4b 0d 72 27 38 S*.`..6"S.K.r'8 0078 - 0f 78 43 38 91 67 4c 44-63 28 05 f5 fc f9 8a .xC8.gLDc(..... 0087 - 76 db 1e f6 98 2a 4f c6-0b 86 30 66 1c 80 a2 v....*O...0f... 0096 - c5 05 30 e9 b4 5d 29 78-22 ca e8 d0 70 8e a1 ..0..])x"...p.. 00a5 - fe e5 6f 28 3e cc 87 b7-f0 ad f2 ef 31 66 b7 ..o(>.......1f. 00b4 - 18 e4 29 a7 45 94 f9 6d-27 47 e1 e0 b4 fa a9 ..).E..m'G..... 00c3 - a1 b7 2d 2d 60 00 86 4a-47 ba 36 2d b8 9e cd ..--`..JG.6-... 00d2 - c1 ba a7 ce 94 09 9a 9f-42 17 7d c9 07 af 97 ........B.}.... 00e1 - cf 75 07 19 77 01 4c ed-93 7e 81 24 ac f3 3f .u..w.L..~.$..? 00f0 - e2 6f fc 3c 21 a9 11 29-87 2b 79 30 c4 ff 59 .o.<!..).+y0..Y 00ff - 76 v enc_data: content_type: pkcs7-data (1.2.840.113549.1.7.1) algorithm: algorithm: des-ede3-cbc (1.2.840.113549.3.7) parameter: OCTET STRING: 0000 - 14 39 81 49 13 71 90 cd- .9.I.q.. enc_data: 0000 - c9 20 96 cf fd c2 0e 51-28 b7 51 4b 75 05 8d . .....Q(.QKu.. 000f - 19 15 ea f8 4c 01 49 43-ed fb eb 07 3b 75 68 ....L.IC....;uh 001e - 13 f9 1c 15 a7 45 c5 38-6f 3a .....E.8o: -----BEGIN PKCS7----- MIIB2QYJKoZIhvcNAQcDoIIByjCCAcYCAQAxggFyMIIBbgIBADBWMD4xCzAJBgNV BAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0YXRlMRowGAYDVQQKExFtYmMtbWxzLWZv ci14bHAtMQIUAS/+BP4lc4cNi3N+DQnIsFIz2zAwDQYJKoZIhvcNAQEBBQAEggEA DT9fDyS9z7Mn0lh5bFI2w2Taw8AjZd/Yped+Tqum6j7P7zZ/yDDZcV+36ft71qTF LfuxxfMJo6SXXP73t6sghB+GiiRjfCCng2JD+11rhdCQoKMxleORiQ9gtZh4QfD1 dc7+0UuvM3SeUyq6YIXPNiJTj0sNcic4D3hDOJFnTERjKAX1/PmKdtse9pgqT8YL hjBmHICixQUw6bRdKXgiyujQcI6h/uVvKD7Mh7fwrfLvMWa3GOQpp0WU+W0nR+Hg tPqpobctLWAAhkpHujYtuJ7NwbqnzpQJmp9CF33JB6+Xz3UHGXcBTO2TfoEkrPM/ 4m/8PCGpESmHK3kwxP9ZdjBLBgkqhkiG9w0BBwEwFAYIKoZIhvcNAwcECBQ5gUkT cZDNgCjJIJbP/cIOUSi3UUt1BY0ZFer4TAFJQ+376wc7dWgT+RwVp0XFOG86 -----END PKCS7-----
问题原因及解决方法
问题根源
OpenSSL的smime命令默认以文本模式处理输入文件,二进制文件(如JPG)中存在的EOF标记(ASCII值0x1A)会被识别为文件结束符,导致命令提前停止读取内容,最终仅加密了图片的开头部分,解密后文件自然极小。
解决步骤
处理二进制文件时,必须添加-binary参数,强制OpenSSL以二进制模式读取和写入文件,避免内容被截断。
修正后的加密命令:
openssl smime -encrypt -binary -in image.jpg -outform der -out image-encrypted.p7 self-signed-cert-cert.pem
修正后的解密命令:
openssl smime -decrypt -binary -inform der -in image-encrypted.p7 -out image-decrypted.jpg -inkey self-signed-cert-key.pem
执行上述命令后,解密后的image-decrypted.jpg大小应与原始图片一致,且可正常打开。
内容的提问来源于stack exchange,提问作者Stefan
相关产品推荐
相关产品推荐

