带原始密钥的 RSA 密码学,c#

RSA Cryptography with raw keys, c#

我得到了一个 256 字节的模数 ('n'),一个 256 字节的私有指数 ('d') 和一个 3 字节的 {1,0,1} public 指数('e')。我正在尝试对 32 字节的数据进行签名。

我已经尝试创建一个新的 RSAParameters。

byte[] n = new byte[256]; //populated in my code 
byte[] d = new byte[256]; //populated in my code
byte[] e = new byte[]{1,0,1}; 
byte[] junkData = new byte[32]; //populated in my code

RSAParameters rsaParam = new RSAParameters();
rsaParam.Modulus = n;
rsaParam.Exponent = e;
rsaParam.D = d;

然后我创建一个 RSACrytoServiceProvider,将参数导入其中,并尝试对数据进行签名。

var csp = new RSACryptoServiceProvider(2048);
csp.ImportParameters(rsaParam);
csp.SignData(junkData, new SHA1CryptoServiceProvider());

问题是 RSACryptoServiceProvider 似乎只有 public,当我尝试签名时收到 'Keyset does not exist' 密码异常。

我是否还需要 P 和 Q 元素才能正确签署数据,或者我是否在做一些明显错误的事情?感谢您的帮助!

我很惊讶 ImportParameters 没有抛出错误(您使用的是 Mono 吗?)。

RSACryptoServiceProvider(以及 .NET Framework 和 .NET Core 中的所有 RSA 实现)需要一个完全填充的 RSAParameters 结构用于私钥。

给出了更详细的答案。