Java实现AES数据对称加密和解密算法!
程序员文章站
2024-03-14 19:41:29
...
标题:Java实现AES数据对称加密算法!
这是一个数据加密的作业,我是自学的懂的不多,这里简单做一个笔记记录。
1,数据加密简介
从加密种类上理解数据的加密方式有单向加密和双向加密,他们的区别为如下
数据加密种类 | 理解 |
---|---|
单向加密 | 从一个方向进行加密操作不进行解密(A发送数据给B,B收到加密后的数据信息) |
双向加密 | 对数据进行加密和解密(A发送数据给B,B收到进行加密传输并解密的数据信息) |
这里解释下双向加密的对称性与非对称性
对称性与非对称性 | 理解 |
---|---|
对称加密 | 加密的秘钥与解密的秘钥是一样的 |
非对称加密 | 加密的秘钥与解密的秘钥是不一样的 |
2,AES的对称加密和解密的实现
package Secret;
import javax.crypto.*;
import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.Scanner;
/**
* @author ganxiang
* IDE IntelliJ IDEA
* @project_name and filename JavaDemo AES
* @date 2020/05/09 0009 15:06
*/
public class AES {
//1,生成秘钥
public static SecretKey generateKey() throws NoSuchAlgorithmException {
//1,指定生成AES秘钥(Advanced Encryption Standard)高级加密标准,getInstance("")返回一个 KeyGenerator对象指定**生成算法。
KeyGenerator keyGenerator =KeyGenerator.getInstance("AES");
//2,构建一个安全的随机数发生器(RNG)执行默认的随机数算法
SecureRandom secureRandom =new SecureRandom();
//3,初始化秘钥
keyGenerator.init(secureRandom);
//4,生成秘钥
SecretKey secretKey=keyGenerator.generateKey();
return secretKey;
}
//2,加密算法
public static byte [] aesAlgorithm(byte[] context,int mode,SecretKey secretKey) throws
NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {
//Cipher对象用于加密和解密的加密密码的功能
//1,getInstance()返回一个 Cipher对象实现指定的变换。
Cipher cipher =Cipher.getInstance("AES");
//2,初始化cipher,一个关键的初始化这个密码。
cipher.init(mode,secretKey);
//3,doFinal()完成多个部分的加密或解密操作,这取决于该密码是如何初始化的。
byte[] result =cipher.doFinal(context);
return result;
}
//3,对数据加密
public static byte[] encoding(String data, SecretKey secretKey) throws UnsupportedEncodingException,
IllegalBlockSizeException, InvalidKeyException, BadPaddingException, NoSuchAlgorithmException, NoSuchPaddingException {
return aesAlgorithm(data.getBytes("UTF-8"),Cipher.ENCRYPT_MODE,secretKey);
}
//4,对数据解密
public static String decoding (byte[] context,SecretKey secretKey) throws IllegalBlockSizeException,
InvalidKeyException, BadPaddingException, NoSuchAlgorithmException, NoSuchPaddingException, UnsupportedEncodingException {
return new String(aesAlgorithm(context,Cipher.DECRYPT_MODE,secretKey),"UTF-8");
}
public static void main(String[] args) {
//1,输入字符串进行加密解密
Scanner scanner =new Scanner(System.in);
String data =scanner.nextLine();
//2,指定符串进行加密解密
// String data ="hello 欢迎";
System.out.println("需要AES加密和解密的数据为:"+data);
try {
SecretKey secretKey =generateKey();
byte[] encoding =encoding(data,secretKey);
System.out.println("AES加密后的结果为:"+ new String(encoding,"UTF-8"));
System.out.println("AES解密后的结果为:"+decoding(encoding,secretKey));
} catch (NoSuchPaddingException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
e.printStackTrace();
} catch (BadPaddingException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
}
3,运行展示
上一篇: 打印1~100之间的质数