更新時間:2022-06-28 10:37:46 來源:動力節點 瀏覽1742次
Java加密和解密的方式有很多,但有不少小伙伴不清楚Java AES加密解密是什么,下面就由動力節點小編來告訴大家。
AES代表高級加密標準,是加密敏感數據最常用的對稱算法,可用于軟件和硬件。
AES算法是對稱的,這意味著它只使用一個密鑰進行加密和解密,由于這個原因,密鑰必須在發送方和接收方之間共享。
該標準具有三種密鑰大小,包括128、192和 ,256并且每個密碼都以位塊的形式加密和解密數據128。
密鑰大小分別對 、 和 的數據執行、和10輪12次14,從而使它們之間的算法更強。128192256256
默認情況下,AES 算法的 java 實現使用128密鑰大小,在本教程中,我們將實現該算法來加密和解密消息。
為了生成用于加密和解密消息的密鑰,我們將使用javagetInstance()中類的方法KeyGenerator并將字符串傳遞AES給該方法。
如果沒有提供程序支持指定算法的 a 和如果提供的算法是,則該getInstance()方法拋出一個。NoSuchAlgorithmExceptionKeyGeneratorSpiNullPointerExceptionnull
這KeyGenerator將創建一個 AES 算法的實例,我們將使用該算法使用generateKey()類的方法生成密鑰。
這個類生成一個對稱密鑰,一旦生成了一個密鑰,同一個對象就可以用來創建其他密鑰。
使用 的encodeToString()方法Base64.Encoder通過將結果記錄到控制臺來查看生成的密鑰字符串。
package com.encryption;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;
public class AESEncryption {
public static void main(String[] args) throws NoSuchAlgorithmException {
KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
SecretKey secretKey = keyGenerator.generateKey();
String secretKeyString =
Base64.getEncoder().encodeToString(secretKey.getEncoded());
System.out.println("generated key = "+secretKeyString);
}
}
輸出:
生成的密鑰 = JPZJ7ut162hnlpFh2Cbg2w==
要加密消息,請創建一個Cipher對象并使用getInstance()with 參數AES/CBC/PKCS5Padding作為轉換來創建算法的實例。
轉換有模式和填充,在我們的例子中,我們將使用CBC模式,它代表密碼塊鏈接,并PKCS5Padding作為填充。
默認模式是ECB,但由于它不支持多個數據塊,我們將使用CBC,這是塊密碼的一種操作模式。
密碼塊鏈接模式使用初始化向量,也稱為IV,它是用于提供初始狀態的密碼算法的輸入,并且要求是唯一的。
算法中引入了填充,因此如果要加密的字符串不是塊大小的精確倍數,則在加密之前通過添加填充字符串來完成填充。
因為我們將為創建類的init()方法提供一個初始化向量,并將密鑰字節傳遞給它的構造函數,用作初始化向量。CipherIvParameterSpec
調用init()方法并通過Cipher.ENCRYPT_MODE,SecretKey最后IvParameterSpec創建對象。
創建一個隨機文本并調用 的doFinal()方法Cipher并將消息字節傳遞給該方法以執行加密。
該doFinal()方法返回一個包含加密消息的字節數組,我們可以使用該encodeToString()方法將字節轉換為字符串并將其內容記錄到控制臺以驗證加密是否成功。
package com.encryption;
import javax.crypto.*;
import javax.crypto.spec.IvParameterSpec;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;
public class AESEncryption {
public static void main(String[] args) throws
NoSuchAlgorithmException, NoSuchPaddingException,
InvalidKeyException, IllegalBlockSizeException,
BadPaddingException, InvalidAlgorithmParameterException {
KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
SecretKey secretKey = keyGenerator.generateKey();
String secretKeyString =
Base64.getEncoder().encodeToString(secretKey.getEncoded());
System.out.println("generated key = "+secretKeyString);
//Encrypt Hello world message
Cipher encryptionCipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
byte[] InitVectorBytes = keyGenerator.generateKey().getEncoded();
IvParameterSpec parameterSpec = new IvParameterSpec(InitVectorBytes);
encryptionCipher.init(Cipher.ENCRYPT_MODE,secretKey,parameterSpec);
String message = "Hello world";
byte[] encryptedMessageBytes =
encryptionCipher.doFinal(message.getBytes());
String encryptedMessage =
Base64.getEncoder().encodeToString(encryptedMessageBytes);
System.out.println("Encrypted message = "+encryptedMessage);
}
}
輸出:
生成的密鑰 = hSJcGUPIj4T4DbncAjes5w==
加密消息 = /PLOtvd+J/7KLGOdPaVZtg==
由于我們已經有了一個初始化向量和一個密鑰,我們需要Cipher像之前一樣創建一個新對象,并在方法中使用AES/CBC/PKCS5Padding轉換。getInstance()
該init()方法唯一改變的參數是我們執行解密操作時的模式,我們需要Cipher.DECRYPT_MODE作為該方法的第一個參數傳遞。
通過將返回的結果傳遞給構造函數并將該方法返回的字節轉換為doFinal()字符串String()并登錄到控制臺以驗證解密的消息是我們的原始消息。
package org.arpit.java2blog;
import javax.crypto.*;
import javax.crypto.spec.IvParameterSpec;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;
public class AESEncryption {
public static void main(String[] args) throws
NoSuchAlgorithmException, NoSuchPaddingException,
InvalidKeyException, IllegalBlockSizeException,
BadPaddingException, InvalidAlgorithmParameterException {
KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
SecretKey secretKey = keyGenerator.generateKey();
String secretKeyString =
Base64.getEncoder().encodeToString(secretKey.getEncoded());
System.out.println("generated key = "+secretKeyString);
//Encrypt Hello world message
Cipher encryptionCipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
byte[] InitVectorBytes = keyGenerator.generateKey().getEncoded();
IvParameterSpec parameterSpec = new IvParameterSpec(InitVectorBytes);
encryptionCipher.init(Cipher.ENCRYPT_MODE,secretKey,parameterSpec);
String message = "Hello world";
byte[] encryptedMessageBytes =
encryptionCipher.doFinal(message.getBytes());
String encryptedMessage =
Base64.getEncoder().encodeToString(encryptedMessageBytes);
System.out.println("Encrypted message = "+encryptedMessage);
//Decrypt the encrypted message
Cipher decryptionCipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
decryptionCipher.init(Cipher.DECRYPT_MODE,secretKey,parameterSpec);
byte[] decryptedMessageBytes =
decryptionCipher.doFinal(encryptedMessageBytes);
String decryptedMessage = new String(decryptedMessageBytes);
System.out.println("decrypted message ="+decryptedMessage);
}
}
輸出:
生成的密鑰 = hSJcGUPIj4T4DbncAjes5w==
加密消息 = /PLOtvd+J/7KLGOdPaVZtg==
解密消息=Hello world
以上就是關于“Java AES加密解密示例”介紹,大家如果想了解更多相關知識,可以關注一下動力節點的Java視頻教程,里面的課程內容從入門到精通,細致全面,通俗易懂,很適合沒有基礎的小伙伴學習,希望對大家能夠有所幫助。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習