2019-07-24 jdk8后使用 base64替換BASE64Decoder

jdk8之后梗醇,sun.misc.BASE64Decoder和sun.misc.BASE64Encoder被移除

從JDK 1.8開始寺滚,就提供了java.util.Base64.Decoder和java.util.Base64.Encoder的JDK公共API,可代替sun.misc.BASE64Decoder和sun.misc.BASE64Encoder的JDK內部API

 

import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
//import java.util.Base64;
import org.apache.commons.codec.binary.Base64;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

public class DesUtil {



    /*
     * 加密 1.構造密鑰生成器 2.根據(jù)ecnodeRules規(guī)則初始化密鑰生成器 3.產生密鑰 4.創(chuàng)建和初始化密碼器 5.內容加密 6.返回字符串
     */
    public static String AESEncode(String encodeRules, String content) throws Exception {
        GetCipher getCipher = new GetCipher(encodeRules).invoke();
        SecretKey key = getCipher.getKey();
        Cipher cipher = getCipher.getCipher();
        // 7.初始化密碼器熔萧,第一個參數(shù)為加密(Encrypt_mode)或者解密解密(Decrypt_mode)操作,第二個參數(shù)為使用的KEY
        cipher.init(Cipher.ENCRYPT_MODE, key);
        // 8.獲取加密內容的字節(jié)數(shù)組(這里要設置為utf-8)不然內容中如果有中文和英文混合中文就會解密為亂碼
        byte[] byte_encode = content.getBytes("utf-8");
        // 9.根據(jù)密碼器的初始化方式--加密:將數(shù)據(jù)加密
        byte[] byte_AES = cipher.doFinal(byte_encode);
        // 10.將加密后的數(shù)據(jù)轉換為字符串
        // 這里用Base64Encoder中會找不到包
        // 解決辦法:
        // 在項目的Build path中先移除JRE System Library,再添加庫JRE System Library荷科,重新編譯后就一切正常了。
        //String AES_encode=new String(new BASE64Encoder().encode(byte_AES));
        String AES_encode = new String(Base64.encodeBase64(byte_AES));
        // 11.將字符串返回
        return AES_encode;
    }

    /*
     * 解密 解密過程: 1.同加密1-4步 2.將加密后的字符串反紡成byte[]數(shù)組 3.將加密內容解密
     */
    public static String AESDncode(String encodeRules, String content) throws Exception {
        GetCipher getCipher = new GetCipher(encodeRules).invoke();
        SecretKey key = getCipher.getKey();
        Cipher cipher = getCipher.getCipher();
        // 7.初始化密碼器纱注,第一個參數(shù)為加密(Encrypt_mode)或者解密(Decrypt_mode)操作畏浆,第二個參數(shù)為使用的KEY
        cipher.init(Cipher.DECRYPT_MODE, key);
        // 8.將加密并編碼后的內容解碼成字節(jié)數(shù)組
        // byte [] byte_content= new BASE64Decoder().decodeBuffer(content);
        // byte[] byte_content = Base64.getDecoder().decode(content);
        byte[] byte_content = Base64.decodeBase64(content);
        /*
         * 解密
         */
        byte[] byte_decode = cipher.doFinal(byte_content);
        String AES_decode = new String(byte_decode, "utf-8");
        return AES_decode;
    }

    private static class GetCipher {
        private String encodeRules;
        private SecretKey key;
        private Cipher cipher;

        public GetCipher(String encodeRules) {
            this.encodeRules = encodeRules;
        }

        public SecretKey getKey() {
            return key;
        }

        public Cipher getCipher() {
            return cipher;
        }

        public GetCipher invoke() throws NoSuchAlgorithmException, NoSuchPaddingException {
            // 1.構造密鑰生成器,指定為AES算法,不區(qū)分大小寫
            KeyGenerator keygen = KeyGenerator.getInstance("AES");
            // 2.根據(jù)ecnodeRules規(guī)則初始化密鑰生成器
            // 生成一個128位的隨機源,根據(jù)傳入的字節(jié)數(shù)組
            SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
            secureRandom.setSeed(encodeRules.getBytes());
            keygen.init(128, secureRandom);
//          keygen.init(128, new SecureRandom(encodeRules.getBytes()));
            // 3.產生原始對稱密鑰
            SecretKey original_key = keygen.generateKey();
            // 4.獲得原始對稱密鑰的字節(jié)數(shù)組
            byte[] raw = original_key.getEncoded();
            // 5.根據(jù)字節(jié)數(shù)組生成AES密鑰
            key = new SecretKeySpec(raw, "AES");
            // 6.根據(jù)指定算法AES自成密碼器
            cipher = Cipher.getInstance("AES");
            return this;
        }
    }
}
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末狞贱,一起剝皮案震驚了整個濱河市刻获,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌瞎嬉,老刑警劉巖蝎毡,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異氧枣,居然都是意外死亡沐兵,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門便监,熙熙樓的掌柜王于貴愁眉苦臉地迎上來扎谎,“玉大人,你說我怎么就攤上這事烧董〔就福” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵解藻,是天一觀的道長老充。 經常有香客問我,道長螟左,這世上最難降的妖魔是什么啡浊? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮胶背,結果婚禮上巷嚣,老公的妹妹穿的比我還像新娘。我一直安慰自己钳吟,他們只是感情好廷粒,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般坝茎。 火紅的嫁衣襯著肌膚如雪涤姊。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天嗤放,我揣著相機與錄音思喊,去河邊找鬼。 笑死次酌,一個胖子當著我的面吹牛恨课,可吹牛的內容都是我干的。 我是一名探鬼主播岳服,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼剂公,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了吊宋?” 一聲冷哼從身側響起纲辽,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎贫母,沒想到半個月后文兑,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體盒刚,經...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡腺劣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了因块。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片橘原。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖涡上,靈堂內的尸體忽然破棺而出趾断,到底是詐尸還是另有隱情,我是刑警寧澤吩愧,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布芋酌,位于F島的核電站,受9級特大地震影響雁佳,放射性物質發(fā)生泄漏脐帝。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一糖权、第九天 我趴在偏房一處隱蔽的房頂上張望堵腹。 院中可真熱鬧,春花似錦星澳、人聲如沸疚顷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽腿堤。三九已至阀坏,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間释液,已是汗流浹背全释。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留误债,地道東北人浸船。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像寝蹈,于是被迫代替她去往敵國和親李命。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內容