使用.net恢复RSA签名数据

问题描述 投票:0回答:1

是否有 .net 等效方法来重现以下 openssl 命令:

openssl rsautl -verify -pubin -inkey public_key.pem -in signature.dat -out recovered_data.dat

这将验证签名并输出恢复的数据。我知道恢复数据可能是非常规的,但它包含来自其他系统的一些有用信息(不仅仅是消息的哈希/摘要)。

根据RSACryptoServiceProvider.VerifyDataRSA.VerifyData的.net文档,RSA函数无法恢复数据,只能验证签名。但也许有一种方法可以使用解密方法,就像这个答案提到的那样。

(注意:我不需要将恢复的数据保存到文件中,只需要从 RSA 方法返回)

c# .net openssl rsa
1个回答
0
投票

据我所知,

Decrypt()
方法专门用于常规解密,这需要私人密钥。另一种选择是 C#/BouncyCastle,它可以使用公钥对签名进行所需的解密。

在下面的示例中,

7E1D...
是 SHA256 哈希消息的 PKCS#1 v1.5 (RSASSA-PKCS1-v1_5) 兼容签名
The quick brown fox jumps over the lazy dog

解密后的明文
3031...
DigestInfo
值的 DER 编码,由摘要 OID 加上消息哈希组成(即
3031300D060960864801650304020105000420
表示 SHA-256 OID 加上
7D7809469CA9ABCB0082E4F8D5651E46D3CDB762D02D0BF37C9E592
表示 SHA-256 哈希)消息
The quick brown fox jumps over the lazy dog
):

using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Crypto.Encodings;
using Org.BouncyCastle.Crypto.Engines;
using Org.BouncyCastle.OpenSsl;
using System;
using System.IO;

...

string publicX509Pem = @"-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAunF5aDa6HCfLMMI/MZLT
5hDk304CU+ypFMFiBjowQdUMQKYHZ+fklB7GpLxCatxYJ/hZ7rjfHH3Klq20/Y1E
bYDRopyTSfkrTzPzwsX4Ur/l25CtdQldhHCTMgwf/Ev/buBNobfzdZE+Dhdv5lQw
KtjI43lDKvAi5kEet2TFwfJcJrBiRJeEcLfVgWTXGRQn7gngWKykUu5rS83eAU1x
H9FLojQfyia89/EykiOO7/3UWwd+MATZ9HLjSx2/Lf3g2jr81eifEmYDlri/OZp4
OhZu+0Bo1LXloCTe+vmIQ2YCX7EatUOuyQMt2Vwx4uV+d/A3DP6PtMGBKpF8St4i
GwIDAQAB
-----END PUBLIC KEY-----";
byte[] signature = Convert.FromHexString("7E1D55C85E0DC74D90E6D38E6336E7EC1B02E279B3AAA9A2B9F848425151D07CE68B59473B4D17D09132E99E918394F0A69906AA03303D6EE63D68ED8F5C5941764952499E165C4F04D5AEAAB4B2814207B51EC97F970C04F742DE109AF6A45166AADA2BC4A7D42E0E556DDE59D81C7256B307B60C3699775AACF4C4436CA519F2D2A2CF89A6337CB91D766572D78A93B83F03B1FD8AF73990C9AA40CEC827B4BE219146F98D60C486E038C1610DE75637E6D72D181A8D77C6009341D1B9F62E277488D20E020E1A267309DCC1BBC0A2C3DCA043EBC2F60F7CF52D331623FDFD7A180315AC33E8404648189C187358114508924B7E48D587BAD7968FF3142249");

// Import public X.509/SPKI key, PEM encoded
PemReader pemReader = new PemReader(new StringReader(publicX509Pem));
AsymmetricKeyParameter publicKeyParameter = (AsymmetricKeyParameter)pemReader.ReadObject();

// public decrypt
IAsymmetricBlockCipher cipher = new Pkcs1Encoding(new RsaEngine());
cipher.Init(false, publicKeyParameter);
byte[] decrypted = cipher.ProcessBlock(signature, 0, signature.Length);
Console.WriteLine(Convert.ToHexString(decrypted)); // 3031300D060960864801650304020105000420D7A8FBB307D7809469CA9ABCB0082E4F8D5651E46D3CDB762D02D0BF37C9E592
© www.soinside.com 2019 - 2024. All rights reserved.