Ruby PKCS 7:添加的“\r”字节正在破坏解密

zpgglvta  于 2023-10-17  发布在  Ruby
关注(0)|答案(1)|浏览(112)

使用Ruby的OpenSSL库,当我尝试将消息加密和签名为PKCS7时,我发现插入了一些额外的\r字符,并且我无法解密消息。
下面我举一个玩具的例子。更详细的例子可以在this paste上找到。

# The sender encrypts the message
crypted = OpenSSL::PKCS7.encrypt([recipient_cert], "message").to_der
# The sender signs the message
signed = OpenSSL::PKCS7.sign(sender_cert, sender_key, crypted).to_der

# The recipient extracts data from the signed PKCS7
p7_signed = OpenSSL::PKCS7.new(signed)
store = OpenSSL::X509::Store.new
p7_signed.verify(nil, store, nil, OpenSSL::PKCS7::NOVERIFY)
unsigned = p7_signed.data

# The tries to decrypt the data
OpenSSL::PKCS7.new(unsigned).decrypt(recipient_key, recipient_cert)
# => ArgumentError: Could not parse the PKCS7: nested asn1 error

为什么从p7_signed中提取的数据与crypted中的数据不匹配?当我检查这两者时,我发现unsigned在这里和那里包含一些\r字符,而crypted没有。我该怎么办?
(我在Linux上这样做,以防出现CRLF与LF的问题。)

wwodge7n

wwodge7n1#

您应该将PKCS7_BINARY标志提供给PKCS7.sign(),可能以OpenSSL::PKCS7::BINARY的形式提供。我根本不了解Ruby,但是阅读docs at ruby-doc.orgopenssl man pages让我相信这就是问题所在。
来自PKCS 7的openssl手册页(我做了一个小的修改):
通常,提供的内容会被转换成MIME规范格式(S/MIME规范要求),但如果设置了PKCS7_BINARY,则不会发生转换。如果提供的数据是二进制格式,则应使用此选项,否则转换将损坏它。
由于OpenSSL::PKCS7.sign(...)的输入是OpenSSL::PKCS7.encrypt(...)的DER编码输出,因此它本质上是一种二进制格式,而不是文本。

相关问题