01 RSA加密算法
最常用的非对称加密算法,基于大数的因式分解数学难题
应用场景: 支付
01 私钥加密公钥解密
public static void main(String[] args) throws Exception{
// 原文
String input = "文华";
// 算法
String algorithm = "RSA";
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(algorithm);
// 生成密钥对
KeyPair keyPair = keyPairGenerator.generateKeyPair();
// 生成私钥
PrivateKey privateKey = keyPair.getPrivate();
// 生成公钥
PublicKey publicKey = keyPair.getPublic();
// 获取私钥的字节数组
byte[] privateKeyEncoded = privateKey.getEncoded();
// 获取公钥字节数组
byte[] publicKeyEncoded = publicKey.getEncoded();
// 使用base64进行编码
String privateEncodeString = Base64.encode(privateKeyEncoded);
String publicEncodeString = Base64.encode(publicKeyEncoded);
// 打印公钥和私钥
System.out.println("私钥---" + privateEncodeString);
System.out.println("公钥---" + publicEncodeString);
System.out.println("下面是加密--------");
// 创建加密对象
Cipher cipher = Cipher.getInstance(algorithm);
// 对加密进行初始化
// 第一个参数:加密的模式 第二个参数:使用私钥加密
// 我想使用私钥进行加密
cipher.init(Cipher.ENCRYPT_MODE,privateKey);
// 使用私钥进行加密
byte[] bytes = cipher.doFinal(input.getBytes());
// 加密后
String encode = Base64.encode(bytes);
System.out.println(encode);
System.out.println("下面是解密--------");
// 创建解密对象
Cipher cipher1 = Cipher.getInstance(algorithm);
// 使用公钥解密
cipher1.init(Cipher.DECRYPT_MODE,publicKey);
// 使用base64对密文进行转码
byte[] decode = Base64.decode(encode);
// 解密
byte[] bytes1 = cipher1.doFinal(decode);
// 原文
String s = new String(bytes1);
System.out.println(s);
}
02 数字签名
public static void main(String[] args) throws Exception{
String input = "123";
// 生成私钥和公钥
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
KeyPair keyPair = keyPairGenerator.generateKeyPair();
PrivateKey privateKey = keyPair.getPrivate();
PublicKey publicKey = keyPair.getPublic();
// 获取数字签名
String signature = getSignature(input, "sha256withrsa", privateKey);
System.out.println(signature);
// 校验签名,返回为true,说明没有被改过
boolean flag = verifySignature(input, "sha256withrsa", publicKey, signature);
System.out.println(flag);
}
private static boolean verifySignature(String input, String algorithm, PublicKey publicKey, String signaturedData)
throws Exception{
// 获取签名对象
Signature signature = Signature.getInstance(algorithm);
// 初始化校验
signature.initVerify(publicKey);
// 传入原文
signature.update(input.getBytes());
// 校验数据
return signature.verify(Base64.decode(signaturedData));
}
private static String getSignature(String input, String algorithm, PrivateKey privateKey) throws Exception{
// 获取签名对象
Signature signature = Signature.getInstance(algorithm);
// 初始化签名
signature.initSign(privateKey);
// 传入原文
signature.update(input.getBytes());
// 开始签名
byte[] sign = signature.sign();
// 使用base64进行编码
return Base64.encode(sign);
}