在 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# 中生成密钥对并使用此加密数据的主要内容,如果未能解决你的问题,请参考以下文章

Linux中生成密钥的两种方法

在 powershell 中生成 RSA 密钥对

使用 HSM 的对称加密密钥

在 c# 中等效于在 c 编程中生成的要在 URL 查询字符串中发送的“Base64”编码的加密字节字符串

在 Ms. Access 中生成随机字母数字密钥

C#中生成MD5十六位密文方法 (转载)