ウィーチャットウィジェットAES復号化ツールクラス

5745 ワード

ウィーチャットウィジェットAES復号化
注:復号に使用するセッション_keyは、微信ユーザ情報を取得する前に取得する必要があります.そうしないと、復号化に失敗します.
  • encryptedData:復号化されたデータ
  • iv:オフセット
  • session_key:復号用key
  • package com.sy430.common.utils.security.mini;
    
    
    import org.apache.commons.codec.binary.Base64;
    import org.bouncycastle.jce.provider.BouncyCastleProvider;
    
    import javax.crypto.*;
    import javax.crypto.spec.IvParameterSpec;
    import javax.crypto.spec.SecretKeySpec;
    import java.io.UnsupportedEncodingException;
    import java.security.*;
    import java.security.spec.InvalidParameterSpecException;
    import java.util.Arrays;
    
    /**
     * Created by Yipw on 2018/8/8 0008.
     */
    public class MiniAESUtil {
    
        //    
        public static final String KEY_NAME = "AES";
        //      /  /    
        // ECB                 ,CBC        iv
        public static final String CIPHER_ALGORITHM = "AES/CBC/PKCS7Padding";
    
        /**
         *        
    * AES-128-CBC, PKCS#7
    * :encrypted=Base64_Decode(encryptData)
    * :key = Base64_Decode(session_key),aeskey 16
    * :iv = Base64_Decode(iv), 16
    * * @param encrypted * @param session_key ID * @param iv */ public static String wxDecrypt(String encrypted, String session_key, String iv) { String json = null; byte[] encrypted64 = Base64.decodeBase64(encrypted); byte[] key64 = Base64.decodeBase64(session_key); byte[] iv64 = Base64.decodeBase64(iv); byte[] data; try { init(); json = new String(decrypt(encrypted64, key64, generateIV(iv64))); } catch (Exception e) { e.printStackTrace(); } return json; } /** * */ public static void init() throws Exception { Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()); KeyGenerator.getInstance(KEY_NAME).init(128); } /** * iv */ public static AlgorithmParameters generateIV(byte[] iv) throws Exception { // iv 16 , iOS , 0 // Arrays.fill(iv, (byte) 0x00); AlgorithmParameters params = AlgorithmParameters.getInstance(KEY_NAME); params.init(new IvParameterSpec(iv)); return params; } /** * */ public static byte[] decrypt(byte[] encryptedData, byte[] keyBytes, AlgorithmParameters iv) throws Exception { Key key = new SecretKeySpec(keyBytes, KEY_NAME); Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM); // cipher.init(Cipher.DECRYPT_MODE, key, iv); return cipher.doFinal(encryptedData); } public static void main(String[] args) { String encryptedData = "33fZhF8F6/GOIIv+s6Cyrvqt43DQUhAAqvU1oro4DLTAWCE9tmPGSPXz67WrAoLd/WqTwUuL2bLP+WIfXc/y6alTTiv+ApM1d3FPDELcMnVi/M2QYcoqxiAJXeHOWknzobOSBkwfpDglRzl0YzrGp9rj/WPbukqMeXJaExzUUQiYDuYBG/lb1BvZ4NYuUR+SJdADuVlhJgWjW2BAyeESZg=="; String iv = "dtzfyZmCe3ccIqw78pVXTg=="; String session_key = "VrLEvceeizQl7+5qxMZBrA=="; String json = getUserInfo(encryptedData, session_key, iv); String wxDecrypt = wxDecrypt(encryptedData, session_key, iv); System.out.println(json); } /** * * @param encryptedData * @param sessionKey * @param iv * @return */ public static String getUserInfo(String encryptedData, String sessionKey, String iv) { String result = ""; // byte[] dataByte = Base64.decodeBase64(encryptedData); // byte[] keyByte = Base64.decodeBase64(sessionKey); // byte[] ivByte = Base64.decodeBase64(iv); try { // 16 , . if int base = 16; if (keyByte.length % base != 0) { int groups = keyByte.length / base + (keyByte.length % base != 0 ? 1 : 0); byte[] temp = new byte[groups * base]; Arrays.fill(temp, (byte) 0); System.arraycopy(keyByte, 0, temp, 0, keyByte.length); keyByte = temp; } // Security.addProvider(new BouncyCastleProvider()); Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding", "BC"); SecretKeySpec spec = new SecretKeySpec(keyByte, "AES"); AlgorithmParameters parameters = AlgorithmParameters .getInstance("AES"); parameters.init(new IvParameterSpec(ivByte)); cipher.init(Cipher.DECRYPT_MODE, spec, parameters);// byte[] resultByte = cipher.doFinal(dataByte); if (null != resultByte && resultByte.length > 0) { result = new String(resultByte, "UTF-8"); } } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (NoSuchPaddingException e) { e.printStackTrace(); } catch (InvalidParameterSpecException e) { e.printStackTrace(); } catch (IllegalBlockSizeException e) { e.printStackTrace(); } catch (BadPaddingException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (InvalidKeyException e) { e.printStackTrace(); } catch (InvalidAlgorithmParameterException e) { e.printStackTrace(); } catch (NoSuchProviderException e) { e.printStackTrace(); } return result; } }