System.Security.Cryptography.CryptographicEx

系统 1762 0

在使用C#的不对称加密 RSACryptoServiceProvider 类的时候,会遇到异常:System.Security.Cryptography.CryptographicException: The data to be decrypted exceeds the maximum for this modulus of 128 bytes. 异常详细信息: System.Security.Cryptography.CryptographicException: 要解密的数据超过此模块的最大值 128 字节。 错误发生在 rsa.Decrypt 这一行。通常不对称加密的过程:1. A端数据用公钥加密,通过网络传输 2. B端用私钥解密这些数据。但.net中的rsa加密最多只能对117字节数据进行操作(128位减去随机数),导致128位数据不得不分两部分进行处理,于是加密数据不断膨胀。更多详细讨论参考 StackOverflow这 个帖子。

解决办法

在CodeProject上有一篇 文章 , 可以很好的解决这个问题,先下载BigInteger class。

RSAHelper
     public   static   class  RSAHelper
    {
         ///   <summary>
        
///  RSAs the encrypt.
        
///   </summary>
        
///   <param name="datatoencrypt"> The datatoencrypt. </param>
        
///   <param name="exponent"> The exponent. </param>
        
///   <param name="modulus"> The modulus. </param>
        
///   <returns></returns>
         public   static   byte [] RsaEncrypt( byte [] datatoencrypt,  byte [] exponent,  byte [] modulus)
        {
             var  original =  new  BigInteger(datatoencrypt);
             var  e =  new  BigInteger(exponent);
             var  n =  new  BigInteger(modulus);
             var  encrypted = original.modPow(e, n);
             return  HexstringTobyte(encrypted.ToHexString());
        }


         ///   <summary>
        
///  RSAs the decrypt.
        
///   </summary>
        
///   <param name="encrypteddata"> The encrypteddata. </param>
        
///   <param name="d"> The d. </param>
        
///   <param name="modulus"> The modulus. </param>
        
///   <returns></returns>
         public   static   byte [] RsaDecrypt( byte [] encrypteddata,  byte [] d,  byte [] modulus)
        {
             var  encrypted =  new  BigInteger(encrypteddata);
             var  dd =  new  BigInteger(d);
             var  n =  new  BigInteger(modulus);
             var  decrypted = encrypted.modPow(dd, n);
             return  HexstringTobyte(decrypted.ToHexString());
        }


         ///   <summary>
        
///  Generate random bytes with given length
        
///   </summary>
        
///   <param name="bytelength"></param>
        
///   <returns></returns>
         public   static   byte [] GenerateRandomBytes( int  bytelength)
        {
             var  buff =  new   byte [bytelength];
             var  rng =  new  RNGCryptoServiceProvider();

            rng.GetBytes(buff);
             return  buff;
        }

    }
Encrypt
// ENCRYPT WITH PUBLIC KEY
var  rsa =  new  RSACryptoServiceProvider();
rsa.ImportParameters(_publicKey  /* Type: RSAParameters */ );

byte [] encryptedData = RSAHelper.RsaEncrypt(Encoding.Unicode.GetBytes(stringDataToEncrypt  /* Type: string */ ), data.parameters.Exponent, data.parameters.Modulus);
return  Convert.ToBase64String(encryptedData);
Decrypt
  // Decrypt 
var  rsa =  new  RSACryptoServiceProvider();
// Import private key
rsa.ImportParameters(_privateKey  /*  Type: RSAParameters  */ );
byte [] encryptedData = RSAHelper.RsaDecrypt(Convert.FromBase64String(encryptedBase64String /*  Type: string, but base64 format  */ ), _privateKey.D, _privateKey.Modulus);
return  Encoding.Unicode.GetString(encryptedData);

更多讨论

更多详细讨论参考 StackOverflow这 个帖子。 

 

 

 

System.Security.Cryptography.CryptographicException: The data to be decrypted exceeds the maximum for this modulus of 128 bytes. (RSACryptoServiceProv


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论