在 Mono C# 中生成密钥对并使用此加密数据
Posted
技术标签:
【中文标题】在 Mono C# 中生成密钥对并使用此加密数据【英文标题】:Generating a key-pair and encrypt data with this in Mono C# 【发布时间】:2014-05-14 11:23:19 【问题描述】:我有 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 参数时收到异常“私钥/公钥不匹配”。
【问题讨论】:
提示:private const bool PKCS1_1_5_PADDING = false;
使代码在调用 Encrypt
时至少可读。
【参考方案1】:
只需将导出替换为创建一个新对象:
RSAParameters rsaPar = rsa.ExportParameters(false);
与
RSAParameters rsaPar = new RSAParameters();
这在 .net 中应该仍然很慢,但在单声道中应该很快,因为它会懒惰地创建密钥。
我也强烈建议使用 OAEP 填充而不是 PKCS#1v1.5 填充。后者具有可以在实践中利用的弱点,除非您仔细解决它们。所以使用rsa.Encrypt(data, true)
而不是rsa.Encrypt(data, false)
。
【讨论】:
【参考方案2】:我没有看到任何清除与生成密钥对相关的超时的明确方法。使用FromXMLString 可能会更好,因为我看不到任何其他方法可以生成RSAParameters
对象。
至于不匹配,这是意料之中的——私钥仍在其中。 Microsoft uses a second RSACryptoServiceProvider
(查看示例代码)来解决这个问题。
【讨论】:
在我看来,这个 API 的设计者需要好好踢。他们将算法与密钥、公钥和私钥、编码/解码等混合在一起。他们那里没有一个设计师在看到这种废话时会提高嗓门吗? 这种“高级”设计的另一个例子是 X509Certificate2 类及其 PrivateKey 成员,这使许多 .NET 开发人员相信签名是由证书创建的 :) 我认为有很多人这样做不喜欢这个 API,但遗憾的是它可能永远不会改变,因为他们希望保持向后兼容。以上是关于在 Mono C# 中生成密钥对并使用此加密数据的主要内容,如果未能解决你的问题,请参考以下文章