微信退款回調(diào)加密串AES解析

直接上代碼

import java.security.Security;  

import javax.crypto.Cipher;  
import javax.crypto.spec.SecretKeySpec;  
  
import org.bouncycastle.jce.provider.BouncyCastleProvider;  
  
public class Encrypt {  
  
    public static boolean initialized = false;  
      
    public static final String ALGORITHM = "AES/ECB/PKCS7Padding";  
      
    /** 
     * @param  String str  要被加密的字符串 
     * @param  byte[] key  加/解密要用的長度為32的字節(jié)數(shù)組(256位)密鑰 
     * @return byte[]  加密后的字節(jié)數(shù)組 
     */  
    public static byte[] Aes256Encode(String str, byte[] key){  
        initialize();  
        byte[] result = null;  
        try{  
            Cipher cipher = Cipher.getInstance(ALGORITHM, "BC");  
            SecretKeySpec keySpec = new SecretKeySpec(key, "AES"); //生成加密解密需要的Key  
            cipher.init(Cipher.ENCRYPT_MODE, keySpec);  
            result = cipher.doFinal(str.getBytes("UTF-8"));  
        }catch(Exception e){  
            e.printStackTrace();  
        }  
        return result;  
    }  
      
    /** 
     * @param  byte[] bytes  要被解密的字節(jié)數(shù)組 
     * @param  byte[] key    加/解密要用的長度為32的字節(jié)數(shù)組(256位)密鑰 
     * @return String  解密后的字符串 
     */  
    public static String Aes256Decode(byte[] bytes, byte[] key){  
        initialize();  
        String result = null;  
        try{  
            Cipher cipher = Cipher.getInstance(ALGORITHM, "BC");  
            SecretKeySpec keySpec = new SecretKeySpec(key, "AES"); //生成加密解密需要的Key  
            cipher.init(Cipher.DECRYPT_MODE, keySpec);  
            byte[] decoded = cipher.doFinal(bytes);  
            result = new String(decoded, "UTF-8");  
        }catch(Exception e){  
            e.printStackTrace();  
        }  
        return result;  
    }  
      
    public static void initialize(){  
        if (initialized) return;  
        Security.addProvider(new BouncyCastleProvider());  
        initialized = true;  
    }  
}  

測試調(diào)用的代碼

public static void main(String[] args) throws Exception {
        String md5Key = MD5Util.MD5Encode("你的apikey", "UTF-8").toLowerCase();
        byte[] key = md5Key.getBytes();
         String a = "微信回調(diào)返回來的加密串,根據(jù)req_info取出的";
         byte[] b = Base64Util.decode(a);
        System.out.println(Encrypt.Aes256Decode(b, key));

     }

問題1:

  • 代碼開頭要先import Java Cryptography Extension (JCE)中的兩個(gè)類——加/解密類Cipher和密鑰類SecretKeySpec华烟,以及BouncyCastle的一個(gè)開源加/解密類庫中的加/解密算法提供者類BouncyCastleProvider季希。
    PC上的Java里面只有"AES/ECB/PKCS5Padding"算法,沒有"AES/ECB/PKCS7Padding"算法吨述。故需要引入BouncyCastle的庫,并給Cipher.getInstance方法傳入?yún)?shù)"BC"來指定Java使用這個(gè)庫里的加/解密算法衡怀。BouncyCastle的加/解密類庫的下載地址:http://www.bouncycastle.org/latest_releases.html
    也可以是使用maven
<dependency>
      <groupId>org.bouncycastle</groupId>
      <artifactId>bcprov-jdk16</artifactId>
      <version>1.45</version>
</dependency>

問題2:

  • 用AES解密時(shí)出現(xiàn)"java.security.InvalidKeyException: Illegal key size"異常装畅。
    如果密鑰大于128, 會(huì)拋出上述異常。因?yàn)槊荑€長度是受限制的, java運(yùn)行時(shí)環(huán)境讀到的是受限的policy文件蓝纲,文件位于/jre/lib/security下, 這種限制是因?yàn)槊绹鴮浖隹诘目刂啤?/p>

  • 解決辦法也很簡單:
    jdk對應(yīng)jar包的路徑:D:\Java\jdk1.7.0_25\jre\lib\security
    jre對應(yīng)jar包的路徑:D:\Java\jre7\lib\security

jdk 5: http://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archive-downloads-java-plat-419418.html#jce_policy-1.5.0-oth-JPR

jdk6: http://www.oracle.com/technetwork/java/javase/downloads/jce-6-download-429243.html
JDK7的下載地址: http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html
JDK8的下載地址: http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html
下載后解壓,可以看到local_policy.jar和US_export_policy.jar以及readme.txt
如果安裝了JRE晌纫,將兩個(gè)jar文件放到%JRE_HOME%\lib\security目錄下覆蓋原來的文件
如果安裝了JDK税迷,還要將兩個(gè)jar文件也放到%JDK_HOME%\jre\lib\security目錄下覆蓋原來文件

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市锹漱,隨后出現(xiàn)的幾起案子箭养,更是在濱河造成了極大的恐慌,老刑警劉巖哥牍,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件毕泌,死亡現(xiàn)場離奇詭異喝检,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)撼泛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進(jìn)店門蛇耀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人坎弯,你說我怎么就攤上這事纺涤。” “怎么了抠忘?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵撩炊,是天一觀的道長。 經(jīng)常有香客問我崎脉,道長拧咳,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任囚灼,我火速辦了婚禮骆膝,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘灶体。我一直安慰自己阅签,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布蝎抽。 她就那樣靜靜地躺著政钟,像睡著了一般。 火紅的嫁衣襯著肌膚如雪樟结。 梳的紋絲不亂的頭發(fā)上养交,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天,我揣著相機(jī)與錄音瓢宦,去河邊找鬼碎连。 笑死,一個(gè)胖子當(dāng)著我的面吹牛驮履,可吹牛的內(nèi)容都是我干的鱼辙。 我是一名探鬼主播,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼疲吸,長吁一口氣:“原來是場噩夢啊……” “哼座每!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起摘悴,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎舰绘,沒想到半個(gè)月后蹂喻,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體葱椭,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年口四,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了孵运。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,605評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蔓彩,死狀恐怖治笨,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情赤嚼,我是刑警寧澤旷赖,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站更卒,受9級特大地震影響等孵,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蹂空,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一俯萌、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧上枕,春花似錦咐熙、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至分瘦,卻和暖如春蘸泻,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背嘲玫。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工悦施, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人去团。 一個(gè)月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓抡诞,卻偏偏與公主長得像,于是被迫代替她去往敵國和親土陪。 傳聞我的和親對象是個(gè)殘疾皇子昼汗,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內(nèi)容