zoukankan      html  css  js  c++  java
  • openssl rsa java 大于117的长字符串加密

    package org.yood.rsa.util;
    
    import org.bouncycastle.asn1.ASN1Sequence;
    import org.bouncycastle.asn1.pkcs.RSAPrivateKeyStructure;
    
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.security.InvalidKeyException;
    import java.security.KeyFactory;
    import java.security.NoSuchAlgorithmException;
    import java.security.PrivateKey;
    import java.security.PublicKey;
    import java.security.spec.InvalidKeySpecException;
    import java.security.spec.RSAPrivateKeySpec;
    import java.security.spec.X509EncodedKeySpec;
    import java.util.Base64;
    import javax.crypto.BadPaddingException;
    import javax.crypto.Cipher;
    import javax.crypto.IllegalBlockSizeException;
    import javax.crypto.NoSuchPaddingException;
    
    
    public class BestRSA {
    
        public static String publicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC0kgVXWgRcOLyFbfHNKK55syz/" +
                "GhhMzGLPFj5AzczanP7NSCQEPPYhehMYhGUZI+Du8WS1yfOQ6SUYIYKZRuLUSSm4" +
                "ScsjhY+1LED9S+LDzDWCWnQah4Q4z0owNRySJqCSO4uA+ARg954n6kbXIg4hl2LM" +
                "UYelcocj1lBkymjGaQIDAQAB";
    
        public static String privateKey = "MIICXQIBAAKBgQC0kgVXWgRcOLyFbfHNKK55syz/GhhMzGLPFj5AzczanP7NSCQE" +
                "PPYhehMYhGUZI+Du8WS1yfOQ6SUYIYKZRuLUSSm4ScsjhY+1LED9S+LDzDWCWnQa" +
                "h4Q4z0owNRySJqCSO4uA+ARg954n6kbXIg4hl2LMUYelcocj1lBkymjGaQIDAQAB" +
                "AoGBAJftSCsv5P1HC29kiw8oDGz/EXvuE8YCLZy5xVU3EwZZE5Xa/drHA/w0vv5g" +
                "3sMhSe8hEbBWo+UoFPrRrxWR6+RwU0Mfrn9kAbSmmK5M8aoOG+fx/++mhmwH0fuN" +
                "BWcMZbcAti0n3DBFzhXjcmVqaSM9Z6eFREnX+d639cfwXEuRAkEAxlAY9wedTPdC" +
                "sTwtCpuPn5bNA+vBoTS+GcrEcP5H5ComWXxbPyvY8nCE1PCln/+FIddTo5TnDBAl" +
                "rondH3gS1QJBAOkYrmmChIYwAzRKjkaGRPyCJ+VLYIZ+yQis3udUDmOWxP3xKnBV" +
                "3j+BvD1GqhVBEHxPRBVWDKQ4+4AlWg2YZ0UCQQCoUQNfZ48S7Com07RG9JGKGiwX" +
                "z9mgQWu36Gmina/W8A9slCe+DjEsVGPpd/abPfx5JJFQnekcS/gvk8OiGf+hAkBU" +
                "XYKC3aJpjucZ/gIQtHgzjEg0TVvaUfkhErB6uYmbse4Km0bo8atHAQXIh9L3bl0x" +
                "IN9beZGJvrYIY3x8fzShAkADMutFaI6q6buVGkqGR6pNe6V1XDBdKPGvC5xhTgiS" +
                "3lTO5GjdHqW4+9SyR97USTyxRZXEWMSD/73ZQE592Mfy";
    
    
        private static String algorithm = "RSA";
        private static final int MAX_ENCRYPT_BLOCK = 117;
        private static final int MAX_DECRYPT_BLOCK = 128;
        private static String data = "1234561234561234561234561234561234561234561234561234561234561234561234561
    " +
                "2345612345612345612345612345612345612345612345612345612345612345612345612
    " +
                "4561234561234561234561234561234561234561234561234561234561234561234561234
    " +
                "5612345612345612345612345612345612345612345612345612345612345612345612345
    " +
                "6123456123456123456123456123456123456123456123456123456123456123456123456
    " +
                "1234561234561234561234561234561234561234561234561234561234561234561234561
    " +
                "2345612345612345612345612345612345612345612345612345612345612345612345612
    " +
                "3456123456123456123456123456123456123456123456123456123456123456123456123
    " +
                "4561234561234561234561234561234561234561234561234561234561234561234561234
    " +
                "5612345612345612345612345612345612345612345612345612345612345612345612345
    " +
                "6123456123456123456123456123456123456123456123456
    ";
    
        public static void main(String[] args) throws NoSuchAlgorithmException, InvalidKeySpecException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException, InvalidKeyException, IOException {
            String test = testEncrypt(privateKey, data);
            System.out.println(test);
            String testDecrypt = testDecrypt(publicKey, test);
            System.out.println(testDecrypt);
    
        }
    
    
        /**
         * 加密
         */
    
        public static String testEncrypt(String key, String data) throws NoSuchAlgorithmException, InvalidKeySpecException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException, InvalidKeyException, IOException {
            byte[] decode = Base64.getDecoder().decode(key);
            RSAPrivateKeyStructure asn1PrivKey = new RSAPrivateKeyStructure((ASN1Sequence) ASN1Sequence.fromByteArray(decode));
            RSAPrivateKeySpec rsaPrivKeySpec = new RSAPrivateKeySpec(asn1PrivKey.getModulus(), asn1PrivKey.getPrivateExponent());
            KeyFactory kf = KeyFactory.getInstance(algorithm);
            PrivateKey generatePrivate = kf.generatePrivate(rsaPrivKeySpec);
            Cipher ci = Cipher.getInstance(algorithm);
            ci.init(Cipher.ENCRYPT_MODE, generatePrivate);
    
            byte[] bytes = data.getBytes();
            int inputLen = bytes.length;
            int offLen = 0;//偏移量
            int i = 0;
            ByteArrayOutputStream bops = new ByteArrayOutputStream();
            while (inputLen - offLen > 0) {
                byte[] cache;
                if (inputLen - offLen > 117) {
                    cache = ci.doFinal(bytes, offLen, 117);
                } else {
                    cache = ci.doFinal(bytes, offLen, inputLen - offLen);
                }
                bops.write(cache);
                i++;
                offLen = 117 * i;
            }
            bops.close();
            byte[] encryptedData = bops.toByteArray();
            String encodeToString = Base64.getEncoder().encodeToString(encryptedData);
            return encodeToString;
        }
    
    
        /**
         * 解密
         */
        public static String testDecrypt(String key, String data) throws NoSuchAlgorithmException, InvalidKeyException, NoSuchPaddingException, InvalidKeySpecException, IllegalBlockSizeException, BadPaddingException, IOException {
            byte[] decode = Base64.getDecoder().decode(key);
    //		PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(decode); //java底层 RSA公钥只支持X509EncodedKeySpec这种格式
            X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(decode);
            KeyFactory kf = KeyFactory.getInstance(algorithm);
            PublicKey generatePublic = kf.generatePublic(x509EncodedKeySpec);
            Cipher ci = Cipher.getInstance(algorithm);
            ci.init(Cipher.DECRYPT_MODE, generatePublic);
    
            byte[] bytes = Base64.getDecoder().decode(data);
            int inputLen = bytes.length;
            int offLen = 0;
            int i = 0;
            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
            while (inputLen - offLen > 0) {
                byte[] cache;
                if (inputLen - offLen > 128) {
                    cache = ci.doFinal(bytes, offLen, 128);
                } else {
                    cache = ci.doFinal(bytes, offLen, inputLen - offLen);
                }
                byteArrayOutputStream.write(cache);
                i++;
                offLen = 128 * i;
            }
            byteArrayOutputStream.close();
            byte[] byteArray = byteArrayOutputStream.toByteArray();
            return new String(byteArray);
        }
    }
    

      

  • 相关阅读:
    移动端 (基于jquery的3个)touch插件
    leaflet开源地图库源码 浏览器&移动设备判断(browser.js)备份
    移动端 常见问题整理 iOS下的 Fixed + Input 调用键盘的时候fixed无效问题解决方案
    百度echarts扇形图每个区块增加点击事件
    js 性能优化整理之 缓存变量
    移动端 延迟加载echo.js的使用
    js 性能优化整理之 高频优化
    css整理 background-size优化
    原生js 样式的操作整理
    百度地图展示分公司信息 (针对电视机)
  • 原文地址:https://www.cnblogs.com/shenwenkai/p/10774037.html
Copyright © 2011-2022 走看看