java aes加密是什么,讓我們一起了解一下?
java aes加密是一種對稱的分組加密技術,使用128位分組加密數據,提供比WEP/TKIPS的RC4算法更高的加密強度。AES具有應用范圍廣、等待時間短、相對容易隱藏、吞吐量高等優點。
JAVA是如何實現AES加密的?(兩種方法)
方法一:
/** ?*AES加密解密工具類 ?*@author?M-Y ?*/ public?class?AESUtil?{ ??????private?static?final?Logger?logger?=?Logger.getLogger(AESUtil.class); ??????private?static?final?String?defaultCharset?=?"UTF-8"; ??????private?static?final?String?KEY_AES?=?"AES"; ??????private?static?final?String?KEY?=?"123456"; ????/** ?????*?加密 ?????* ?????*?@param?data?需要加密的內容 ?????*?@param?key?加密密碼 ?????*?@return ?????*/ ????public?static?String?encrypt(String?data,?String?key)?{ ????????return?doAES(data,?key,?Cipher.ENCRYPT_MODE); ????} ? ????/** ?????*?解密 ?????* ?????*?@param?data?待解密內容 ?????*?@param?key?解密密鑰 ?????*?@return ?????*/ ????public?static?String?decrypt(String?data,?String?key)?{ ????????return?doAES(data,?key,?Cipher.DECRYPT_MODE); ????} ? ????/** ?????*?加解密 ?????* ?????*?@param?data?待處理數據 ?????*?@param?password??密鑰 ?????*?@param?mode?加解密mode ?????*?@return ?????*/ ????private?static?String?doAES(String?data,?String?key,?int?mode)?{ ????????try?{ ????????????if?(StringUtils.isBlank(data)?||?StringUtils.isBlank(key))?{ ????????????????return?null; ????????????} ????????????//判斷是加密還是解密 ????????????boolean?encrypt?=?mode?==?Cipher.ENCRYPT_MODE; ????????????byte[]?content; ????????????//true?加密內容?false?解密內容 ????????????if?(encrypt)?{ ????????????????content?=?data.getBytes(defaultCharset); ????????????}?else?{ ????????????????content?=?parseHexStr2Byte(data); ????????????} ????????????//1.構造密鑰生成器,指定為AES算法,不區分大小寫 ????????????KeyGenerator?kgen?=?KeyGenerator.getInstance(KEY_AES); ????????????//2.根據ecnodeRules規則初始化密鑰生成器 ????????????//生成一個128位的隨機源,根據傳入的字節數組 ????????????kgen.init(128,?new?SecureRandom(key.getBytes())); ????????????//3.產生原始對稱密鑰 ????????????SecretKey?secretKey?=?kgen.generateKey(); ????????????//4.獲得原始對稱密鑰的字節數組 ????????????byte[]?enCodeFormat?=?secretKey.getEncoded(); ????????????//5.根據字節數組生成AES密鑰 ????????????SecretKeySpec?keySpec?=?new?SecretKeySpec(enCodeFormat,?KEY_AES); ????????????//6.根據指定算法AES自成密碼器 ????????????Cipher?cipher?=?Cipher.getInstance(KEY_AES);//?創建密碼器 ????????????//7.初始化密碼器,第一個參數為加密(Encrypt_mode)或者解密解密(Decrypt_mode)操作,第二個參數為使用的KEY ????????????cipher.init(mode,?keySpec);//?初始化 ????????????byte[]?result?=?cipher.doFinal(content); ????????????if?(encrypt)?{ ????????????????//將二進制轉換成16進制 ????????????????return?parseByte2HexStr(result); ????????????}?else?{ ????????????????return?new?String(result,?defaultCharset); ????????????} ????????}?catch?(Exception?e)?{ ????????????logger.error("AES?密文處理異常",?e); ????????} ????????return?null; ????} ????/** ?????*?將二進制轉換成16進制 ?????* ?????*?@param?buf ?????*?@return ?????*/ ????public?static?String?parseByte2HexStr(byte?buf[])?{ ????????StringBuilder?sb?=?new?StringBuilder(); ????????for?(int?i?=?0;?i?輸出結果:
加密前:{'repairPhone':'18547854787','customPhone':'12365478965','captchav':'58m7'} 加密密鑰和解密密鑰:123456 加密后:2A3D75862E69BF61DFAD94017E930227A715C8E533AA1A12361D6BE6E190EC5EE77AA66CAC8005A643BFB26134EE60398C30104B1F7FB3CC6B78795368A86D8215B88A5C80D9C2E4936EEEB0DECA7A88 解密后:{'repairPhone':'18547854787','customPhone':'12365478965','captchav':'58m7'}方法二:替換AESUtil 類中的doAES方法并加上以下成員。
private?static?final?String?KEY_MD5?=?"MD5"; ????private?static?MessageDigest?md5Digest; ? ????static?{ ????????try?{ ????????????md5Digest?=?MessageDigest.getInstance(KEY_MD5); ????????}?catch?(NoSuchAlgorithmException?e)?{ ????????????// ????????} ????} doAES方法: /** ?????*?加解密 ?????* ?????*?@param?data ?????*?@param?key ?????*?@param?mode ?????*?@return ?????*/ ????private?static?String?doAES(String?data,?String?key,?int?mode)?{ ????????try?{ ????????????if?(StringUtils.isBlank(data)?||?StringUtils.isBlank(key))?{ ????????????????return?null; ????????????} ????????????boolean?encrypt?=?mode?==?Cipher.ENCRYPT_MODE; ????????????byte[]?content; ????????????//true?加密內容?false?解密內容 ????????????if?(encrypt)?{ ????????????????content?=?data.getBytes(defaultCharset); ????????????}?else?{ ?????????????????content?=?parseHexStr2Byte(data); ????????????} ????????????SecretKeySpec?keySpec?=?new?SecretKeySpec(md5Digest.digest(key.getBytes(defaultCharset)),?KEY_AES);//構造一個密鑰 ????????????Cipher?cipher?=?Cipher.getInstance(KEY_AES);//?創建密碼器 ????????????cipher.init(mode,?keySpec);//?初始化 ????????????byte[]?result?=?cipher.doFinal(content);//加密或解密 ????????????if?(encrypt)?{ ????????????????return?parseByte2HexStr(result); ????????????}?else?{ ????????????????return?new?String(result,?defaultCharset); ????????????} ????????}?catch?(Exception?e)?{ ????????????logger.error("AES?密文處理異常",?e); ????????} ????????return?null; ????}以上就是小編今天的分享了,希望可以幫助到大家。