zoukankan      html  css  js  c++  java
  • 微信小程序的加密与解密--java

      可能是微信认为java 对称加密算法做的比较好。没有给出java的例子。

    微信签名加密:利用最简单的AES加密方式

    关键代码:

    public static String encode(String str) {
            if (str == null) {
                return null;
            }
            try {
                MessageDigest messageDigest = MessageDigest.getInstance("SHA1");
                messageDigest.update(str.getBytes("UTF-8"));
                return getFormattedText(messageDigest.digest());
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }

      微信解密方式:

        需要密钥,需要偏移量

    关键代码:

    /**
         * AES解密
         *
         * @param content 密文
         * @return
         * @throws InvalidAlgorithmParameterException
         * @throws NoSuchProviderException
         */
        public static byte[] decrypt(byte[] content, byte[] keyByte, byte[] ivByte) throws InvalidAlgorithmParameterException {
            try {
                Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
                SecretKeySpec sKeySpec = new SecretKeySpec(keyByte, "AES");
                cipher.init(Cipher.DECRYPT_MODE, sKeySpec, generateIV(ivByte));
                byte[] result = cipher.doFinal(content);
                return result;
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return null;
        }

    整个类:

    package com.paic.aims.common.util;
    
    
    import com.alibaba.fastjson.JSON;
    import com.alibaba.fastjson.JSONObject;
    import org.apache.commons.codec.binary.Base64;
    
    import javax.crypto.Cipher;
    import javax.crypto.spec.IvParameterSpec;
    import javax.crypto.spec.SecretKeySpec;
    import java.security.AlgorithmParameters;
    import java.security.InvalidAlgorithmParameterException;
    import java.security.MessageDigest;
    import java.security.NoSuchProviderException;
    
    /**
     * @author zhongzheng664
     * @date 2018/9/26.
     */
    public class Sha1Utils {
        private static final char[] HEX_DIGITS = {'0', '1', '2', '3', '4', '5', '6',
                '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
    
        /**
         * 把密文转换成十六进制的字符串形式
         * @param bytes
         * @return  十六进制的字符串
         */
        private static String getFormattedText(byte[] bytes) {
            int len = bytes.length;
            StringBuilder buf = new StringBuilder(len * 2);
            // 把密文转换成十六进制的字符串形式
            for (int j = 0; j < len; j++) {
                buf.append(HEX_DIGITS[(bytes[j] >> 4) & 0x0f]);
                buf.append(HEX_DIGITS[bytes[j] & 0x0f]);
            }
            return buf.toString();
        }
    
        public static String encode(String str) {
            if (str == null) {
                return null;
            }
            try {
                MessageDigest messageDigest = MessageDigest.getInstance("SHA1");
                messageDigest.update(str.getBytes("UTF-8"));
                return getFormattedText(messageDigest.digest());
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
    
        /**
         * AES解密
         *
         * @param content 密文
         * @return
         * @throws InvalidAlgorithmParameterException
         * @throws NoSuchProviderException
         */
        public static byte[] decrypt(byte[] content, byte[] keyByte, byte[] ivByte) throws InvalidAlgorithmParameterException {
            try {
                Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
                SecretKeySpec sKeySpec = new SecretKeySpec(keyByte, "AES");
                cipher.init(Cipher.DECRYPT_MODE, sKeySpec, generateIV(ivByte));
                byte[] result = cipher.doFinal(content);
                return result;
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return null;
        }
    
    
        // 生成iv
        public static AlgorithmParameters generateIV(byte[] iv) throws Exception {
            AlgorithmParameters params = AlgorithmParameters.getInstance("AES");
            params.init(new IvParameterSpec(iv));
            return params;
        }
    
    
        public static void main(String[] agrs) {
            String str = "{"nickName":"Band","gender":1,"language":"zh_CN","city":"Guangzhou","province":"Guangdong","country":"CN","avatarUrl":"http://wx.qlogo.cn/mmopen/vi_32/1vZvI39NWFQ9XM4LtQpFrQJ1xlgZxx3w7bQxKARol6503Iuswjjn6nIGBiaycAjAtpujxyzYsrztuuICqIM5ibXQ/0"}HyVFkGl5F5OQWJZZaNzBBg==";
            //微信加密
            String encode = encode(str);
            String session_key = "HyVFkGl5F5OQWJZZaNzBBg==";
            String appId = "wx4f4bc4dec97d474b";
            String encryptedData = "CiyLU1Aw2KjvrjMdj8YKliAjtP4gsMZMQmRzooG2xrDcvSnxIMXFufNstNGTyaGS9uT5geRa0W4oTOb1WT7fJlAC+oNPdbB+3hVbJSRgv+4lGOETKUQz6OYStslQ142dNCuabNPGBzlooOmB231qMM85d2/fV6ChevvXvQP8Hkue1poOFtnEtpyxVLW1zAo6/1Xx1COxFvrc2d7UL/lmHInNlxuacJXwu0fjpXfz/YqYzBIBzD6WUfTIF9GRHpOn/Hz7saL8xz+W//FRAUid1OksQaQx4CMs8LOddcQhULW4ucetDf96JcR3g0gfRK4PC7E/r7Z6xNrXd2UIeorGj5Ef7b1pJAYB6Y5anaHqZ9J6nKEBvB4DnNLIVWSgARns/8wR2SiRS7MNACwTyrGvt9ts8p12PKFdlqYTopNHR1Vf7XjfhQlVsAJdNiKdYmYVoKlaRv85IfVunYzO0IKXsyl7JCUjCpoG20f0a04COwfneQAGGwd5oa+T8yO5hzuyDb/XcxxmK01EpqOyuxINew==";
            String sessionKey = "tiihtNczf5v6AKRyjwEUhQ==";
            String iv = "r7BXXKkLb8qrSNn05n0qiA==";
            System.out.println(encode);
            try {
                byte[] resultByte=decrypt(Base64.decodeBase64(encryptedData),Base64.decodeBase64(sessionKey),
                        Base64.decodeBase64(iv));
                String jsonStr=new String(resultByte, "utf-8");
                //字符串转json
                JSONObject jsonObject= JSON.parseObject(jsonStr);
                System.out.println(new String(resultByte, "utf-8"));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
    }
    View Code
    学习的时间不一定要特定安排
  • 相关阅读:
    20145202、20145225、20145234 《信息安全系统设计基础》实验二 固件设计
    20145225 《信息安全系统设计基础》第12周学习总结
    GDB调试汇编堆栈过程分析
    20145118 《Java程序设计》课程总结
    JAVA第十周《网络编程》学习内容总结
    JAVA课程实验报告 实验五 JAVA网络编程及安全
    20145118《Java程序设计》 第9周学习总结
    20145118 《Java程序设计》 实验报告四
    20145118《Java程序设计》 第8周学习总结
    20145118 《Java程序设计》 实验报告三
  • 原文地址:https://www.cnblogs.com/zhongzheng123/p/9712781.html
Copyright © 2011-2022 走看看