在 C# 中对一个值进行 RSA 加密并在 openSSL 中解密它会给出消息太长

RSA encryption in C# of a value and decrypting it in openSSL gives message too long

我正在使用 RSA 在 C# 中加密字符串。在 python 中完成的相同存根有效,但是当使用 C# 对其进行加密时,我在解密 "message too large".

时遇到问题
    public static string RSAEncryptMessage(string msg)
    {
        var publicKeystr =
        "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAp+mrzAmFuuX1o2PZLA3C" +
        "/X3c4BTiHbjhR2mF8N5fha5WuiwxNJHtXbJXka4euzhnEdgp4+9zpc7mplgLAMDa" +
        "+BGKE7bjNrUmrckX2Aaaf+G1O1w1iU40+cTUm0NfZ6K0v4sLCpzqTnvjw5ilvliL" +
        "B5+6vHxvKMHlS6l/tdHgbelv1e7fZZeOVPczS5TDfTkJqMFIoI4KzzcH6Izsxu+H" +
        "EizWrT5zYkOCNLWQIpwcMq3h0EXc/qw7NAg/BRMg6HHVkbMNm3eTVzjDq3o77YKq" +
        "NHo2Plt2U9DeT5WcsEIslL7SjNV8ib0KVHMBaVQFu+5emsI3dn3VWEV5ZPkBngX2" +
        "NQIDAQAB";


        byte[] pubkeybytes = Convert.FromBase64String(publicKeystr);
        System.Security.Cryptography.RSACryptoServiceProvider rsa = new System.Security.Cryptography.RSACryptoServiceProvider();
        System.Security.Cryptography.RSAParameters rsaParam = rsa.ExportParameters(false);
        rsaParam.Modulus = pubkeybytes;
        rsa.ImportParameters(rsaParam);
        byte[] bytemsg = Encoding.ASCII.GetBytes(msg);
        Console.WriteLine(bytemsg.Length);
        byte[] encValue = rsa.Encrypt(bytemsg, false);
        Console.WriteLine(encValue.Length);
        return Convert.ToBase64String(encValue);



    }

我正在加密的消息是:

public static void Main()
{

    Console.WriteLine(RSAEncryptMessage("1234"));
    Console.ReadLine();

}

生成的密文大小为 294 字节。使用 openSSL 加密的相同密文只有 256 字节大小。 C# 正在做什么导致长度增加?这是一种不同类型的填充吗?

您的 publicKeystr 看起来是一个完整的 public 密钥(模数和指数),但是您正在使用它来设置 rsaParam.Modulus.

您需要从 public 密钥中提取模数和指数,然后使用它们分别设置 rsaParam.ModulusrsaParam.Exponent,或者将您的代码更改为能够处理完整的 public 密钥。

如果您按如下方式设置模数,它应该会给出您期望的结果。这里的模数和指数只是从原始 publicKeystr.

中提取的那些值
var modulus =
    "p+mrzAmFuuX1o2PZLA3C/X3c4BTiHbjhR2mF8N5fha5WuiwxNJHtXbJXka4euzhn" +
    "Edgp4+9zpc7mplgLAMDa+BGKE7bjNrUmrckX2Aaaf+G1O1w1iU40+cTUm0NfZ6K0" +
    "v4sLCpzqTnvjw5ilvliLB5+6vHxvKMHlS6l/tdHgbelv1e7fZZeOVPczS5TDfTkJ" +
    "qMFIoI4KzzcH6Izsxu+HEizWrT5zYkOCNLWQIpwcMq3h0EXc/qw7NAg/BRMg6HHV" +
    "kbMNm3eTVzjDq3o77YKqNHo2Plt2U9DeT5WcsEIslL7SjNV8ib0KVHMBaVQFu+5e" +
    "msI3dn3VWEV5ZPkBngX2NQ==";
var exponent = "AQAB";

rsaParam.Modulus = Convert.FromBase64String(modulus);
rsaParam.Exponent = Convert.FromBase64String(exponent);