.NET RSA加密不适用于OpenSSL

b1n*_*1nd 6 .net encryption ssl openssl rsa

我在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
Run Code Online (Sandbox Code Playgroud)

下面概述了问题,我根本无法获得.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
Run Code Online (Sandbox Code Playgroud)

这完全符合预期.

节点

节点也可以正常工作.样机在这里

你可以通过:

npm i
npm run start && ./run-node.sh`
Run Code Online (Sandbox Code Playgroud)

.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);
      }
    }
  }
Run Code Online (Sandbox Code Playgroud)

dotnet run && ./run-dotnet.sh

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

140735518716872:错误:0406506C:rsa例程:RSA_EAY_PRIVATE_DECRYPT:大于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.

b1n*_*1nd 0

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