在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参数。

在Mono c#中生成密钥对并加密数据

直接用创建新对象替换导出:

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(检查示例代码)来解决这个问题。