日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

常见加密工具类Base64、DES、AES、RSA、MD5汇总

發布時間:2025/3/19 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 常见加密工具类Base64、DES、AES、RSA、MD5汇总 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

        • 引言
        • 1、Base64加密
        • 2、DES加密
        • 3、AES加密
        • 4、RSA加密
        • 5、MD5加密

引言

項目中經常會用到Base64、DES、AES、RSA、MD5幾種加解密方式,每次都要去網上搜索半天,今天索性一次性把他們都匯總起來,以便記憶查找。
JDK版本:1.8.0_45
代碼位置:com.leo.demo.encodetest
源碼地址:https://gitee.com/leo825/sortalgorithm-demos.git

1、Base64加密

Base64編碼,是我們程序開發中經常使用到的編碼方法。它是一種基于用64個可打印字符來表示二進制數據的表示方法。它通常用作存儲、傳輸一些二進制數據編碼方法。

package com.leo.demo.encodetest;import java.util.Base64;/*** @ClassName: Base64Util* @Description: Base64編碼,是我們程序開發中經常使用到的編碼方法。它是一種基于用64個可打印字符來表示二進制數據的表示方法* @Author: leo825* @Date: 2020-02-12 17:32* @Version: 1.0*/ public class Base64Util {private static final String CHARSET_UTF_8 = "UTF-8";/*** 使用base64加密** @param content* @return*/public static String encryptData(String content) throws Exception {return Base64.getEncoder().encodeToString(content.getBytes(CHARSET_UTF_8));}/*** 使用base64解密** @param encryptData* @return*/public static String decodeDate(String encryptData) throws Exception {return new String(Base64.getDecoder().decode(encryptData.getBytes()), CHARSET_UTF_8);}public static void main(String[] args) throws Exception {String str = "hello world, base64";System.out.println("原字符串:" + str);String encodeStr = encryptData(str);System.out.println("base64加密后:" + encodeStr);System.out.println("base64解密后:" + decodeDate(encodeStr));} }

打印結果如下:

原字符串:hello world, base64 base64加密后:aGVsbG8gd29ybGQsIGJhc2U2NA== base64解密后:hello world, base64

2、DES加密

DES是一個分組加密算法,它以64位為分組對數據加密。64位一組的明文從算法的一端輸入,64位的密文從另一端輸出,特點是數據加密標準,速度快,適用于加密大量數據的場合。**DES是一種對稱加密算法,對稱加密就是加解密秘鑰是一樣一樣的。

