对称加密算法之四

2021-12-09  本文已影响0人  喏喏2021

1. 相关概念

2. 常见算法

3. 代码示例

上面提到,工作模式不同,运算的过程也是不一样的,当然代码实现也是不一样的,下面分别介绍

  1. ECB模式
import java.security.SecureRandom;
import java.util.Base64;

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

String content = "abc"; //原文
String encryptKey = "1234567890ABCDEF";  //16字节,128位密钥

//加密
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); //设置算法、工作模式、填充模式
SecretKey key = new SecretKeySpec(encryptKey.getBytes(),"AES");
cipher.init(Cipher.ENCRYPT_MODE, key); //加密模式
byte[] encryptBytes = cipher.doFinal(content.getBytes("UTF-8")); //得到加密的信息
System.out.println("encrypt data:" + Base64.getEncoder().encodeToString(encryptBytes));
//WRsSrNWboZEAWOh27H9ziw==

//解密
Cipher cipher1 = Cipher.getInstance("AES/ECB/PKCS5Padding");
SecretKey key1 = new SecretKeySpec(encryptKey.getBytes(),"AES");
cipher1.init(Cipher.DECRYPT_MODE, key1); //解密信息
byte[] decryptBytes1 = cipher1.doFinal(encryptBytes); //得到原文
System.out.println("decrypt data:" + new String(decryptBytes1,"UTF-8"));
//abc
  1. CBC模式
import java.security.SecureRandom;
import java.util.Base64;

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

String content = "abc";
String encryptKey = "1234567890ABCDEF"; 

//加密
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
SecretKey key = new SecretKeySpec(encryptKey.getBytes(),"AES");
//生成16字节的iv参数,提高安全性
SecureRandom sr = SecureRandom.getInstanceStrong();
byte[] iv = sr.generateSeed(16);
IvParameterSpec ivps = new IvParameterSpec(iv);
cipher.init(Cipher.ENCRYPT_MODE, key, ivps);
byte[] encryptBytes = cipher.doFinal(content.getBytes("UTF-8"));
System.out.println("encrypt data:" + Base64.getEncoder().encodeToString(encryptBytes));
//2+3Ju+DF4gwd1bDqs3UrhQ==
//注:因为有随机码的存在,所以每次生成的结果也不是相同的,较安全

//解密
Cipher cipher1 = Cipher.getInstance("AES/CBC/PKCS5Padding");
SecretKey key1 = new SecretKeySpec(encryptKey.getBytes(),"AES");
cipher1.init(Cipher.DECRYPT_MODE, key1,ivps);
byte[] decryptBytes1 = cipher1.doFinal(encryptBytes);
System.out.println("decrypt data:" + new String(decryptBytes1,"UTF-8"));
//abc

上面iv参数因为是随机产生的,本身不需要保密,可以跟着密文一起返回,解密时可以提取出来备用

上一篇 下一篇

猜你喜欢

热点阅读