在 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.Modulus
和 rsaParam.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);
我正在使用 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.Modulus
和 rsaParam.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);