更新时间:2022-06-28 10:37:46 来源:极悦 浏览1342次
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天面授
Java就业班有基础 直达就业
业余时间 高薪转行
Java在职加薪班工作1~3年,加薪神器
工作3~5年,晋升架构
提交申请后,顾问老师会电话与您沟通安排学习