微信小程序密文解密工具

微信小程序密文解密工具

  • 小程序对于敏感信息采用了加密,如果想得到明文必须解密,官方上提供了几种语言的demo,唯独没有java版的,这是在搞事情啊
    *

  • 因此在此提供一个java版的解密工具类

  • 此工具类需要commons-codec支持,因此需要添加如下依赖

    //https://mvnrepository.com/artifact/commons-codec/commons-codec/1.11
        implementation('commons-codec:commons-codec:1.11')
    
  • 代码如下

    
    import org.apache.commons.codec.binary.Base64;
    
    import javax.crypto.BadPaddingException;
    import javax.crypto.Cipher;
    import javax.crypto.IllegalBlockSizeException;
    import javax.crypto.NoSuchPaddingException;
    import javax.crypto.spec.IvParameterSpec;
    import javax.crypto.spec.SecretKeySpec;
    import java.security.InvalidAlgorithmParameterException;
    import java.security.InvalidKeyException;
    import java.security.NoSuchAlgorithmException;
    import java.security.spec.AlgorithmParameterSpec;
    
    /**
     * 微信小程序密文解密工具类
     */
    public class WXAESUtil {
    
        public static void main(String[] args) throws NoSuchPaddingException, InvalidAlgorithmParameterException, NoSuchAlgorithmException, IllegalBlockSizeException, BadPaddingException, InvalidKeyException {
            String sEncryptedData = "CiyLU1Aw2KjvrjMdj8YKliAjtP4gsMZMQmRzooG2xrDcvSnxIMXFufNstNGTyaGS9uT5geRa0W4oTOb1WT7fJlAC+oNPdbB+3hVbJSRgv+4lGOETKUQz6OYStslQ142dNCuabNPGBzlooOmB231qMM85d2/fV6ChevvXvQP8Hkue1poOFtnEtpyxVLW1zAo6/1Xx1COxFvrc2d7UL/lmHInNlxuacJXwu0fjpXfz/YqYzBIBzD6WUfTIF9GRHpOn/Hz7saL8xz+W//FRAUid1OksQaQx4CMs8LOddcQhULW4ucetDf96JcR3g0gfRK4PC7E/r7Z6xNrXd2UIeorGj5Ef7b1pJAYB6Y5anaHqZ9J6nKEBvB4DnNLIVWSgARns/8wR2SiRS7MNACwTyrGvt9ts8p12PKFdlqYTopNHR1Vf7XjfhQlVsAJdNiKdYmYVoKlaRv85IfVunYzO0IKXsyl7JCUjCpoG20f0a04COwfneQAGGwd5oa+T8yO5hzuyDb/XcxxmK01EpqOyuxINew==";
            String sSessionkey = "tiihtNczf5v6AKRyjwEUhQ==";
            String sIv = "r7BXXKkLb8qrSNn05n0qiA==";
            String ss = decryptWXAppletInfo(sSessionkey
                    , sEncryptedData
                    , sIv);
            System.out.println(ss);//{"openId":"oGZUI0egBJY1zhBYw2KhdUfwVJJE","nickName":"Band","gender":1,"language":"zh_CN","city":"Guangzhou","province":"Guangdong","country":"CN","avatarUrl":"http://wx.qlogo.cn/mmopen/vi_32/aSKcBBPpibyKNicHNTMM0qJVh8Kjgiak2AHWr8MHM4WgMEm7GFhsf8OYrySdbvAMvTsw3mo8ibKicsnfN5pRjl1p8HQ/0","unionId":"ocMvos6NjeKLIBqg5Mr9QjxrP1FA","watermark":{"timestamp":1477314187,"appid":"wx4f4bc4dec97d474b"}}
        }
    
        /**
         * 解密小程序密文
         * @param sessionKey
         * @param iv
         * @param encryptedData 密文
         * @return
         * @throws NoSuchAlgorithmException
         * @throws NoSuchPaddingException
         * @throws InvalidKeyException
         * @throws InvalidAlgorithmParameterException
         * @throws IllegalBlockSizeException
         * @throws BadPaddingException
         */
        public static String decryptWXAppletInfo(String sessionKey, String iv, String encryptedData)
                throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException,
                InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException {
            String result = null;
            byte[] encrypData = Base64.decodeBase64(encryptedData);
            byte[] ivData = Base64.decodeBase64(iv);
            byte[] sessionKeyB = Base64.decodeBase64(sessionKey);
    
            AlgorithmParameterSpec ivSpec = new IvParameterSpec(ivData);
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
            SecretKeySpec keySpec = new SecretKeySpec(sessionKeyB, "AES");
            cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
            byte[] doFinal = cipher.doFinal(encrypData);
            result = new String(doFinal);
            return result;
        }
    }
    
    
微信的安全键盘加密通常涉及到AES(Advanced Encryption Standard)算法,它是一种常用的对称加密标准,用于数据的加密传输。然而,具体的微信安全键盘的密文解密步骤并没有官方公开,因为这是微信内部的一种安全机制。 如果你需要了解基本的AES解密过程,Java版本的大致步骤如下: 1. 导入必要的库:首先,你需要添加`javax.crypto.Cipher`和`java.security.KeyStore`等相关的Java加密API。 ```java import javax.crypto.Cipher; import java.security.Key; import java.security.spec.SecretKeySpec; ``` 2. 获取密钥:如果密文是通过微信安全键盘生成的,那么你应该已经有了对应的密钥。假设这个密钥存储在一个字符串变量`encryptedKey`中,需要先转化为 SecretKeySpec 对象: ```java String encryptedKeyStr = ...; // 微信提供的密钥字符串 byte[] keyBytes = Base64.decode(encryptedKeyStr); Key key = new SecretKeySpec(keyBytes, "AES"); ``` 3. 初始化 Cipher 对象:设置加密模式(如ECB、CBC等),并指定操作模式(ENCRYPT_MODE或DECRYPT_MODE): ```java Cipher cipher = Cipher.getInstance("AES"); cipher.init(Cipher.DECRYPT_MODE, key); ``` 4. 加解密:对于密文(同样可能是Base64编码的),使用 `doFinal()` 函数进行解密: ```java String encryptedData = ...; // 得到的加密数据字符串 byte[] decryptedData = cipher.doFinal(Base64.decode(encryptedData)); String decryptedText = new String(decryptedData); ``` 注意:上述过程仅是一个基本示例,实际操作中还需要处理异常以及密钥管理和填充模式等问题,并且由于微信的具体加密细节未公开,上述代码可能并不适用于微信安全键盘的密文
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值