You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 02:40:57