在C#中重现Ruby OpenSSL private_encrypt输出

One*_*HOT 6 c# ruby encryption openssl rsa

我有一个简单的Ruby脚本,用于在某些HTTP头上执行private_encrypt以签署要发送到ruby REST API的Web请求,API根据它生成的Base64编码字符串测试Base64编码的字符串,而不是解码Base64并解密数据然后测试原始字符串.

我正在使用的脚本是

require "openssl"
require "base64"

path_to_cert = ARGV[0].dup

plain_text = Base64.decode64(ARGV[1].dup)

private_key = OpenSSL::PKey::RSA.new(File.read(path_to_cert))

puts Base64.encode64(private_key.private_encrypt(plain_text))
Run Code Online (Sandbox Code Playgroud)

输入是Base64编码的事实纯粹是由于输入参数中的换行符和空格.

要使用这个,我不得不使用System.Diagnostics.Process shell并发布ruby并捕获StdOut,虽然这不是一个主要的问题,并且工作我想删除对ruby的依赖但我无法重现输出使用C#RsaCryptoServiceProvider.

如果我Base64使用ruby编码"SimpleString"的private_encrypt结果我一直得到

auReJzoPSW3AhzsfT3EH4rD7lc4y2CJ026xIOiV6kjl2OKIj8GnzrPosoJDg \nSHrvLVKrSxYlegYgJRMx + vaAHSAm7RXrZh5An2SnVuO3qITa2TJ78hTc3bAw \nCDm4i9/4qictjxEFfnPRe6 EYCa4b3dnM5moa1eo9zbQPBa1eS6ItRCX4C0G0 \n1tJpQsEvuums363eAhTUAYa6yEWuINLPmE0USW6jfFNnsxw8Nv9SnC + ziomb\N/mwlt9dS5/mzKM8yFMH6hdQYLoqc0QpjT + xaZ1ZyJ6dG5MVG h3JtjIVRTOSd\N + PUU/BO + obEHbrftG8u2uJImLSA +/1e8aapHaa3WNg ==

使用.Net时

RsaCryptoServiceProvider.Encrypt("SimpleString", false) 
Run Code Online (Sandbox Code Playgroud)

由于使用公钥加密,结果始终是不同的输出.

我也试过了

RsaCryptoServiceProvider.SignData
Run Code Online (Sandbox Code Playgroud)

虽然这总是产生相同的结果,但它与红宝石的结果不同.

我可以直接从.Net使用一些CryptoAPI,这样我可以获得与Ruby相同的结果吗?

小智 -1

您可以使用私钥进行加密。

这里至少有一个这样做的例子:

http://www.csharpbydesign.com/2008/04/asymmetry-key-encryption-with.html

请注意在进行加密时使用 PrivateKey 属性(尽管本文引用了解密,但您也可以对加密执行相同的操作)