JAVA各种加密与解密方式( 二 )
4.AES(Advanced Encryption Standard) 加密/解密
高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称 Rijndael 加密法,是美国联邦政府采用的一种区块加密标准 。这个标准用来替代原先的 DES,已经被多方分析且广为全世界所使用 。简单说就是 DES 的增强版,比 DES 的加密强度更高 。
AES 与 DES 一样,一共有四种加密模式:电子密码本模式(ECB)、加密分组链接模式(CBC)、加密反馈模式(CFB)和输出反馈模式(OFB) 。关于加密模式的介绍,推荐这篇文章:高级加密标准AES的工作模式(ECB、CBC、CFB、OFB)
示例代码:
import javax.crypto.Cipher;import javax.crypto.spec.IvParameterSpec;import javax.crypto.spec.SecretKeySpec; public class AESUtil {public static final String algorithm = "AES"; // AES/CBC/NOPaddin // AES 默认模式 // 使用CBC模式, 在初始化Cipher对象时, 需要增加参数, 初始化向量IV : IvParameterSpec iv = new // IvParameterSpec(key.getBytes()); // NOPadding: 使用NOPadding模式时, 原文长度必须是8byte的整数倍 public static final String transformation = "AES/CBC/NOPadding"; public static final String key = "1234567812345678";/**** 加密* @param original 需要加密的参数(注意必须是16位)* @return* @throws Exception*/ public static String encryptByAES(String original) throws Exception {// 获取CipherCipher cipher = Cipher.getInstance(transformation);// 生成密钥SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), algorithm);// 指定模式(加密)和密钥// 创建初始化向量IvParameterSpec iv = new IvParameterSpec(key.getBytes());cipher.init(Cipher.ENCRYPT_MODE, keySpec, iv);// cipher.init(Cipher.ENCRYPT_MODE, keySpec);// 加密byte[] bytes = cipher.doFinal(original.getBytes());return Base64Util.encryptBASE64(bytes); }/*** 解密* @param encrypted 需要解密的参数* @return* @throws Exception*/ public static String decryptByAES(String encrypted) throws Exception {// 获取CipherCipher cipher = Cipher.getInstance(transformation);// 生成密钥SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), algorithm);// 指定模式(解密)和密钥// 创建初始化向量IvParameterSpec iv = new IvParameterSpec(key.getBytes());cipher.init(Cipher.DECRYPT_MODE, keySpec, iv);// cipher.init(Cipher.DECRYPT_MODE, keySpec);// 解密byte[] bytes = cipher.doFinal(Base64Util.decryBASE64(encrypted));return new String(bytes); } }5.HMAC(Hash Message Authentication Code,散列消息鉴别码)
5.HMAC(Hash Message Authentication Code,散列消息鉴别码)使用一个密钥生成一个固定大小的小数据块,即MAC,并将其加入到消息中,然后传输 。接收方利用与发送方共享的密钥进行鉴别认证,示例:
import javax.crypto.KeyGenerator;import javax.crypto.Mac;import javax.crypto.SecretKey;import javax.crypto.spec.SecretKeySpec; public class HMACUtil {public static final String KEY_MAC = "HmacMD5";/**** 初始化HMAC密钥* @return* @throws Exception*/ public static String initMacKey() throws Exception{KeyGenerator keyGenerator = KeyGenerator.getInstance(KEY_MAC);SecretKey secreKey = keyGenerator.generateKey();return Base64Util.encryptBASE64(secreKey.getEncoded()); }/*** HMAC加密* @param data* @param key* @return* @throws Exception*/ public static byte[] encryHMAC(byte[] data, String key) throws Exception{SecretKey secreKey = new SecretKeySpec(Base64Util.decryBASE64(key), KEY_MAC);Mac mac = Mac.getInstance(secreKey.getAlgorithm());mac.init(secreKey);return mac.doFinal(); } }
6.恺撒加密
在密码学中,恺撒密码是一种最简单并且最广为人知的加密技术 。
它是一种替换加密的技术,明文中的所欲字母都在字母表上向后(或向前)按照一个固定的数目进行偏移后被替换成密文 。
例如:当偏移量是3的时候,所有的字母A将被替换成D,B变成E,以此类推 。
这个加密方法是以恺撒的名字命名的,当年恺撒曾用此方法与其将军们进行联系 。
恺撒密码通常被座位其他更复杂的加密方法中的一个步骤 。

文章插图
示例代码:
public class KaisaUtil {/**** 使用凯撒加密方式加密数据* @param orignal 原文* @param key 密钥* @return 加密后的字符*/ private static String encryptKaisa(String orignal, int key) {//将字符串转换为数组char[] chars = orignal.toCharArray();StringBuffer buffer = new StringBuffer();//遍历数组for(char aChar : chars) {//获取字符的ASCII编码int asciiCode = aChar;//偏移数据asciiCode += key;//将偏移后的数据转为字符char result = (char)asciiCode;//拼接数据buffer.Append(result);}return buffer.toString(); }/*** 使用凯撒加密方式解密数据** @param encryptedData :密文* @param key:密钥* @return : 源数据*/ private static String decryptKaiser(String encryptedData, int key) {// 将字符串转为字符数组char[] chars = encryptedData.toCharArray();StringBuilder sb = new StringBuilder();// 遍历数组for (char aChar : chars) {// 获取字符的ASCII编码int asciiCode = aChar;// 偏移数据asciiCode -= key;// 将偏移后的数据转为字符char result = (char) asciiCode;// 拼接数据sb.append(result);}return sb.toString(); }public static void main(String[] args) {String str = "open fire";String encode = encryptKaisa(str, 3);System.out.println("加密后:"+encode);String decode = decryptKaiser(encode, 3);System.out.println("解密后:"+decode);} }
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- java分别使用递归和非递归实现二叉树中序遍历
- 为什么Nano IPS这么火?
- java正则-取出指定字符串之间的内容
- 项目中不可忽视的JavaScript优化技巧
- 疑难件是什么意思?
- Java程序员必须知道的Java10特性
- java8中自带常用的函数式接口
- 在Java中使用Optional的开销很大 - pkolaczk
- Java 常用代码汇总
- 极简Redis使用