| 
 
TA的每日心情|  | 衰 前天 08:58
 | 
|---|
 签到天数: 1021 天 [LV.10]以坛为家III | 
 
| 对称加密: 
 将要保护的数据用某种算法进行处理,处理后的数据成为密文。
 加密算法公开,但是密钥不公开,密钥可以理解为开锁的数字密码,不知道密码就无法进行解密数据。目前常用的对称加密算法有AES。
 且AES有AES-128、AES-256标准。
 简单来讲就是密钥长度的不一样,AES-128采用16字节的密钥。AES-256采用32字节的密钥更安全。
 
 
 让我们来看下加密代码实例
 
 复制代码
        // 偏移量(可自定义)
        public static final String VIPARA = "0123456789123456"; // AES 为16bytes. DES 为8bytes
        // 编码方式
        public static final String CODE_TYPE = "UTF-8";
        // 填充类型
        public static final String AES_TYPE = "AES/ECB/PKCS5Padding";
        // 密钥(可自定义)
        private static final String AES_KEY = "abcdabcdabcdabcd";
        // AES固定格式为128/192/256bits.即:16/24/32bytes。DES固定格式为128bits,即8bytes。
        /**
         * 加密
         *
         * @param cleartext
         * @return
         */
        public static String encrypt(String cleartext) {
                try {
                        IvParameterSpec zeroIv = new IvParameterSpec(VIPARA.getBytes());
                        // 两个参数,第一个为密钥字节数组, 第二个为加密方式 AES
                        SecretKeySpec key = new SecretKeySpec(AES_KEY.getBytes(), "AES");
                        // 实例化加密类,参数为加密方式,要写全
                        Cipher cipher = Cipher.getInstance(AES_TYPE); // PKCS5Padding比PKCS7Padding效率高,PKCS7Padding可支持IOS加解密
                        // 加密时使用:ENCRYPT_MODE; 解密时使用:DECRYPT_MODE;
                        cipher.init(Cipher.ENCRYPT_MODE, key); // CBC类型的可以在第三个参数传递偏移量zeroIv,ECB没有偏移量
                        // 加密操作,返回加密后的字节数组,然后需要编码。主要编解码方式有Base64, HEX, UUE,7bit等等。此处看服务器需要什么编码方式
                        byte[] encryptedData = cipher.doFinal(cleartext.getBytes(CODE_TYPE));
                        return new BASE64Encoder().encode(encryptedData);
                } catch (Exception e) {
                        e.printStackTrace();
                        return "";
                }
        }
        /**
         * 解密
         *
         * @param encrypted
         * @return
         */
        public static String decrypt(String encrypted) {
                try {
                        byte[] byteMi = new BASE64Decoder().decodeBuffer(encrypted);
                        SecretKeySpec key = new SecretKeySpec(AES_KEY.getBytes(), "AES");
                        Cipher cipher = Cipher.getInstance(AES_TYPE);
                        // 与加密时不同MODE:Cipher.DECRYPT_MODE
                        cipher.init(Cipher.DECRYPT_MODE, key); // CBC类型的可以在第三个参数传递偏移量zeroIv,ECB没有偏移量
                        byte[] decryptedData = cipher.doFinal(byteMi);
                        return new String(decryptedData, CODE_TYPE);
                } catch (Exception e) {
                        e.printStackTrace();
                        return "";
                }
        }
 复制代码public static void main(String[] args) throws Exception {
                String content = "123456";
                test(content);
        }
        public static void test(String content) throws UnsupportedEncodingException {
                System.out.println("加密内容:" + content);
                // 字节数
                int num = content.getBytes(CODE_TYPE).length;
                System.out.println("加密内容字节数: " + num);
                // 加密
                String encryptResult = encrypt(content);
                content = new String(encryptResult);
                System.out.println("加密后:" + content);
                // 解密
                String decryptResult = decrypt(encryptResult);
                content = new String(decryptResult);
                System.out.println("解密完成后:" + content);
        }
 
 控制台输出:
 加密内容:123456
 加密内容字节数: 6
 加密后:W9291IebiZmw394ohe0Qiw==
 解密完成后:123456
 
 关于AES常见的使用场景:
 如Http Living Streaming 简称HLS,目前诸多网站采用这种协议进行在线视频播放。
 | 
 |