Base64-加密數(shù)據(jù)( encryptedData )解密

加密數(shù)據(jù)解密算法

1.對稱解密使用的算法為 AES-128-CBC,數(shù)據(jù)采用PKCS#7填充。
2.對稱解密的目標密文為 Base64_Decode(encryptedData)。
3.對稱解密秘鑰 aeskey = Base64_Decode(session_key), aeskey 是16字節(jié)。
4.對稱解密算法初始向量 為Base64_Decode(iv),其中iv由數(shù)據(jù)接口返回。

例子

public class WXBizDataCrypt
{
  private String appId;
  private String sessionKey;
  
  public WXBizDataCrypt(String appId, String sessionKey)
  {
    this.appId = appId;
    this.sessionKey = sessionKey;
  }

  public WXBizDataCrypt(){ }

  public String decrypt(String encryptedData, String iv) throws Exception{
    Decoder decoder = Base64.getDecoder();
    byte[] keyByte = decoder.decode(sessionKey);
    byte[] encryptedDataByte = decoder.decode(encryptedData);
    byte[] ivByte = decoder.decode(iv);
    
//這邊導入 bouncycastle Maven包
/*
    <dependency>
     <groupId>org.bouncycastle</groupId>
     <artifactId>bcprov-ext-jdk16</artifactId>
     <version>1.46</version>
     <type>jar</type>
     <scope>compile</scope>
    </dependency>
*/
    if (Security.getProvider("BC") == null) { 
      Security.addProvider(new org.bouncycastle.jce.provider.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(encryptedDataByte);
    
    String result = null;
    if (null != resultByte && resultByte.length > 0) {
      result = new String(resultByte, "UTF-8");
    }
// 返回前,可以對比appId
    return result;
  }
  
}
 @Test
  public void testBase64() {

      String appId = "wx4f4bc4dec97d474b";
      String sessionKey = "tiihtNczf5v6AKRyjwEUhQ==";
      String encryptedData = "CiyLU1Aw2KjvrjMdj8YKliAjtP4gsMZMQmRzooG2xrDcvSnxIMXFufNstNGTyaGS9uT5geRa0W4oTOb1WT7fJlAC+oNPdbB+3hVbJSRgv+4lGOETKUQz6OYStslQ142dNCuabNPGBzlooOmB231qMM85d2/fV6ChevvXvQP8Hkue1poOFtnEtpyxVLW1zAo6/1Xx1COxFvrc2d7UL/lmHInNlxuacJXwu0fjpXfz/YqYzBIBzD6WUfTIF9GRHpOn/Hz7saL8xz+W//FRAUid1OksQaQx4CMs8LOddcQhULW4ucetDf96JcR3g0gfRK4PC7E/r7Z6xNrXd2UIeorGj5Ef7b1pJAYB6Y5anaHqZ9J6nKEBvB4DnNLIVWSgARns/8wR2SiRS7MNACwTyrGvt9ts8p12PKFdlqYTopNHR1Vf7XjfhQlVsAJdNiKdYmYVoKlaRv85IfVunYzO0IKXsyl7JCUjCpoG20f0a04COwfneQAGGwd5oa+T8yO5hzuyDb/XcxxmK01EpqOyuxINew==";
      String iv = "r7BXXKkLb8qrSNn05n0qiA==";
  
      WXBizDataCrypt wx = new WXBizDataCrypt(appId, sessionKey);
      try
      {
        String decrypt = wx.decrypt(encryptedData, iv);
        System.out.println("answer====="+decrypt);
        
      }
      catch (Exception e)
      {
        e.printStackTrace();
      }
      
  }

控制臺結果為

====={"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"}}

原文:https://mp.weixin.qq.com/debug/wxadoc/dev/api/signature.html

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容