我必须在每次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#中找不到类似的东西。
答案 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。