JDK自带方法实现AES对称加密
发表于:2025-01-21 作者:千家信息网编辑
千家信息网最后更新 2025年01月21日,请看代码。 1 package jdbc.pro.lin; 2 3 import java.security.InvalidAlgorithmParameterException; 4 im
千家信息网最后更新 2025年01月21日JDK自带方法实现AES对称加密
请看代码。
1 package jdbc.pro.lin; 2 3 import java.security.InvalidAlgorithmParameterException; 4 import java.security.InvalidKeyException; 5 import java.security.NoSuchAlgorithmException; 6 7 import javax.crypto.BadPaddingException; 8 import javax.crypto.Cipher; 9 import javax.crypto.IllegalBlockSizeException; 10 import javax.crypto.KeyGenerator; 11 import javax.crypto.NoSuchPaddingException; 12 import javax.crypto.SecretKey; 13 import javax.crypto.spec.IvParameterSpec; 14 import javax.crypto.spec.SecretKeySpec; 15 16 import org.apache.commons.codec.binary.Base64; 17 18 public class MyAES { 19 /** 20 * 注意key和加密用到的字符串是不一样的 加密还要指定填充的加密模式和填充模式 AES密钥可以是128或者256,加密模式包括ECB, CBC等 21 * ECB模式是分组的模式,CBC是分块加密后,每块与前一块的加密结果异或后再加密 第一块加密的明文是与IV变量进行异或 22 */ 23 public static final String KEY_ALGORITHM = "AES"; 24 public static final String ECB_CIPHER_ALGORITHM = "AES/ECB/PKCS5Padding"; 25 public static final String CBC_CIPHER_ALGORITHM = "AES/CBC/PKCS5Padding"; 26 public static final String PLAIN_TEXT = "MANUTD is the greatest club in the world"; 27 28 /** 29 * IV(Initialization Value)是一个初始值,对于CBC模式来说,它必须是随机选取并且需要保密的 30 * 而且它的长度和密码分组相同(比如:对于AES 128为128位,即长度为16的byte类型数组) 31 * 32 */ 33 public static final byte[] IVPARAMETERS = new byte[] { 1, 2, 3, 4, 5, 6, 7, 34 8, 9, 10, 11, 12, 13, 14, 15, 16 }; 35 36 public static void main(String[] arg) { 37 byte[] secretBytes = generateAESSecretKey(); 38 SecretKey key = restoreSecretKey(secretBytes); 39 byte[] encodedText = AesEcbEncode(PLAIN_TEXT.getBytes(), key); 40 41 System.out.println("AES ECB encoded with Base64: " + Base64.encodeBase64String(encodedText)); 42 System.out.println("AES ECB decoded: " 43 + AesEcbDecode(encodedText, key)); 44 45 46 47 encodedText = AesCbcEncode(PLAIN_TEXT.getBytes(), key, IVPARAMETERS); 48 49 50 System.out.println("AES CBC encoded with Base64: " + Base64.encodeBase64String(encodedText)); 51 System.out.println("AES CBC decoded: " 52 + AesCbcDecode(encodedText, key, 53 IVPARAMETERS)); 54 } 55 56 /** 57 * 使用ECB模式进行加密。 加密过程三步走: 1. 传入算法,实例化一个加解密器 2. 传入加密模式和密钥,初始化一个加密器 3. 58 * 调用doFinal方法加密 59 * 60 * @param plainText 61 * @return 62 */ 63 public static byte[] AesEcbEncode(byte[] plainText, SecretKey key) { 64 65 try { 66 67 Cipher cipher = Cipher.getInstance(ECB_CIPHER_ALGORITHM); 68 cipher.init(Cipher.ENCRYPT_MODE, key); 69 return cipher.doFinal(plainText); 70 } catch (NoSuchAlgorithmException | NoSuchPaddingException 71 | InvalidKeyException | IllegalBlockSizeException 72 | BadPaddingException e) { 73 // TODO Auto-generated catch block 74 e.printStackTrace(); 75 } 76 return null; 77 } 78 79 /** 80 * 使用ECB解密,三步走,不说了 81 * 82 * @param decodedText 83 * @param key 84 * @return 85 */ 86 public static String AesEcbDecode(byte[] decodedText, SecretKey key) { 87 try { 88 Cipher cipher = Cipher.getInstance(ECB_CIPHER_ALGORITHM); 89 cipher.init(Cipher.DECRYPT_MODE, key); 90 return new String(cipher.doFinal(decodedText)); 91 } catch (NoSuchAlgorithmException | NoSuchPaddingException 92 | InvalidKeyException | IllegalBlockSizeException 93 | BadPaddingException e) { 94 // TODO Auto-generated catch block 95 e.printStackTrace(); 96 } 97 return null; 98 99 }100 101 /**102 * CBC加密,三步走,只是在初始化时加了一个初始变量103 * 104 * @param plainText105 * @param key106 * @param IVParameter107 * @return108 */109 public static byte[] AesCbcEncode(byte[] plainText, SecretKey key,110 byte[] IVParameter) {111 try {112 IvParameterSpec ivParameterSpec = new IvParameterSpec(IVParameter);113 114 Cipher cipher = Cipher.getInstance(CBC_CIPHER_ALGORITHM);115 cipher.init(Cipher.ENCRYPT_MODE, key, ivParameterSpec);116 return cipher.doFinal(plainText);117 118 } catch (NoSuchAlgorithmException | NoSuchPaddingException119 | InvalidKeyException | InvalidAlgorithmParameterException120 | IllegalBlockSizeException | BadPaddingException e) {121 // TODO Auto-generated catch block122 e.printStackTrace();123 }124 return null;125 }126 127 /**128 * CBC 解密129 * 130 * @param decodedText131 * @param key132 * @param IVParameter133 * @return134 */135 public static String AesCbcDecode(byte[] decodedText, SecretKey key,136 byte[] IVParameter) {137 IvParameterSpec ivParameterSpec = new IvParameterSpec(IVParameter);138 139 try {140 Cipher cipher = Cipher.getInstance(CBC_CIPHER_ALGORITHM);141 cipher.init(Cipher.DECRYPT_MODE, key, ivParameterSpec);142 return new String(cipher.doFinal(decodedText));143 } catch (NoSuchAlgorithmException | NoSuchPaddingException144 | InvalidKeyException | InvalidAlgorithmParameterException145 | IllegalBlockSizeException | BadPaddingException e) {146 // TODO Auto-generated catch block147 e.printStackTrace();148 }149 150 return null;151 152 }153 154 /**155 * 1.创建一个KeyGenerator 2.调用KeyGenerator.generateKey方法156 * 由于某些原因,这里只能是128,如果设置为256会报异常,原因在下面文字说明157 * 158 * @return159 */160 public static byte[] generateAESSecretKey() {161 KeyGenerator keyGenerator;162 try {163 keyGenerator = KeyGenerator.getInstance(KEY_ALGORITHM);164 // keyGenerator.init(256);165 return keyGenerator.generateKey().getEncoded();166 } catch (NoSuchAlgorithmException e) {167 // TODO Auto-generated catch block168 e.printStackTrace();169 }170 return null;171 }172 173 /**174 * 还原密钥175 * 176 * @param secretBytes177 * @return178 */179 public static SecretKey restoreSecretKey(byte[] secretBytes) {180 SecretKey secretKey = new SecretKeySpec(secretBytes, KEY_ALGORITHM);181 return secretKey;182 }183 }
因为某些国家的进口管制限制,Java发布的运行环境包中的加解密有一定的限制。比如默认不允许256位密钥的AES加解密,解决方法就是修改策略文件。
官方网站提供了JCE无限制权限策略文件的下载:
JDK6的下载地址:
ht tp://w ww.orac le.com/technetwork/j ava/javase/downloads/jce-6-download-429243.html
JDK7的下载地址:
ht tp: //ww w.oracle.com/tech network/java/javase/downloads/jce-7-download-432124.html
下载后解压,可以看到local_policy.jar和US_export_policy.jar以及readme.txt。
如果安装了JRE,将两个jar文件放到%JRE_HOME%\lib\security下覆盖原来文件,记得先备份。
如果安装了JDK,将两个jar文件也放到%JDK_HOME%\jre\lib\security下。
PS:我也没试过,不行别找我。
KeyFactory最常用的操作就是通过密钥规范获得对应的密钥。像DES 3DES都是通过这样获得的,而AES只要一般的密钥规范就可以了,因此不需要KeyFactory.
加密
模式
密钥
文件
方法
三步走
两个
原因
变量
地址
就是
策略
长度
分组
限制
不行
相同
代码
只是
国家
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
阿里云linux服务器
蔚来员工使用公司服务器
左岸读书软件开发
代理服务器 国内
中文常用数据库软件有哪些
机房服务器管理方法
中山app软件开发有用吗
管家婆数据库配置
达梦数据库控制台工具
苏州阿里云服务器维护
上位机如何与串口服务器通信
中行网络安全实验室
linux查看服务器时间
轻量服务器怎么设置安全组
百优网络技术有限公司
烧录软件开发
数据库怎么删除一段时间前的数据
云服务器怎么中转网址
丛英语听力软件开发
如何查看打印服务器任务
左岸读书软件开发
互联网软件开发反向
新疆电信软件开发待遇
db1是关系型数据库吗
信息与文献检索数据库类型
绘梦网络安全小组
数据库合适选择字段类型长度
网络安全报警2
阿里云服务器怎么登陆
微信pc网络代理服务器