【发布时间】:2017-01-25 14:32:30
【问题描述】:
我们正在使用另一家公司的 API。
在那个 API 中,我应该使用 RSACryptoServiceProvider 生成一个密钥对并发送公钥,以便他们可以为我们加密数据。
这不是问题。在他们的 API 中 - 公钥是 byte[] 类型。
所以我想这样做:
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(1024);
var pubKey = rsa.ToXmlString(false); //only public
然后,将其表示为byte[]:
var ValuetoSend = Encoding.UTF8.GetBytes(pubKey);
并发送该值。
但他们回应了:
“您应该只向我们提供
RSAKeyInfo中的Modulus属性 信息”
所以我想知道,这可能吗?他们可以只使用 Modulus 加密数据吗?
所以我创建了一个测试:(请注意My Code 和Their code)
//My Code
byte[] data_clear = UTF8Encoding.UTF8.GetBytes("hellowא");
var rsa = new RSACryptoServiceProvider(1024);
var MyModulus = rsa.ExportParameters(true).Modulus;
//Their code ( I assume , If they only want MyModulus)
var rsa2 = new RSACryptoServiceProvider(1024);
var rsa2Params = rsa2.ExportParameters(true);
rsa2Params.Modulus=MyModulus; //they set their Modulus to MY Modulus
byte[] enc_data = rsa2.Encrypt(data_clear, true);
// Back to my code
var g=Encoding.UTF8.GetString( rsa.Decrypt(enc_data, true));
Console.WriteLine(g);
结果: 例外:
解码 OAEP 填充时发生 CryptographicException 错误。
问题
1) 他们是否可以仅使用 Modulus 进行加密?
2) 如果是这样,我的测试出了什么问题,我该如何解决。
编辑 - 即使我添加了 exponenet ,它也会失败:
//My Code
byte[] data_clear = UTF8Encoding.UTF8.GetBytes("hellowא");
var rsa = new RSACryptoServiceProvider(1024);
var MyModulus = rsa.ExportParameters(true).Modulus;
var MyExponent = rsa.ExportParameters(true).Exponent;
//Their code ( I assume , If they only want MyModulus)
var rsa2 = new RSACryptoServiceProvider(1024);
var rsa2Params = rsa2.ExportParameters(true);
rsa2Params.Modulus=MyModulus; //they set their Modulus to MY Modulus
rsa2Params.Exponent=MyExponent; //they set their Modulus to MY Modulus
byte[] enc_data = rsa2.Encrypt(data_clear, true);
// Back to my code
var g=Encoding.UTF8.GetString( rsa.Decrypt(enc_data, true));
Console.WriteLine(g);
//CryptographicException Error occurred while decoding OAEP padding.
【问题讨论】:
-
我认为他们需要模数和指数。这里有些东西似乎很狡猾。
-
@EricLippert 你好,埃里克。即使我提供指数,it failes
-
模数类型是密钥的公共部分(私钥=所有因素分开),但没有指数就没有用,不是吗?
-
@ManfredRadlwimmer 对他们来说没用是的 - 但他们不需要解密(我应该这样做)。我确实有私钥。但这不是我的问题。如您所见,即使我有私钥和公钥,它也无法解密数据(仅当他们使用模块时)。
-
正如@EricLippert 所说,您需要模数和指数。这样做的原因是几乎所有 RSA 密钥都使用 F4 (0x010001) 的固定指数。随着您执行 ExportParameters,覆盖 Modulus,然后执行 ImportParameters,您只是保留了现有的 Exponent 值,这可能是他们在接收端所做的事情。公钥操作是
paddedMessage^Exponent % Modulus,所以肯定需要指数:)。
标签: c# encryption rsa .net-4.6 rsacryptoserviceprovider