• AES 可逆性加密算法


    AES 可逆性加密算法

    package com.lock.demo.service;
     
    import sun.misc.BASE64Decoder;
    import sun.misc.BASE64Encoder;
     
    import javax.crypto.Cipher;
    import javax.crypto.spec.IvParameterSpec;
    import javax.crypto.spec.SecretKeySpec;
     
    /**
     * @author niunafei
     * @function
     * @email niunafei0315@163.com
     * @date 2018/12/12  下午2:32
     */
    public class AESUtils {
     
        private static final String AES="AES";
        private static final String CHAR_SET_NAME1="UTF-8";
        private static final String CHAR_SET_NAME2="ASCII";
        private static final String CIPHER_KEY="AES/CBC/PKCS5Padding";
     
        /**
         * 加密用的Key 可以用26个字母和数字组成 此处使用AES-128-CBC加密模式,key需要为16位。
         */
        private static final String IV_PARAMETER="a0.l954b_107x90l";
        /**
         * 可以用26个字母和数字组成 此处使用AES-128-CBC加密模式,需要为16位。
         */
        private static final String S_KEY="ax7x90.3k_10li5u";
     
     
        /**
         * 加密
         * @param param
         * @return
         * @throws Exception
         */
        public static String encryption(String param) throws Exception {
                Cipher cipher= Cipher.getInstance(CIPHER_KEY);
                SecretKeySpec skeySpec = new SecretKeySpec(S_KEY.getBytes(), AES);
                // 使用CBC模式,需要一个向量iv,可增加加密算法的强度
                IvParameterSpec iv = new IvParameterSpec(IV_PARAMETER.getBytes());
                cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);
            // 此处使用BASE64做转码。
            return new BASE64Encoder().encode(cipher.doFinal(param.getBytes(CHAR_SET_NAME1)));
     
        }
     
        /**
         *  解密
         * @param value
         * @return
         * @throws Exception
         */
        public static String decrypt(String value) throws Exception {
                SecretKeySpec skeySpec = new SecretKeySpec(S_KEY.getBytes(CHAR_SET_NAME2), AES);
                Cipher cipher = Cipher.getInstance(CIPHER_KEY);
                IvParameterSpec iv = new IvParameterSpec(IV_PARAMETER.getBytes());
                cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);
                // 先用base64解密
                return new String(cipher.doFinal(new BASE64Decoder().decodeBuffer(value)), CHAR_SET_NAME1);
        }
     
     
        /**
         测试
         */
        public static void main(String[] args) throws Exception {
            String key="123";
            System.out.println("key="+key);
            //输出 key=123
            String value=AESUtils.encryption(key);
            System.out.println("encryption value="+value);
            //输出 encryption value=OTslJ40Fa9a7ImOmCbmLPw==
            System.out.println("decrypt key="+AESUtils.decrypt(value));
            //输出 decrypt key=123
     
        }
    }

    加密结果适用于url参数么?

    URLEncoder.encode();
    URLDecoder.decode() 进行转码即可

    url出现了有+,空格,/,?,%,#,&,=等特殊符号的时候,可能在服务器端无法获得正确的参数值,如何是好?
    解决办法
    将这些字符转化成服务器可以识别的字符,对应关系如下:
    URL字符转义

    用其它字符替代吧,或用全角的。

    +    URL 中+号表示空格                            %2B   
    空格 URL中的空格可以用+号或者编码           %20 
    /     分隔目录和子目录                              %2F     
    ?     分隔实际的URL和参数                         %3F     
    %    指定特殊字符                                   %25     
    #    表示书签                                         %23     
    &    URL 中指定的参数间的分隔符                %26     
    =    URL 中指定参数的值                           %3D

  • 相关阅读:
    Python range() 函数用法
    python测试框架&&数据生成&&工具最全资源汇总
    为什么你写的用例测不出Bug来?
    软件测试人员必备知识工具清单
    接口测试需要验证数据库么?
    如何在实际工作做开展性能测试?
    为什么要做接口测试?
    面试时让你说一个印象最深的bug,该怎么回答
    maven一键部署tomcat war包(转载)
    数据库中 显示 小计 与 总计
  • 原文地址:https://www.cnblogs.com/lizm166/p/12193254.html
Copyright © 2020-2023  润新知