JDK自带方法实现AES对称加密
发表于:2024-11-25 作者:千家信息网编辑
千家信息网最后更新 2024年11月25日,请看代码。 1 package jdbc.pro.lin; 2 3 import java.security.InvalidAlgorithmParameterException; 4 im
千家信息网最后更新 2024年11月25日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安全错误
数据库的锁怎样保障安全
怎么查看硬件服务器ip
半百里网络技术有限公司
区块链数据库是什么意思
江苏地区服务器连接不成功云空间
iptv网络打印服务器
书法数据库
2000数据库怎么设置远程访问
武术数据库
华为服务器配国产系统
linux软件开发方向
基层网络安全工作存在问题
称重数据库
服务器开不起来
哈弗html5数据库
pvp.net服务器超时
组态屏软件开发优缺点
文档数据库的缺点
对网络安全的要求
服务器 开发语言
代理请检查服务器设置
广州省网络安全等级保护
现在主流的软件开发语言是
科技互联网英语单词
我的世界服务器免费模式
mysql 服务器管理员
倡导文明上网 加强网络安全
网络安全宣传周资料2020年
数据库的出现解决了什么问题
联发科 软件开发面试
咋运行腾讯云服务器