RSA - 仅使用(!)模数加密?

时间:2017-01-25 14:32:30

标签: c# encryption rsa .net-4.6 rsacryptoserviceprovider

我们正在使用其他公司的API 在该API中,我应该使用RSACryptoServiceProvider生成密钥对并发送公钥,以便他们可以为我们加密数据。

这不是问题。在他们的API中 - 公钥是byte[]类型。

所以我想做类似的事情:

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(1024);
var pubKey = rsa.ToXmlString(false); //only public

然后,将其表示为byte[]

var ValuetoSend = Encoding.UTF8.GetBytes(pubKey);

发送该值。

但他们回答说:

  

“您只应向我们提供Modulus中的RSAKeyInfo媒体资源   信息“

所以我想知道,有可能吗?他们可以仅使用模数加密数据吗?

所以我创建了一个测试:(请注意My CodeTheir 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解码OAEP填充时发生错误。

问题

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.

2 个答案:

答案 0 :(得分:0)

好的,这就是事情。

似乎在最后一行设置新值:

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)。这就是他们加密的原因

无论如何现在一切正常:

enter image description here

答案 1 :(得分:0)

1)模数和指数是加密所必需的。此外,用于查找相应的私钥进行解密。

2)您没有在RSACryptoServiceProvider中设置私钥,因此您无法解密字节数组。