AES/DES 可逆性加密算法 -- java工具類


package com.lock.demo.service;

import org.apache.tomcat.util.codec.binary.Base64;

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;

/**
 * @author niunafei
 * @function
 *         des 對稱性算法加密 解密工具類 可逆性算法
 * @email niunafei0315@163.com
 * @date 2018/12/12  下午2:05
 */
public class DesUtils {

    private static final String DES="DES";

    /**
     * 公鑰  8位以上
     */
    private static final String SECRET_KEY="12345678";

    /**
     * 獲取秘鑰對象
     * @return
     * @throws Exception
     */
    private static final SecretKey getSecretKeyFactory() throws Exception {
        SecretKeyFactory des = SecretKeyFactory.getInstance(DES);
        SecretKey secretKey = des.generateSecret(new DESKeySpec(SECRET_KEY.getBytes()));
        return secretKey;
    }

    /**
     * 加密
     * @param param
     * @return
     * @throws Exception
     */
    public static final String encryption(String param) throws Exception {
        Cipher cipher = Cipher.getInstance(DES);
        SecretKey secretKey = getSecretKeyFactory();
        cipher.init(Cipher.ENCRYPT_MODE, secretKey);
        return  new String(Base64.encodeBase64(cipher.doFinal(param.toString().getBytes())));
    }

    /**
     * 解密
     * @param value
     * @return
     * @throws Exception
     */
    public static final String decrypt(String value) throws Exception {
        Cipher cipher = Cipher.getInstance(DES);
        SecretKey secretKey = getSecretKeyFactory();
        cipher.init(Cipher.DECRYPT_MODE, secretKey);
        return new String(cipher.doFinal(Base64.decodeBase64(value.getBytes())));
    }

    /**
     測試
     */
    public static void main(String[] args) throws Exception {
        String key="123";
        System.out.println(" key="+key);
        //輸出 key=123
        String value=DesUtils.encryption(key);
        System.out.println("encryption value="+value);
        //輸出 encryption value=LDiFUdf0iew=
        System.out.println("decrypt key="+DesUtils.decrypt(value));
        //輸出 decrypt key=123

    }
}

 

以上為des 加密算法

 

以下為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

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM