一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - Java實現AES加密算法的簡單示例分享

Java實現AES加密算法的簡單示例分享

2020-04-16 14:04匆忙擁擠repeat JAVA教程

這篇文章主要介紹了Java實現AES加密算法的簡單示例分享,AES算法是基于對密碼值的置換和替代,需要的朋友可以參考下

高級加密標準(英語:Advanced Encryption Standard,縮寫:AES),在密碼學中又稱Rijndael加密法,是美國聯邦政府采用的一種區塊加密標準。這個標準用來替代原先的DES,已經被多方分析且廣為全世界所使用。
大多數AES計算是在一個特別的有限域完成的。
AES加密過程是在一個4×4的字節矩陣上運作,這個矩陣又稱為“狀態(state)”,其初值就是一個明文區塊(矩陣中一個元素大小就是明文區塊中的一個Byte)。(Rijndael加密法因支持更大的區塊,其矩陣行數可視情況增加)加密時,各輪AES加密循環(除最后一輪外)均包含4個步驟:

  • AddRoundKey — 矩陣中的每一個字節都與該次輪秘鑰(round key)做XOR運算;每個子密鑰由密鑰生成方案產生。
  • SubBytes — 通過個非線性的替換函數,用查找表的方式把每個字節替換成對應的字節。
  • ShiftRows — 將矩陣中的每個橫列進行循環式移位。
  • MixColumns — 為了充分混合矩陣中各個直行的操作。這個步驟使用線性轉換來混合每列的四個字節。

最后一個加密循環中省略MixColumns步驟,而以另一個AddRoundKey取代。

Java基本實現:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
package com.stone.security;
 
import java.util.Arrays;
 
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
 
/**
 * AES 算法 對稱加密,密碼學中的高級加密標準 2005年成為有效標準
 */
public class AES {
 static Cipher cipher;
 static final String KEY_ALGORITHM = "AES";
 static final String CIPHER_ALGORITHM_ECB = "AES/ECB/PKCS5Padding";
 static final String CIPHER_ALGORITHM_CBC = "AES/CBC/PKCS5Padding";
/**
 * AES/CBC/NoPadding 要求
 * 密鑰必須是16位的;Initialization vector (IV) 必須是16位
 * 待加密內容的長度必須是16的倍數,如果不是16的倍數,就會出如下異常:
 * javax.crypto.IllegalBlockSizeException: Input length not multiple of 16 bytes
 *
 * 由于固定了位數,所以對于被加密數據有中文的, 加、解密不完整
 *
 * 可 以看到,在原始數據長度為16的整數n倍時,假如原始數據長度等于16*n,則使用NoPadding時加密后數據長度等于16*n,
 * 其它情況下加密數據長 度等于16*(n+1)。在不足16的整數倍的情況下,假如原始數據長度等于16*n+m[其中m小于16],
 * 除了NoPadding填充之外的任何方 式,加密數據長度都等于16*(n+1).
 */
 static final String CIPHER_ALGORITHM_CBC_NoPadding = "AES/CBC/NoPadding";
 
 static SecretKey secretKey;
  
 public static void main(String[] args) throws Exception {
 method1("a*jal)k32J8czx囙國為國寬");
 method2("a*jal)k32J8czx囙國為國寬");
 method3("a*jal)k32J8czx囙國為國寬");
  
 method4("123456781234囙為國寬");// length = 16
 method4("12345678abcdefgh");// length = 16
  
 }
 
 /**
 * 使用AES 算法 加密,默認模式 AES/ECB
 */
 static void method1(String str) throws Exception {
 cipher = Cipher.getInstance(KEY_ALGORITHM);
 //KeyGenerator 生成aes算法密鑰
 secretKey = KeyGenerator.getInstance(KEY_ALGORITHM).generateKey();
 System.out.println("密鑰的長度為:" + secretKey.getEncoded().length);
  
 cipher.init(Cipher.ENCRYPT_MODE, secretKey);//使用加密模式初始化 密鑰
 byte[] encrypt = cipher.doFinal(str.getBytes()); //按單部分操作加密或解密數據,或者結束一個多部分操作。
  
 System.out.println("method1-加密:" + Arrays.toString(encrypt));
 cipher.init(Cipher.DECRYPT_MODE, secretKey);//使用解密模式初始化 密鑰
 byte[] decrypt = cipher.doFinal(encrypt);
 System.out.println("method1-解密后:" + new String(decrypt));
  
 }
 
 /**
 * 使用AES 算法 加密,默認模式 AES/ECB/PKCS5Padding
 */
 static void method2(String str) throws Exception {
 cipher = Cipher.getInstance(CIPHER_ALGORITHM_ECB);
 //KeyGenerator 生成aes算法密鑰
 secretKey = KeyGenerator.getInstance(KEY_ALGORITHM).generateKey();
 System.out.println("密鑰的長度為:" + secretKey.getEncoded().length);
  
 cipher.init(Cipher.ENCRYPT_MODE, secretKey);//使用加密模式初始化 密鑰
 byte[] encrypt = cipher.doFinal(str.getBytes()); //按單部分操作加密或解密數據,或者結束一個多部分操作。
  
 System.out.println("method2-加密:" + Arrays.toString(encrypt));
 cipher.init(Cipher.DECRYPT_MODE, secretKey);//使用解密模式初始化 密鑰
 byte[] decrypt = cipher.doFinal(encrypt);
 System.out.println("method2-解密后:" + new String(decrypt));
  
 }
 
 static byte[] getIV() {
 String iv = "1234567812345678"; //IV length: must be 16 bytes long
 return iv.getBytes();
 }
 
 /**
 * 使用AES 算法 加密,默認模式 AES/CBC/PKCS5Padding
 */
 static void method3(String str) throws Exception {
 cipher = Cipher.getInstance(CIPHER_ALGORITHM_CBC);
 //KeyGenerator 生成aes算法密鑰
 secretKey = KeyGenerator.getInstance(KEY_ALGORITHM).generateKey();
 System.out.println("密鑰的長度為:" + secretKey.getEncoded().length);
  
 cipher.init(Cipher.ENCRYPT_MODE, secretKey, new IvParameterSpec(getIV()));//使用加密模式初始化 密鑰
 byte[] encrypt = cipher.doFinal(str.getBytes()); //按單部分操作加密或解密數據,或者結束一個多部分操作。
  
 System.out.println("method3-加密:" + Arrays.toString(encrypt));
 cipher.init(Cipher.DECRYPT_MODE, secretKey, new IvParameterSpec(getIV()));//使用解密模式初始化 密鑰
 byte[] decrypt = cipher.doFinal(encrypt);
 System.out.println("method3-解密后:" + new String(decrypt));
  
 }
 
 /**
 * 使用AES 算法 加密,默認模式 AES/CBC/NoPadding 參見上面對于這種mode的數據限制
 */
 static void method4(String str) throws Exception {
 cipher = Cipher.getInstance(CIPHER_ALGORITHM_CBC_NoPadding);
 //KeyGenerator 生成aes算法密鑰
 secretKey = KeyGenerator.getInstance(KEY_ALGORITHM).generateKey();
 System.out.println("密鑰的長度為:" + secretKey.getEncoded().length);
  
 cipher.init(Cipher.ENCRYPT_MODE, secretKey, new IvParameterSpec(getIV()));//使用加密模式初始化 密鑰
 byte[] encrypt = cipher.doFinal(str.getBytes(), 0, str.length()); //按單部分操作加密或解密數據,或者結束一個多部分操作。
  
 System.out.println("method4-加密:" + Arrays.toString(encrypt));
 cipher.init(Cipher.DECRYPT_MODE, secretKey, new IvParameterSpec(getIV()));//使用解密模式初始化 密鑰
 byte[] decrypt = cipher.doFinal(encrypt);
  
 System.out.println("method4-解密后:" + new String(decrypt));
  
 }
 
}

 

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 二区三区不卡不卡视频 | 四虎影院在线 | 精品精品国产自在现拍 | gay勾搭直男com| 色老板视频在线观看 | 我和子伦系列小说 | 91色视| 欧美ggg666 | 久久成人a毛片免费观看网站 | 天天夜夜啦啦啦 | 国产肥老上视频 | 91理论片午午伦夜理片久久 | 精品香蕉99久久久久网站 | 日韩亚洲欧美理论片 | 亚洲 欧美 国产 综合首页 | 国产精品一久久香蕉产线看 | 日本在线观看www免费 | 无限在线观看免费入口 | 亚洲天堂中文 | 精品一区二区三区免费站 | 亚洲成色WWW久久网站夜月 | 学生小泬无遮挡女HD | 欧美亚洲国产另类在线观看 | 国产资源中文字幕 | 欧美视频在线一区二区三区 | 亚洲一区 在线播放 | 女人国产香蕉久久精品 | 女海盗斯蒂内塔的复仇2免费观看 | 操一炮| 精品第一国产综合精品蜜芽 | 草莓在线 | 亚洲精品成人a | 国产成人h视频在线播放网站 | 91在线老师啪国自产 | 精彩国产萝视频在线 | 国产精品国产三级在线专区 | 色综合久久天天综合 | 天美影视文化传媒mv免费 | 国产精品嫩草影院一二三区 | 国内精品久久久久久久 | 国产精品密播放国产免费看 |