RSA - 仅使用(!)模数加密?
RSA - Encrypting using only(!) Modulus?
我们正在使用另一家公司的 API。
在那个 API 中,我应该使用 RSACryptoServiceProvider
生成一个密钥对并发送 public 密钥,以便他们可以为我们加密数据。
这不是问题。在他们的 API - public 键是 byte[]
类型。
所以我想做类似的事情:
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(1024);
var pubKey = rsa.ToXmlString(false); //only public
然后,将其表示为 byte[]
:
var ValuetoSend = Encoding.UTF8.GetBytes(pubKey);
并发送那个值。
但他们回应:
"You should only supply us the Modulus
property in the RSAKeyInfo
info"
所以我想知道,这可能吗?他们能否仅使用模数来加密数据?
所以我创建了一个测试:(请注意 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);
结果:
异常:
CryptographicException Error occurred while decoding OAEP padding.
问题
1) 他们是否可以仅使用模数进行加密?
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.
好的,事情就是这样。
似乎在最后一行设置了新值:
var rsa2 = new RSACryptoServiceProvider(2048);
var rsa2Params = rsa2.ExportParameters(false);
rsa2Params.Modulus=MyModulus; //they set their Modulus to MY Modulus
,对于 rsa2
对象来说并不是真正可见的,因为 RSAParameters 是一个结构。
所以我们需要rsa2
来导入那个结构。
我添加了这一行:
rsa2.ImportParameters(rsa2Params);
此外 - 肯定需要指数。那么,如果没有我为他们提供指数,它怎么能在他们这边工作呢?好吧,这是因为当今世界指数的默认值 (0x010001)。所以这就是他们可以加密的原因
无论如何现在一切正常:
1) 模数和指数是加密所必需的。还有,用来找对应的私钥解密。
2)您没有在RSACryptoServiceProvider中设置私钥,导致无法解密字节数组
我们正在使用另一家公司的 API。
在那个 API 中,我应该使用 RSACryptoServiceProvider
生成一个密钥对并发送 public 密钥,以便他们可以为我们加密数据。
这不是问题。在他们的 API - public 键是 byte[]
类型。
所以我想做类似的事情:
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(1024);
var pubKey = rsa.ToXmlString(false); //only public
然后,将其表示为 byte[]
:
var ValuetoSend = Encoding.UTF8.GetBytes(pubKey);
并发送那个值。
但他们回应:
"You should only supply us the
Modulus
property in theRSAKeyInfo
info"
所以我想知道,这可能吗?他们能否仅使用模数来加密数据?
所以我创建了一个测试:(请注意 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);
结果: 异常:
CryptographicException Error occurred while decoding OAEP padding.
问题
1) 他们是否可以仅使用模数进行加密?
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.
好的,事情就是这样。
似乎在最后一行设置了新值:
var rsa2 = new RSACryptoServiceProvider(2048);
var rsa2Params = rsa2.ExportParameters(false);
rsa2Params.Modulus=MyModulus; //they set their Modulus to MY Modulus
,对于 rsa2
对象来说并不是真正可见的,因为 RSAParameters 是一个结构。
所以我们需要rsa2
来导入那个结构。
我添加了这一行:
rsa2.ImportParameters(rsa2Params);
此外 - 肯定需要指数。那么,如果没有我为他们提供指数,它怎么能在他们这边工作呢?好吧,这是因为当今世界指数的默认值 (0x010001)。所以这就是他们可以加密的原因
无论如何现在一切正常:
1) 模数和指数是加密所必需的。还有,用来找对应的私钥解密。
2)您没有在RSACryptoServiceProvider中设置私钥,导致无法解密字节数组