zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    VC CComboBox用法总结
    WideCharToMultiByte和MultiByteToWideChar函数的用法
    JavaScript
    标题:外星日历
    C语言顺序栈
    C语言循环队列
    每日一题
    标题:李白打酒
    标题:分数
    标题:复数幂
  • 原文地址:https://www.cnblogs.com/hupu-jr/p/7559879.html
Copyright © 2011-2022 走看看