package com.leo.demo.encodetest;import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import java.security.Key; import java.security.SecureRandom; import java.util.Base64;/*** @ClassName: DESUtil* @Description: DES加密* DES是對稱性加密里面常見一種,全稱為Data Encryption Standard,即數據加密標準,是一種使用密鑰加密的塊算法。* 密鑰長度是64位(bit),超過位數密鑰被忽略。所謂對稱性加密,加密和解密密鑰相同。* 對稱性加密一般會按照固定長度,把待加密字符串分成塊。不足一整塊或者剛好最后有特殊填充字符* @Author: leo825* @Date: 2020-02-12 10:02* @Version: 1.0*/ public class DESUtil {private static Key key;private static final String PRIVATE_KEY = "f573a9b0";static {try {KeyGenerator generator = KeyGenerator.getInstance("DES");SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");secureRandom.setSeed(PRIVATE_KEY.getBytes());generator.init(secureRandom);key = generator.generateKey();generator = null;} catch (Exception e) {e.printStackTrace();}}/*** 加密,返回BASE64的加密字符串* @param str* @return*/public static String getEncryptString(String str) throws Exception {byte[] strBytes = str.getBytes("UTF-8");Cipher cipher = Cipher.getInstance("DES");cipher.init(Cipher.ENCRYPT_MODE, key);byte[] encryptStrBytes = cipher.doFinal(strBytes);return Base64.getEncoder().encodeToString(encryptStrBytes);}/*** 對BASE64加密字符串進行解密* @param str* @return*/public static String getDecryptString(String str) throws Exception {byte[] strBytes = Base64.getDecoder().decode(str);Cipher cipher = Cipher.getInstance("DES");cipher.init(Cipher.DECRYPT_MODE, key);byte[] encryptStrBytes = cipher.doFinal(strBytes);return new String(encryptStrBytes, "UTF-8");}public static void main(String[] args) throws Exception {String name = "root";String password = "1qaz!QAZ";String encryname = getEncryptString(name);String encrypassword = getEncryptString(password);System.out.println("加密:" + encryname);System.out.println("加密:" + encrypassword);System.out.println("解密:" + getDecryptString(encryname));System.out.println("解密:" + getDecryptString(encrypassword));} }

打印結果如下:

加密:Lk/2YIL4N+c= 加密:SatR2mGfn3WncqRUHpmsrQ== 解密:root 解密:1qaz!QAZ

3、AES加密

AES高級加密標準(,Advanced Encryption Standard)為最常見的對稱加密算法(微信小程序加密傳輸就是用這個加密算法的)。**AES也是一種對稱加密算法,對稱加密就是加解密秘鑰是一樣一樣的。**詳情參考百度百科AES

package com.leo.demo.encodetest;import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; import java.security.Key; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import java.util.Base64; /*** @ClassName: AESUtil* @Description: AES 本身就是為了取代 DES 的,AES 具有更好的 安全性、效率 和 靈活性* @Author: leo825* @Date: 2020-02-12 09:46* @Version: 1.0*/ public class AESUtil {/** 加密(對外暴露)*/public static String encryptData(String privateKey, String content) throws Exception {KeyGenerator keygen = getKeyGenerator(privateKey);SecretKey key = new SecretKeySpec(keygen.generateKey().getEncoded(), "AES");return Base64.getEncoder().encodeToString(encrypt(key, content.getBytes("UTF-8")));}/** 解密(對外暴露)*/public static String decryptData(String privateKey, String content) throws Exception {KeyGenerator keygen = getKeyGenerator(privateKey);SecretKey key = new SecretKeySpec(keygen.generateKey().getEncoded(), "AES");return new String(decrypt(key, Base64.getDecoder().decode(content)), "UTF-8");}private static KeyGenerator getKeyGenerator(String privateKey) throws NoSuchAlgorithmException {KeyGenerator keygen = KeyGenerator.getInstance("AES");SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");secureRandom.setSeed(privateKey.getBytes());keygen.init(128, secureRandom);return keygen;}private static byte[] encrypt(Key key, byte[] srcBytes) {if (key != null) {try {// Cipher負責完成加密或解密工作,基于AESCipher cipher = Cipher.getInstance("AES");// 對Cipher對象進行初始化cipher.init(Cipher.ENCRYPT_MODE, key);// 加密,保存并返回return cipher.doFinal(srcBytes);} catch (Exception e) {e.printStackTrace();}}return null;}private static byte[] decrypt(Key key, byte[] encBytes) {if (key != null) {try {Cipher cipher = Cipher.getInstance("AES");//對Cipher對象進行初始化cipher.init(Cipher.DECRYPT_MODE, key);//解密return cipher.doFinal(encBytes);} catch (Exception e) {e.printStackTrace();}}return null;}public static void main(String[] args) throws Exception {String privateKey = "ABC";String content = "ASD456";String m = encryptData(privateKey, content);System.out.println("要加密的內容為::" + content);System.out.println("根據私鑰:" + privateKey + ",加密后的密文是:" + m);System.out.println("根據私鑰:" + privateKey + ",解密后的明文是:" + decryptData(privateKey, m));}}

運行結果:

要加密的內容為::ASD456 根據私鑰:ABC,加密后的密文是:6vLE6e1f//pq9e+ZmczfxQ== 根據私鑰:ABC,解密后的明文是:ASD456

4、RSA加密

RSA加密是一種非對稱加密。可以在不直接傳遞密鑰的情況下,完成解密。這能夠確保信息的安全性,避免了直接傳遞密鑰所造成的被破解的風險。是由一對密鑰來進行加解密的過程,分別稱為公鑰和私鑰。通常個人保存私鑰,公鑰是公開的(可能同時多人持有)。

package com.leo.demo.encodetest;import org.apache.commons.lang3.StringUtils;import javax.crypto.Cipher; import java.security.*; import java.security.interfaces.RSAPrivateKey; import java.security.interfaces.RSAPublicKey; import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec; import java.util.Base64; /*** @ClassName: RSAUtil* @Description:* RSA 加密算法是目前最有影響力的 公鑰加密算法,并且被普遍認為是目前 最優秀的公鑰方案 之一。* RSA 是第一個能同時用于 加密 和 數字簽名 的算法,它能夠 抵抗 到目前為止已知的 所有密碼攻擊,已被 ISO 推薦為公鑰數據加密標準。* @Author: leo825* @Date: 2020-02-12 09:35* @Version: 1.0*/public class RSAUtil {/*** 加密(對外暴露)* 如果使用 公鑰 對數據 進行加密,只有用對應的 私鑰 才能 進行解密。* 如果使用 私鑰 對數據 進行加密,只有用對應的 公鑰 才能 進行解密。** @param keyStr* @param data* @return* @throws Exception*/public static String encryptData(String keyStr, String data, Boolean isPublicKey) throws Exception {if (StringUtils.isEmpty(keyStr)) {return "";}return encryptBASE64(encrypt(getKey(keyStr, isPublicKey), data.getBytes()));}/*** 解密(對外暴露)* 如果使用 公鑰 對數據 進行加密,只有用對應的 私鑰 才能 進行解密。* 如果使用 私鑰 對數據 進行加密,只有用對應的 公鑰 才能 進行解密。** @param keyStr* @param data* @return* @throws Exception*/public static String decryptData(String keyStr, String data, Boolean isPublicKey) throws Exception {if (StringUtils.isEmpty(keyStr)) {return "";}return new String(decrypt(getKey(keyStr, isPublicKey), decryptBASE64(data)), "UTF-8");}/*** 加密** @param key* @param srcBytes* @return*/private static byte[] encrypt(Key key, byte[] srcBytes) {if (key != null) {try {//Cipher負責完成加密或解密工作,基于RSACipher cipher = Cipher.getInstance("RSA");//對Cipher對象進行初始化cipher.init(Cipher.ENCRYPT_MODE, key);//加密,并返回return cipher.doFinal(srcBytes);} catch (Exception e) {e.printStackTrace();}}return null;}/*** 解密** @param key* @param encBytes* @return*/private static byte[] decrypt(Key key, byte[] encBytes) {if (key != null) {try {Cipher cipher = Cipher.getInstance("RSA");//對Cipher對象進行初始化cipher.init(Cipher.DECRYPT_MODE, key);//解密并返回結果return cipher.doFinal(encBytes);} catch (Exception e) {e.printStackTrace();}}return null;}/*** 根據key獲取公有或者私有key對象** @param keyStr* @param isPublicKey* @return* @throws Exception*/private static Key getKey(String keyStr, Boolean isPublicKey) throws Exception {if (isPublicKey) {return getPublicKey(keyStr);} else {return getPrivateKey(keyStr);}}/*** 根據公有key獲取公有key對象** @param key* @return* @throws Exception*/private static RSAPublicKey getPublicKey(String key) throws Exception {byte[] keyBytes = Base64.getDecoder().decode(key);X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);KeyFactory keyFactory = KeyFactory.getInstance("RSA");return (RSAPublicKey) keyFactory.generatePublic(keySpec);}/*** 根據私有key獲取私有對象** @param key* @return* @throws Exception*/private static RSAPrivateKey getPrivateKey(String key) throws Exception {byte[] keyBytes = Base64.getDecoder().decode(key);PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);KeyFactory keyFactory = KeyFactory.getInstance("RSA");return (RSAPrivateKey) keyFactory.generatePrivate(keySpec);}/*** 獲取公有/私有Key** @return*/private static KeyPair getRSAKey() {KeyPair keyPair = null;try {//生成公鑰和私鑰對,基于RSA算法生成對象KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");//初始化密鑰對生成器,密鑰大小為1024位keyPairGen.initialize(1024);//生成一個密鑰對,保存在keyPair中keyPair = keyPairGen.generateKeyPair();} catch (NoSuchAlgorithmException e) {e.printStackTrace();}return keyPair;}/*** 對字符串進行BASE64Decoder** @param key* @return* @throws Exception*/private static byte[] decryptBASE64(String key) {return Base64.getDecoder().decode(key);}/*** 對字節數組進行BASE64Encoder** @param key* @return* @throws Exception*/private static String encryptBASE64(byte[] key) {return Base64.getEncoder().encodeToString(key);}public static void main(String[] args) {// 生成的一對key保存好try {//得到私鑰和公鑰KeyPair keyPair = getRSAKey();RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();String pubKey = encryptBASE64(publicKey.getEncoded());String priKey = encryptBASE64(privateKey.getEncoded());System.out.println("公鑰:" + pubKey);System.out.println("私鑰:" + priKey);// 測試String message = "QWERDF";System.out.println("明文:" + message);String jiami = encryptData(pubKey, message, true);System.out.println("公鑰加密后:" + jiami);String jiemi = decryptData(priKey, jiami, false);System.out.println("用私鑰解密后的結果是:" + jiemi);jiami = encryptData(priKey, message, false);System.out.println("私鑰加密后:" + jiami);jiemi = decryptData(pubKey, jiami, true);System.out.println("用公鑰解密后的結果是:" + jiemi);} catch (Exception e) {e.printStackTrace();}}}

打印結果如下:

公鑰:MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCUK5sCqFJblXMMUzkPkC7vDmo7S51yIpMlkKDB67eVYh7M7sbPI9MBB3jzlscL08rYpnB7xA8zq5PZZHsALeAa+PU4Kxfkl1shnji11HDIzVOE53sArBqeh/IWScIkM5QY/Me3jXsqg+j8l5XmIVQSqmA+Bj19Vw9LJ9TLm50xLwIDAQAB 私鑰:MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAJQrmwKoUluVcwxTOQ+QLu8OajtLnXIikyWQoMHrt5ViHszuxs8j0wEHePOWxwvTytimcHvEDzOrk9lkewAt4Br49TgrF+SXWyGeOLXUcMjNU4TnewCsGp6H8hZJwiQzlBj8x7eNeyqD6PyXleYhVBKqYD4GPX1XD0sn1MubnTEvAgMBAAECgYAxi2sntlTjntN7eZCI7bNj6DQJY71f3sPJOdUnQsR+RPL7n5QGy3nQzEjbWr1v7P/U9cKDAAn9QxALDxg59R0MI46xAi4NZkP6/p/fA2qTlXFxyBkCvKoOjyMMeH/l7YM90qTg5NB2M+LkOXswrkKj9JAh4zZ7raE6RRdyKu3e4QJBAOhbpRHEDwOX/xa7HDFUWZMWCzMUw1k06QqMJZyrJPfQjH9KOph6r86T+6WxlpC4FfIAWWaahXEzrakaPWnZB0kCQQCjPxQ4z1F5HHDin6tPB1M2uTh0R3WWmNmqtKiChCYePcwco1HmkgaJxMarqpOJj7H2600XiV/R5PZGVMpORRy3AkA527Aj110huPR09YyUn/taC9AoHRBzoyAwVyt6codXCeAiRhqHI22pk+HCpZDnYl9cjke0q990i7i/deA6/ia5AkBNJK/vsLj1nKUT0xRnQjTmtVyiRmqhAhZKfxjqpHxG6jkch2lapkMEs8KWuQMDjK4y2zsRFk/7plFjJwp7Nlm9AkEAjj3xaxd8UIYOZpTq5mv0yyPmXE1zsMIjKQkmXXOma5WZElo7130b70Vj463150C0X/66upP+i9r6NS/ijwkmrg== 明文:QWERDF 公鑰加密后:gKeXQIcZf+8u48DLoSOCbwBHGia9hkrvjh+AWiX7GB1pbox6us+ysYfeVNt+QDL39Fzwy/sMMFGsvSxnxR+aZuWWcyYO6C1vsbqgfk/gQ/WnwZzS23w5qEcq1LI2AEwVn3j3T1gQvDGmWgw4D8f3srPi9WgB3YbVNM6TBRtXgyE= 用私鑰解密后的結果是:QWERDF 私鑰加密后:ACgPe2wS94ttqivgPRGn5sLQIKhim+xmCcYyTBxxB9QsNkNFHAMHF0pt/WhUpEfPiKp4hC3XvOqhGZwLeqlFkGj86bl+WH55jadntDWYIbC0ylMpWlNz7Djdhp+g2mt2+ZnZ8JrNXQYyQkm+AjrrfWyVYccSf8+SVveVaJ548xw= 用公鑰解密后的結果是:QWERDF

5、MD5加密

主要是對于密碼的加密,MD5加密是不可逆的,加密后無法解密,直接將加密后的數據作為密碼;這樣就算得到用戶密碼的MD5值,也無法獲取用戶的密碼,就算是管理員也無法得知用戶密碼。

package com.leo.demo.encodetest;import java.security.MessageDigest;/*** @ClassName: MD5Util* @Description: MD5加密* MD5,即消息摘要算法(英語:MD5 Message-Digest Algorithm)。* 是一種被廣泛使用的密碼散列函數,將數據(如一段文字)運算變為另一固定長度值,* 是散列算法的基礎原理,可以產生出一個128位(16字節)的散列值(hash value),用于確保信息傳輸完整一致* @Author: leo825* @Date: 2020-02-12 18:02* @Version: 1.0*/ public class MD5Util {private static final String CHARSET_UTF_8 = "UTF-8";private static final String hexDigIts[] = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"};/*** MD5加密** @param origin 字符* @param charsetname 編碼* @return*/public static String encodeData(String origin, String charsetname) {String resultString = null;try {resultString = new String(origin);MessageDigest md = MessageDigest.getInstance("MD5");if (null == charsetname || "".equals(charsetname)) {resultString = byteArrayToHexString(md.digest(resultString.getBytes()));} else {resultString = byteArrayToHexString(md.digest(resultString.getBytes(charsetname)));}} catch (Exception e) {}return resultString;}/*** 默認使用的utf-8進行編碼,32位小寫* @param origin* @return*/public static String encodeData32(String origin) {return encodeData(origin, CHARSET_UTF_8);}/*** 默認使用的utf-8進行編碼,32位大寫* @param origin* @return*/public static String encodeData32UpperCase(String origin){return encodeData(origin, CHARSET_UTF_8).toUpperCase();}/*** 默認使用的utf-8進行編碼,16位小寫* @param origin* @return*/public static String encodeData16(String origin){return encodeData(origin, CHARSET_UTF_8).substring(8,24);}/*** 默認使用的utf-8進行編碼,16位大寫* @param origin* @return*/public static String encodeData16UpperCase(String origin){return encodeData(origin, CHARSET_UTF_8).substring(8, 24).toUpperCase();}private static String byteArrayToHexString(byte b[]) {StringBuffer resultSb = new StringBuffer();for (int i = 0; i < b.length; i++) {resultSb.append(byteToHexString(b[i]));}return resultSb.toString();}private static String byteToHexString(byte b) {int n = b;if (n < 0) {n += 256;}int d1 = n / 16;int d2 = n % 16;return hexDigIts[d1] + hexDigIts[d2];}public static void main(String[] args) {String username = "張三";System.out.println(encodeData16(username));System.out.println(encodeData16UpperCase(username));System.out.println(encodeData32(username));System.out.println(encodeData32UpperCase(username));}}

打印結果如下:

a314529aaa0fbe95 A314529AAA0FBE95 615db57aa314529aaa0fbe95b3e95bd3 615DB57AA314529AAA0FBE95B3E95BD3

總結

以上是生活随笔為你收集整理的常见加密工具类Base64、DES、AES、RSA、MD5汇总的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。