BouncyCastle
BouncyCastle就是一个提供了很多哈希算法和加密算法的第三方开源库。
用法:首先必须把BoucyCastle提供的文件添加至classpath。
代码实现:
package com.apesource.demo04;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.Security;
import java.util.Arrays;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.pqc.jcajce.provider.BouncyCastlePQCProvider;
//用第三方类库BouncyCastle提供RipeMD60算法加密
public class Main01 {
public static void main(String[] args) {
try {
//注册BouncyCastle提供通知类对象BouncyCastleProvider
Security.addProvider(new BouncyCastleProvider());
//获取RipeMD160算法的“消息摘要对象(加密对象)”
MessageDigest md = MessageDigest.getInstance("RipeMD160");
//更新原始数据
md.update("hello".getBytes());
//获取消息摘要
byte[] result =md.digest();
//消息摘要的字节长度和内容
System.out.println(result.length);//160位=20字节
System.out.println(Arrays.toString(result));
//16进制内容字符串
String hex = new BigInteger(1,result).toString(16);
System.out.println(hex.length());//字节=40字符
System.out.println(hex);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
}
}
对称加密算法
对称加密算法就是传统的用一个密码进行加密和解密。
从程序的角度看,加密就是一个函数,它接收密码和明文,然后输出密文。而解密则相反,它接收密码和密文,然后输出明文。
常见的对称加密算法有:
DES、AES 、IDEA
DES:DES算法由于密钥过短,可以在短时间内被暴力破解,不安全。
AES加密
AES算法是目前应用最广泛的加密算法。比较常见的工作模式是ECB 和 CBC。
ECB模式
步骤如下:
1、根据算法名称/工作模式/填充模式获取Cipher实例;
2、根据算法名称初始化一个SecretKey实例,密钥必须是指定长度;
3、使用SercetKey初始化Cipher实例,并设置加密或解密模式;
4、传入明文或密文,获得密文或明文。
代码实现:
package com.apesource.demo04;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
public class Main02 {
public static void main(String[] args) throws InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException {
//原文
String message = "Hello World";
System.out.println("Message"+message);
//128位密钥 = 16 bytes Key
byte[] key = "123877766555443221246677UIJHBwed".getBytes();
//加密
byte[] data = message.getBytes();
byte[] encrypted = encrypted(key,data);
System.out.println("Encrypt(加密):"+ Base64.getEncoder().encodeToString(encrypted));
//解密
byte[] decrypted= decrypt(key,encrypted);
System.out.println("Decrypted:"+new String(decrypted));
}
//加密
public static byte