作这个加密解密我是在网上找了好多的东西以为都不大合适,因而本身整理了一下这个加密与解密的过程,同时把加解密与MD5的那个工具类都放出来,至于原理什么的在前面的MD文章里面已经说了一个大概java
public static void main(String[] args) {
SpringApplication.run(WhblogApplication.class, args);
// 1.测试MD5
// String password = "starry12345";
// System.out.println(WHEncryptTools.MD5Encode(password,"utf-8")+"md5的加密是");
// 2.测试RSA
try {
KeyPair keyPair = WHEncryptTools.genKeyPair(1024);
PrivateKey privateKey = keyPair.getPrivate();
WHEncryptTools.saveKeyAsPemFormat(privateKey,"rsa_private_key.pem");
System.out.println("新建私钥是:"+new String(Base64.getEncoder().encode(privateKey.getEncoded())));
PublicKey publicKey = keyPair.getPublic();
WHEncryptTools.saveKeyAsPemFormat(publicKey,"rsa_public_key.pem");
System.out.println("新建公钥是:"+new String(Base64.getEncoder().encode(publicKey.getEncoded())));
PrivateKey privateKey2 = WHEncryptTools.getPemPrivateKey("rsa_private_key.pem","RSA");
System.out.println("读取私钥是:"+new String(Base64.getEncoder().encode(privateKey2.getEncoded())));
PublicKey publicKey2 = WHEncryptTools.getPemPublicKey("rsa_public_key.pem");
System.out.println("读取公钥是:"+new String(Base64.getEncoder().encode(publicKey2.getEncoded())));
String teststr = "leewihong";
byte [] testhello = WHEncryptTools.RSAEncrypt(teststr.getBytes(),publicKey);
System.out.println("加密后:"+new String(testhello));
byte [] decryhello = WHEncryptTools.RSADecrypt(testhello,privateKey);
System.out.println("解密后:"+new String(decryhello));
} catch (Exception e) {
e.printStackTrace();
}
}
复制代码
这段代码是包含有MD5的测试在里头的,MD5想要测试直接把注释去掉就能够了的git
package com.gz.whblog.utils;
import javax.crypto.Cipher;
import java.io.*;
import java.security.*;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.openssl.PEMReader;
import org.bouncycastle.openssl.PEMWriter;
import org.bouncycastle.util.io.pem.PemObject;
public class WHEncryptTools {
static {
Security.addProvider(new BouncyCastleProvider());
}
private static final String hexDigIts[] = {"0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"};
/**
* @description: MD5加密,用于存储在数据库中的密码是MD5加密的
*
* @return: md5加密后的32位字符串
**/
public static String MD5Encode(String orign,String charsetname){
String resultString = null;
try {
resultString = new String(orign);
MessageDigest md = MessageDigest.getInstance("MD5");
if (charsetname == null || charsetname.equals("")){
resultString = byteArrayToHexString(md.digest(resultString.getBytes()));
}
else {
resultString = byteArrayToHexString(md.digest(resultString.getBytes(charsetname)));
}
}
catch (Exception e){
e.printStackTrace();
}
return resultString;
}
public static String byteArrayToHexString(byte b[]){
StringBuffer resultSb = new StringBuffer();
for(int i = 0; i < b.length; i++){
resultSb.append(byteToHexString(b[i]));
}
return resultSb.toString();
}
public static String byteToHexString(byte b){
int n = b;
if(n < 0){
n += 256;
}
int d1 = n / 16;
int d2 = n % 16;
return hexDigIts[d1] + hexDigIts[d2];
}
/**
* @description: RSA加密,生成密钥对
*
* @return:
**/
public static KeyPair genKeyPair(int KeyLength) throws Exception{
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
keyPairGenerator.initialize(1024);
return keyPairGenerator.generateKeyPair();
}
/**
* @description: 把生成的公钥私钥文件保存为PEM文件
*
* @return:
**/
public static void saveKeyAsPemFormat(Key key, String pem) throws IOException {
PEMWriter pemWriter = new PEMWriter(new FileWriter(pem));
pemWriter.writeObject(key);
pemWriter.flush();
pemWriter.close();
}
/**
* @description: 从项目文件结构中获取私钥pem文件
*
* @return:
**/
public static PrivateKey getPemPrivateKey(String filename, String algorithm) throws Exception {
BufferedReader br = new BufferedReader(new FileReader(filename));
Security.addProvider(new BouncyCastleProvider());
PEMReader pp = new PEMReader(br);
PemObject pem = pp.readPemObject();
byte[] content = pem.getContent();
pp.close();
PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(content);
KeyFactory kf = KeyFactory.getInstance(algorithm);
return kf.generatePrivate(spec);
}
/**
* @description: 从项目文件夹获取公钥pem文件
*
* @return:
**/
public static PublicKey getPemPublicKey(String pubKeyStr) throws IOException, NoSuchAlgorithmException, InvalidKeySpecException {
BufferedReader br = new BufferedReader(new FileReader(pubKeyStr));
Security.addProvider(new BouncyCastleProvider());
PEMReader pp = new PEMReader(br);
PemObject pem = pp.readPemObject();
byte[] content = pem.getContent();
pp.close();
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
X509EncodedKeySpec pubSpec = new X509EncodedKeySpec(content);
RSAPublicKey pubKey = (RSAPublicKey) keyFactory.generatePublic(pubSpec);
return pubKey;
}
/**
* @description: 公钥加密返回加密数据
*
* @return:
**/
public static byte[] RSAEncrypt(byte[] content, PublicKey publicKey) throws Exception {
Cipher cipher = Cipher.getInstance("RSA");// java默认"RSA"="RSA/ECB/PKCS1Padding"
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
return cipher.doFinal(content);
}
/**
* @description: // 私钥解密获得返回的真实数据
*
* @return:
**/
public static byte[] RSADecrypt(byte[] content, PrivateKey privateKey) throws Exception {
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, privateKey);
return cipher.doFinal(content);
}
}
复制代码
<!-- https://mvnrepository.com/artifact/org.bouncycastle/bcprov-jdk15 -->
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15</artifactId>
<version>1.46</version>
</dependency>
复制代码
Github同步更新我的学习笔记,若是这篇文章对你有好处点个星星你不亏 WiHongNoteBookgithub