mac系統(tǒng)下AES解密出現(xiàn)javax.crypto.BadPaddingException: Given final block not properly padded

AES工具類加解密麦备,在windows環(huán)境下可以正常加解密(之前部署到linux服務(wù)器上也沒有出現(xiàn)問題)孽椰,但是在mac環(huán)境下解密時出現(xiàn)以下問題

javax.crypto.BadPaddingException: Given final block not properly padded
    at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:989)
    at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:845)
    at com.sun.crypto.provider.AESCipher.engineDoFinal(AESCipher.java:446)
    at javax.crypto.Cipher.doFinal(Cipher.java:2165)

整個工具類代碼如下

import javax.crypto.*;
import javax.crypto.spec.SecretKeySpec;
import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;

public class AESUtils {


    public static String encryptStr(String content, String password) {
        return  ParseHexUtils.parseByte2HexStr(encrypt(content,password));
    }
    public static byte[] encrypt(String content, String password) {
        try {
            KeyGenerator kgen = KeyGenerator.getInstance("AES");// 創(chuàng)建AES的Key生產(chǎn)者
            /*SecureRandom random=SecureRandom.getInstance("SHA1PRNG");
            random.setSeed(password.getBytes());
            kgen.init(128, random);*/
            kgen.init(128, new SecureRandom(password.getBytes()));// 利用用戶密碼作為隨機數(shù)初始化出
            SecretKey secretKey = kgen.generateKey();// 根據(jù)用戶密碼,生成一個密鑰
            byte[] enCodeFormat = secretKey.getEncoded();// 返回基本編碼格式的密鑰泥兰,如果此密鑰不支持編碼弄屡,則返回
            SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");// 轉(zhuǎn)換為AES專用密鑰
            Cipher cipher = Cipher.getInstance("AES");// 創(chuàng)建密碼器
            byte[] byteContent = content.getBytes("utf-8");
            cipher.init(Cipher.ENCRYPT_MODE, key);// 初始化為加密模式的密碼器
            byte[] result = cipher.doFinal(byteContent);// 加密
            return result;

        } catch (NoSuchPaddingException e) {
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (InvalidKeyException e) {
            e.printStackTrace();
        } catch (IllegalBlockSizeException e) {
            e.printStackTrace();
        } catch (BadPaddingException e) {
            e.printStackTrace();
        }
        return null;
    }
    public static String decryptStr(String content, String password){
        try {
            return  new String(decrypt(ParseHexUtils.parseHexStr2Byte(content),password),"utf-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return  null;
    }
    public static byte[] decrypt(byte[] content, String password) {
        try {
            KeyGenerator kgen = KeyGenerator.getInstance("AES");// 創(chuàng)建AES的Key生產(chǎn)者
            /*SecureRandom random=SecureRandom.getInstance("SHA1PRNG");
            random.setSeed(password.getBytes());
            kgen.init(128, random);*/
            kgen.init(128, new SecureRandom(password.getBytes()));
            SecretKey secretKey = kgen.generateKey();// 根據(jù)用戶密碼,生成一個密鑰
            byte[] enCodeFormat = secretKey.getEncoded();// 返回基本編碼格式的密鑰
            SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");// 轉(zhuǎn)換為AES專用密鑰
            Cipher cipher = Cipher.getInstance("AES");// 創(chuàng)建密碼器
            cipher.init(Cipher.DECRYPT_MODE, key);// 初始化為解密模式的密碼器
            byte[] result = cipher.doFinal(content);
            return result; // 明文

        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (NoSuchPaddingException e) {
            e.printStackTrace();
        } catch (InvalidKeyException e) {
            e.printStackTrace();
        } catch (IllegalBlockSizeException e) {
            e.printStackTrace();
        } catch (BadPaddingException e) {
            e.printStackTrace();
        }
        return null;
    }
}
}

最后的解決辦法就是把上述代碼中加密解密方法中的多行注釋的部分放開鞋诗,再把下方的kegen.init(...)這行注釋掉即可

原因:

簡單看了一下源碼SecureRandom的源碼膀捷,沒有得到很好的結(jié)論,個人覺得大概是環(huán)境的問題削彬,沒有調(diào)用setSeed()方法的時候全庸,直接new SecureRandom(...)調(diào)用了它的默認方式生成秘鑰,而調(diào)用了setSeed()方法,指定了它的秘鑰生成方式

注:在此過程中融痛,曾嘗試修改jdk中jre目錄下的java.security文件中屬性且沒有恢復(fù)默認壶笼,具體路徑為
/Users/.../Documents/jdk1.8.0_201.jdk/Contents/Home/jre/lib/security/java.security
修改了文件中
securerandom.source=file:/dev/random屬性為securerandom.source=file:/dev/./urandom

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市雁刷,隨后出現(xiàn)的幾起案子覆劈,更是在濱河造成了極大的恐慌,老刑警劉巖沛励,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件责语,死亡現(xiàn)場離奇詭異,居然都是意外死亡目派,警方通過查閱死者的電腦和手機坤候,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來企蹭,“玉大人白筹,你說我怎么就攤上這事智末。” “怎么了徒河?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵系馆,是天一觀的道長。 經(jīng)常有香客問我虚青,道長它呀,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任棒厘,我火速辦了婚禮纵穿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘奢人。我一直安慰自己谓媒,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布何乎。 她就那樣靜靜地躺著句惯,像睡著了一般。 火紅的嫁衣襯著肌膚如雪支救。 梳的紋絲不亂的頭發(fā)上抢野,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天,我揣著相機與錄音各墨,去河邊找鬼指孤。 笑死,一個胖子當(dāng)著我的面吹牛贬堵,可吹牛的內(nèi)容都是我干的恃轩。 我是一名探鬼主播,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼黎做,長吁一口氣:“原來是場噩夢啊……” “哼叉跛!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蒸殿,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤筷厘,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后宏所,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體酥艳,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年楣铁,在試婚紗的時候發(fā)現(xiàn)自己被綠了玖雁。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片更扁。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡盖腕,死狀恐怖赫冬,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情溃列,我是刑警寧澤劲厌,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站听隐,受9級特大地震影響补鼻,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜雅任,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一风范、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧沪么,春花似錦硼婿、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至殉摔,卻和暖如春州胳,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背逸月。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工栓撞, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人彻采。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓腐缤,卻偏偏與公主長得像,于是被迫代替她去往敵國和親肛响。 傳聞我的和親對象是個殘疾皇子岭粤,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,927評論 2 355

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

  • 根證書含義 - 孤舟蓑笠翁,獨釣寒江雪 - 博客頻道 - CSDN.NET 本文想簡單談?wù)勀莻€所謂的...
    拉肚閱讀 2,394評論 0 1
  • Java9 新特性 翻譯自 : https://docs.oracle.com/javase/9/whatsnew...
    deadoggy閱讀 1,280評論 0 2
  • 我現(xiàn)在的心中已經(jīng)有了一片海特笋,習(xí)慣把所有的悲傷全部沉入海底剃浇,而海面并不會有一絲的波瀾,相信我猎物,因為我永遠不會把頭朝向...
    踏浪兒_11b9閱讀 366評論 0 0
  • 最初喜歡文字是因為數(shù)學(xué)老師老是批評我粗心大意虎囚,語文老師總是贊揚我思路清晰。后來老愛忘事蔫磨,慢慢的喜歡上了用文字來轉(zhuǎn)存...
    冰糖檸檬閱讀 267評論 0 1
  • 大連的海灘盡是石灘淘讥,沒有沙灘。小時候踩過的沙灘堤如,原來都是人工鋪的蒲列,海水經(jīng)年潮汐窒朋,沙子不消幾歲就被帶走了。后來大概是...
    好痛閱讀 178評論 0 0