在Mono c#中生成密钥对并加密数据
本文关键字:密钥对 加密 数据 Mono | 更新日期: 2023-09-27 18:03:13
我有RSA模数和指数,我想用这个组件生成一个公钥。然后我想用这个公钥加密一个数据。
所以我写了这个函数:
public static byte[] EncryptRSA(byte[] rsaModulus, byte[] exponent, byte[] data)
{
byte[] response = null;
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
RSAParameters rsaPar = rsa.ExportParameters(false);
rsaPar.Modulus = rsaModulus;
rsaPar.Exponent = exponent;
rsa.ImportParameters(rsaPar);
response = rsa.Encrypt(data, false);
return response;
}
但rsa。ExportParameters方法耗时较长。
public RSACryptoServiceProvider ()
: this (1024)
{
// Here it's not clear if we need to generate a keypair
// (note: MS implementation generates a keypair in this case).
// However we:
// (a) often use this constructor to import an existing keypair.
// (b) take a LOT of time to generate the RSA keypair
// So we'll generate the keypair only when (and if) it's being
// used (or exported). This should save us a lot of time (at
// least in the unit tests).
}
您可以看到ExportParameters()方法正在执行RSA密钥对生成,这是一个耗时的操作。
之后,我得到例外"私钥/公钥不匹配"在导入RSA参数。
直接用创建新对象替换导出:
RSAParameters rsaPar = rsa.ExportParameters(false);
RSAParameters rsaPar = new RSAParameters();
在。net中仍然会很慢,但在mono中应该会很快,因为它会惰性地创建键。
我还强烈建议使用OAEP填充代替pkcs# 1v1.5填充。后者有弱点,在实践中可以被利用,除非你仔细地处理它们。所以使用rsa.Encrypt(data, true)
而不是rsa.Encrypt(data, false)
我看不出有什么明确的方法可以消除与生成密钥对相关的超时。你可能最好使用FromXMLString,因为我没有看到任何方法来生成RSAParameters
对象的其他方式。
对于不匹配,这是意料之中的——私钥仍然在那里。Microsoft使用第二个RSACryptoServiceProvider
(检查示例代码)来解决这个问题。