使用Ruby的OpenSSL库时,当我try 将消息作为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包含一些crypted没有的\r个字符.我能为此做些什么呢?

(我是在Linux上这样做的,以防出现CRLF和LF的问题.)

推荐答案

您应该向PKCS7.sign()提供PKCS7_BINARY标志,可能是OpenSSL::PKCS7::BINARY.我根本不了解Ruby,但读了docs at ruby-doc.orgopenssl man pages后,我相信这就是问题所在.

摘自PKCS7的OpenSSL手册页(我稍作更正):

通常,提供的内容会被翻译成MIME规范格式 (根据S/MIME规范的要求),但如果将PKCS7_BINARY设置为NO 翻译就发生了.如果提供的数据是 二进制格式,否则翻译会损坏它.

由于您对OpenSSL::PKCS7.sign(...)的输入是来自OpenSSL::PKCS7.encrypt(...)的DER编码输出,因此这基本上是二进制格式,而不是文本.

Ruby相关问答推荐

在 Ruby 中,如何从派生类中重写同一方法的不同方法调用基类方法?

如何在Ruby中匹配大型IP网络对象列表中的IP地址

为什么我的二维 Ruby 数组的多个值会发生变化,尽管只更改了其中一个?

为什么 slurping文件不是一个好习惯?

Ruby:p *1..10中的星号是什么意思

在 Ruby 中生成一个后台进程

RSpec 是否有可能期望在两个表中发生变化?

如何使用 if..else 块的结果分配变量?

在 Ubuntu 上安装 Ruby 1.9.1?

来自 Linux 上的命令队列的并行处理(bash、python、ruby ......随便)

如何通过一组新的给定键更改哈希的所有键

如何从 SystemStackError 中获取回溯:堆栈级别太深?

在命名包含多个单词的Ruby 时,是否应该使用破折号或下划线?

Ruby 方法to_sym有什么作用?

如何在 Ruby 中编写复杂的多行 if 条件?

将整个文本文件作为单个字符串读取的合理方法是什么?

Ruby:使用 ENV 变量(如果存在)的最简洁方法,否则使用默认值

如何在 Ruby 中创建整数循环?

如何编写启动 tmux 会话的 shell 脚本,然后运行 ​​ruby​​ 脚本

如何在 Rails 应用程序中使用 httparty 的基本身份验证?