RSA关于加密长度限制的解决办法


RSA关于加密长度限制的解决办法
 
因为rsa采用分块进行加密的,所以有长度限制.如果加密信息较多,可分段加解密(不建议对大量信息rsa加密,效率低效):
正常加密情形如下:
      public  static  String encrypt(String  source , String  publicKey )
                  throws  Exception {
           Key  key  getPublicKey( publicKey );
             /** 得到Cipher对象来实现对源数据的RSA加密 */
           Cipher  cipher  = Cipher.getInstance( "RSA/ECB/PKCS1Padding" );
             cipher .init(Cipher.  ENCRYPT_MODE ,  key );
             byte []  b  =  source .getBytes();
             /** 执行加密操作 */
             byte []  b1  =  cipher .doFinal(  b );
             return  new  String(Base64. encodeBase64( b1 ), "UTF-8" );
     }
 
分段加密如下:
   public  static  byte [] encryptByPublicKey(  byte []  data , String  publicKeyStr )  throws  Exception
    {
        PublicKey  publicKey  = RSAEncrypt.loadPublicKeyByStr( publicKeyStr );
        Cipher  cipher  =  null ;
         // 使用默认RSA
         cipher  = Cipher.getInstance( "RSA"  );
         cipher .init(Cipher. ENCRYPT_MODE ,  publicKey );
         int  inputLen  =  data . length ;
        ByteArrayOutputStream  out  =  new  ByteArrayOutputStream();
         int  offSet  = 0;
         byte []  cache ;
         int  i  = 0;
         // 对数据分段加密
         while  ( inputLen  -  offSet  > 0)
        {
             if  (  inputLen  -  offSet  >  MAX_ENCRYPT_BLOCK )
            {
                 cache  =  cipher .doFinal(  data ,  offSet ,  MAX_ENCRYPT_BLOCK );
            }
             else
            {
                 cache  =  cipher .doFinal(  data ,  offSet ,  inputLen  -  offSet );
            }
             out .write(  cache , 0,  cache .  length );
             i ++;
             offSet  =  i  *  MAX_ENCRYPT_BLOCK ;
        }
         byte []  encryptedData  =  out .toByteArray();
         out .close();
         return  encryptedData ;
    }
即把超过117(加密)和128(解密)长度的原文内容分割成多个部分,依次加解密,再合并.
参考下面文件
 
ApiAbstractResource.java


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM