【问题标题】:.NET RSA encryption not working with OpenSSL.NET RSA 加密不适用于 OpenSSL
【发布时间】:2018-11-29 03:42:22
【问题描述】:

我在https://github.com/eastwood/dotnet-rsa-encryption 创建了一个演示仓库。来自 README,其中包含问题陈述。

RSA 加密问题

我生成了一个随机的 RSA 密钥对。这是使用:

openssl genrsa -out test-key.pem 4096
openssl rsa -in key.pem -pubout > test-key-public.key

下面概述了问题,我根本无法为 .NET Core 找到可行的解决方案。

先决条件

  1. dotnet 核心
  2. 节点js
  3. openssl

命令在 osx 上运行,但希望也适用于 windows + linux。

打开 SSL CLI

$ cat run-cli.sh`

echo "Encrypting the following text: 4111111111111"
echo "411111111111" | openssl rsautl -encrypt -oaep -pubin -inkey certs/test-key-public.key | base64 | cat > cli-encrypted.txt
cat cli-encrypted.txt | base64 --decode | openssl rsautl -decrypt -oaep -inkey certs/test-key.pem

这完全符合预期。

节点

节点也可以正常工作。样机是here

您可以通过以下方式运行:

npm i
npm run start && ./run-node.sh`

.NET 核心

.NET 不工作:(

class Program
  {
    static void Main()
    {
      using (var rsa = new RSACryptoServiceProvider())
      {
        var publicKey = "<snipped>";
        var data = "411111111111";
        var rsaKeyInfo = rsa.ExportParameters(false);
        var byteArray = Convert.FromBase64String(publicKey);
        rsaKeyInfo.Modulus = byteArray;
        rsa.ImportParameters(rsaKeyInfo);
        var result = rsa.Encrypt(Encoding.UTF8.GetBytes(data), true);
        var encrypted = Convert.ToBase64String(result);
        Console.WriteLine(encrypted);
        System.IO.File.WriteAllText(@"dotnet-encrypted.txt", encrypted);
      }
    }
  }

dotnet run &amp;&amp; ./run-dotnet.sh

问题本质上在于我的 .NET(我使用的是 dotnet 核心)实现,因此我能够导入 4096 位 RSA 公钥并正确加密数据。但是,在使用 OpenSSL 解密时,我遇到了失败:

140735518716872:error:0406506C:rsa routines:RSA_EAY_PRIVATE_DECRYPT:data 大于 mod len:/BuildRoot/Library/Caches/com.apple.xbs/Sources/libressl/libressl-22.50.2/libressl/crypto/rsa/rsa_eay .c:515

尝试

我试过了:

  • 更改编码类型
  • OAEP 填充
  • 删除 BOM
  • 反转字节顺序

我希望有一些 .NET / RSA 专家之前遇到过这个问题并提出解决方案

干杯,

C.

【问题讨论】:

  • 看来我现在有了一个可行的实现。用详细信息更新了 git repo。只需使用 BouncyCastle 之类的工具从 PEM 文件中提取正确的模数并进行相应处理。
  • 很好,你已经让它工作了,虽然你当然可以在不涉及 Bouncy 的情况下让它工作。您没有正确处理公钥(密钥不仅仅是一个模数)并且您的 Encrypt 函数使用 true 表示 OAEP 加密而不是上述代码中的 PKCS#1 加密。请说明此问题是否仍然有效,否则您可能需要自行回答或完全删除它。

标签: .net ssl encryption openssl rsa


【解决方案1】:

最终实施了充气城堡,尽管正如 Maarten 指出的那样,可能有一个普通的解决方案可用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多