如何使用私钥用rsa-sha256签名字符串?

时间:2020-07-10 06:46:23

标签: c# rsa

我必须在每次privateKey调用时使用由OpenSSL生成的API签名一个字符串,privateKey是从数据库接收的,并针对每个用户进行更改。

我已经读到我应该使用RSACryptoService并添加privateKey作为参数来实现此目的。但是我在ImportParameters

中收到错误“无效数据”

这是代码:

string privateKey = "-----BEGIN RSA PRIVATE KEY-----
    MIIJ....."

RSAParameters rsap = new RSAParameters
{
    Modulus = Encoding.ASCII.GetBytes(privateKey)
};
rsa.ImportParameters(rsap);
byte[] encryptedData = rsa.Encrypt(Encoding.UTF8.GetBytes(StringToSign), false);
string base64Encrypted = Convert.ToBase64String(encryptedData);

在该服务的文档中,要求使用RSA-SHA256对字符串进行签名。这是在Node.JS中对该字符串进行签名的代码:

const signature = crypto.createSign('RSA-SHA256').update(string).sign(privateKey, 'base64')

但是,我在c#中找不到类似的东西。

2 个答案:

答案 0 :(得分:2)

在@SmileDeveloper How to read a PEM RSA private key from .NET的链接答案中,已链接了OpenSSLKey的源代码,并且通过重用源代码中链接的一些函数,我设法使用我的PEM {{1 }}作为字符串来签署另一个字符串。

用于执行此操作的代码如下:

privateKey

这是上面使用的OpenSSLKey重用的所有功能:

    // encoding my privateKey from string to byte[] by using DecodeOpenSSLPrivateKey function from OpenSSLKey source code
         byte[] pemprivatekey = DecodeOpenSSLPrivateKey(privateKey); 

    // enconding my string to sign in byte[]
         byte[] byteSign = Encoding.ASCII.GetBytes(Sign); 

    // using DecodeRSAPrivateKey function from OpenSSLKey source code to get the RSACryptoServiceProvider with all needed parameters
          var rsa = DecodeRSAPrivateKey(pemprivatekey); 

    // Signing my string with previously get RSACryptoServiceProvider in SHA256
          var byteRSA = rsa.SignData(byteSign, CryptoConfig.MapNameToOID("SHA256"));
        
    // As required by docs converting the signed string to base64
          string Signature = Convert.ToBase64String(byteRSA);

答案 1 :(得分:1)

问题出在此代码上:

RSAParameters rsap = new RSAParameters
    {
        Modulus = Encoding.ASCII.GetBytes(privateKey)
    };

您正在读取privateKey作为编码为字符串的字节数组。但是您的私钥不是这种格式,而是PEM格式。检查以下答案:How to read a PEM RSA private key from .NET。用于读取C#中的PEM密钥。也许您也应该在pem字符串中解密base64。

相关问题