<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    paulwong

    javax.crypto.IllegalBlockSizeException: Data must not be longer than 256 bytes 解決辦法

    如果用RSA加密數(shù)據(jù)的話,會有數(shù)據(jù)長度的要求,否則會拋異常:
    javax.crypto.IllegalBlockSizeException: Data must not be longer than 256 bytes

    推薦的做法:

    1. 隨機(jī)生成一個密鑰,用作對稱密鑰UUID
    2. 用此對稱密鑰,用對稱加密法AES加密數(shù)據(jù)
    3. 用RSA的公鑰加密此對稱密鑰
    4. 發(fā)送加密后的對稱密鑰和加密數(shù)據(jù)
    5. 用RSA私鑰解密加密后的對稱密鑰
    6. 用解密密后的對稱密鑰,解密數(shù)據(jù)
    7. 完成
    AESSecurityUtil.java
    import java.security.Key;
    import java.util.UUID;

    import javax.crypto.Cipher;
    import javax.crypto.spec.SecretKeySpec;

    import sun.misc.BASE64Decoder;
    import sun.misc.BASE64Encoder;

    public class AESSecurityUtil {

        // 加密算法
        /** 指定加密算法為RSA */
        private static final String ALGORITHM = "AES";

        // 加密密鑰
        
    // private static final byte[] keyValue = new byte[] { 'T', 'h', 'e',
        
    // 'B','e', 's', 't', 'S', 'e', 'c', 'r', 'e', 't', 'K', 'e', 'y' };
        
    // 16位的加密密鑰
    //    private byte[] keyValue;

        /**
         * 用來進(jìn)行加密的操作
         * 
         * 
    @param Data
         * 
    @return
         * 
    @throws Exception
         
    */
        public static String encrypt(String keyString, String data)
                throws Exception {
            Key key = generateKey(keyString);
            Cipher c = Cipher.getInstance(ALGORITHM);
            c.init(Cipher.ENCRYPT_MODE, key);
            byte[] encVal = c.doFinal(data.getBytes());
            String encryptedValue = new BASE64Encoder().encode(encVal);
            return encryptedValue;
        }

        /**
         * 用來進(jìn)行解密的操作
         * 
         * 
    @param encryptedData
         * 
    @return
         * 
    @throws Exception
         
    */
        public static String decrypt(String keyString, String encryptedData) throws Exception {
            Key key = generateKey(keyString);
            Cipher c = Cipher.getInstance(ALGORITHM);
            c.init(Cipher.DECRYPT_MODE, key);
            byte[] decordedValue = new BASE64Decoder().decodeBuffer(encryptedData);
            byte[] decValue = c.doFinal(decordedValue);
            String decryptedValue = new String(decValue);
            return decryptedValue;
        }
        
        public static String generateKeyString()
        {
            //必須長度為16
            return UUID.randomUUID().toString().replaceAll("-", "").substring(0, 16);
        }

        /**
         * 根據(jù)密鑰和算法生成Key
         * 
         * 
    @return
         * 
    @throws Exception
         
    */
        private static Key generateKey(String keyString) throws Exception {
            Key key = new SecretKeySpec(keyString.getBytes(), ALGORITHM);
            return key;
        }
        
        public static void main(String [] args) throws Exception
        {
            String keyString = generateKeyString();
    //        String keyString = "1234567890123456";
            System.out.println("密鑰:" + keyString);
            
            String source = "恭喜發(fā)財!";// 要加密的字符串
            System.out.println("準(zhǔn)備用密鑰加密的字符串為:" + source);
            
            String cryptograph = encrypt(keyString, source);// 生成的密文
            System.out.print("用密鑰加密后的結(jié)果為:" + cryptograph);
            System.out.println();

            String target = decrypt(keyString, cryptograph);// 解密密文
            System.out.println("用密鑰解密后的字符串為:" + target);
            System.out.println();
        }

    }


    CryptoUtil.java
    import com.tcl.project7.boss.common.crypto.CryptoData;
    import com.tcl.project7.boss.common.util.JsonManager;
    import com.tcl.project7.boss.common.util.file.FileUtil;
    import com.tcl.project7.boss.gameapplication.yearendactivities.bigwheelgame.player.valueobject.BigWheelGameRequest;

    public class CryptoUtil {
        
        public static CryptoData encrypt(String data) throws Exception
        {
            //1、產(chǎn)生AES密鑰
            String keyString = AESSecurityUtil.generateKeyString();
            
            //2、用AES法加密數(shù)據(jù)
            String cryptograph = AESSecurityUtil.encrypt(keyString, data);
            
            //3、用RSA加密AES密鑰
            String finalKey = RSASecurityUtil.encrypt(keyString);
    //        System.out.print("用RSA加密AES密鑰為:" + finalKey);
    //        System.out.print("加密數(shù)據(jù):" + cryptograph);
            
            CryptoData cryptoData = new CryptoData();
            cryptoData.setKey(finalKey);
            cryptoData.setContent(cryptograph);
            
            //4、返回數(shù)據(jù)
            return cryptoData;
        }
        
        public static String decrypt(String keyString, String data) throws Exception
        {
            //1、解密密鑰
            String decryptKeyString = RSASecurityUtil.decrypt(keyString);
            
            //2、解密內(nèi)容
            String decryptData = AESSecurityUtil.decrypt(decryptKeyString, data);
            
            //3、返回
            return decryptData;
            
        }
        
        public static void main(String [] args) throws Exception
        {
            String aFilePath = "DATA/TESTING-FILE/TOCRYPTO/tocrypto.txt";
            String source = FileUtil.getContents(aFilePath);
            
            CryptoData cryptoData = encrypt(source);
            System.out.print(cryptoData);
            
            String target = decrypt(cryptoData.getKey(), cryptoData.getContent());
            System.out.print(target);
            
            BigWheelGameRequest bigWheelGameRequest = JsonManager.getBean(target, BigWheelGameRequest.class);
            System.out.print(bigWheelGameRequest);
        }

    }


    CryptoData.java
    import java.io.Serializable;

    public class CryptoData implements Serializable{

        private static final long serialVersionUID = -4774469372648172844L;
        
        private String key;
        
        private String content;

        public String getKey() {
            return key;
        }

        public void setKey(String key) {
            this.key = key;
        }

        public String getContent() {
            return content;
        }

        public void setContent(String content) {
            this.content = content;
        }

        public String toString() {
            return "CryptoData [key=" + key + ", content=" + content + "]";
        }

    }

    posted on 2015-11-18 15:27 paulwong 閱讀(14661) 評論(0)  編輯  收藏 所屬分類: J2SE

    主站蜘蛛池模板: 爽爽爽爽爽爽爽成人免费观看| 亚洲JIZZJIZZ妇女| 欧洲人成在线免费| 久久久久久久亚洲精品| 免费看一级毛片在线观看精品视频 | 妞干网免费视频观看| 亚洲videos| 91手机看片国产永久免费| 亚洲第一成年人网站| 18成禁人视频免费网站| 亚洲精彩视频在线观看| 国产在线观看片a免费观看| 亚洲制服丝袜一区二区三区| 99久久99久久免费精品小说| 亚洲最新视频在线观看| 免费精品国产自产拍在 | 国内自产少妇自拍区免费| 亚洲中文无码mv| 无码专区一va亚洲v专区在线| 特级毛片aaaa级毛片免费| 亚洲av高清在线观看一区二区| 青青视频免费在线| 亚洲综合无码精品一区二区三区| 中文字幕无码毛片免费看| 久久亚洲精品国产精品| 成人免费激情视频| 2020久久精品亚洲热综合一本| 免费黄网在线观看| 香蕉视频在线免费看| 久久亚洲AV无码精品色午夜麻豆| 成年美女黄网站色大免费视频| 国产亚洲人成在线影院| 亚洲精品高清无码视频| 一色屋成人免费精品网站| 亚洲AV性色在线观看| 亚洲熟妇丰满多毛XXXX| 免费毛片a在线观看67194| 免费国产草莓视频在线观看黄| 亚洲Av永久无码精品三区在线| 国产免费不卡v片在线观看| 羞羞漫画在线成人漫画阅读免费|