비대칭 암호화 RSA 알고리즘 코드 구현 예

비대칭 암호화 : 두 개의 키가 있습니다. 공개 키를 사용하여 암호화하는 경우 개인 키를 사용하여 암호를 해독해야합니다. 또는 개인 키를 사용하여 암호화하는 경우 공개 키를 사용하여 암호를 해독해야합니다.

암호화 및 복호화 코어 클래스 : Cipher

다음 코드는 RSA 알고리즘을 사용한 암호화 및 복호화의 예입니다. 구현 프로세스에는 키 쌍 생성, 공개 키 및 개인 키를 파일에 저장, 공개 키 및 개인 키 읽기, 일반 암호화 및 복호화가 포함됩니다. 텍스트 . 코드에 자세한 주석이 있습니다. 코드에있는 내용을 이해하지 못하는 경우 직접 주석을 달 수 있습니다.

import java.io.File;
import java.io.IOException;
import java.nio.charset.Charset;
import java.security.Key;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import javax.crypto.Cipher;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.io.FileUtils;

public class AsymmetricEncryption {
    
    

	public static void main(String[] args) throws Exception{
    
    
		String input="巅峰小苏";//需要加密的数据
		String algorithm="RSA";//加密算法
		//生成密钥对并保存在本地文件中
		generateKeyToFile(algorithm,"a.pub","a.pri");
		//读取私钥
		PrivateKey privateKey = getPrivateKey("a.pri", algorithm);
		//读取公钥
		PublicKey publicKey = getPublicKey("a.pub", algorithm);
		//加密
		String en=encryptRSA(algorithm, privateKey, input);
		System.out.println("加密:"+en);
		//解密
		String de=decryptRSA(algorithm, publicKey, en);
		System.out.println("解密:"+de);
	}
	
	/**
	 * 私钥加密
	 * @param algorithm 算法
	 * @param privateKey 私钥
	 * @param input  原文
	 * @return
	 * @throws Exception
	 */
	public static String encryptRSA(String algorithm,Key privateKey,String input)throws Exception{
    
    
		//创建加密对象
		Cipher cipher=Cipher.getInstance(algorithm);
		//对加密进行初始化,第一个参数是:加密的模式
		//第二个参数是:你想使用公钥加密还是私钥加密,这里使用的是私钥加密
		cipher.init(Cipher.ENCRYPT_MODE, privateKey);
		byte[] bytes=cipher.doFinal(input.getBytes());
		return Base64.encodeBase64String(bytes);
	}
	/**
	 * 公钥解密
	 * @param algorithm 算法
	 * @param publickey 公钥
	 * @param encrypted 密文
	 * @return
	 * @throws Exception
	 */
	public static String decryptRSA(String algorithm,Key publickey,String encrypted)throws Exception{
    
    
		Cipher cipher=Cipher.getInstance(algorithm);
		//注意:如果使用公钥加密就必须使用私钥解密,使用私钥加密就必须使用公钥解密,否则会出现异常
		cipher.init(Cipher.DECRYPT_MODE, publickey);
		//把base64密文转回字节数组
		byte[] decode=Base64.decodeBase64(encrypted);
		byte[] bytes1=cipher.doFinal(decode);
		//这里要用new String()转字符串,不能用.toString()方法,否则返回的是哈希值
		return new String(bytes1);
	}
	/**
	 * 把公钥和私钥保存到根目录
	 * @param algorithm 算法
	 * @param pubPath	公钥路径
	 * @param priPath	私钥路径
	 * @throws NoSuchAlgorithmException
	 * @throws IOException
	 */
	private static void generateKeyToFile(String algorithm,String pubPath,String priPath) throws NoSuchAlgorithmException, IOException {
    
    
		// 密钥对生成器对象
		KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(algorithm);
		// 初始化密钥长度
		keyPairGenerator.initialize(1024);
		// 生成密钥对
		KeyPair keyPair = keyPairGenerator.generateKeyPair();
		// 生成私钥
		PrivateKey privateKey = keyPair.getPrivate();
		// 获取私钥的字节数组
		byte[] privateKeyEncoded = privateKey.getEncoded();
		// 使用base64进行编码
		String privateEncodeString = Base64.encodeBase64String(privateKeyEncoded);
		System.out.println("私钥:" + privateEncodeString);
		// 生成公钥
		PublicKey publicKey = keyPair.getPublic();
		// 获取公钥的字节数组
		byte[] publicKeyEncoded = publicKey.getEncoded();
		// 使用base64进行编码
		String publicEncodeString = Base64.encodeBase64String(publicKeyEncoded);
		System.out.println("公钥:" + publicEncodeString);
		//把公钥和私钥保存到根目录
		FileUtils.writeStringToFile(new File(pubPath), publicEncodeString,Charset.forName("UTF-8"));
		FileUtils.writeStringToFile(new File(priPath), privateEncodeString,Charset.forName("UTF-8"));
	}
	/**
	 * 读取私钥
	 * @param priPath 私钥的路径
	 * @param algorithm 算法
	 * @return
	 * @throws Exception 返回私钥的key对象
	 */
	private static PrivateKey getPrivateKey(String priPath,String algorithm) throws Exception{
    
    
		String privateKeyString=FileUtils.readFileToString(new File(priPath),Charset.defaultCharset());
		//创建key的工厂
		KeyFactory keyFactory=KeyFactory.getInstance(algorithm);
		//创建私钥key的规则
		PKCS8EncodedKeySpec keySpec=new PKCS8EncodedKeySpec(Base64.decodeBase64(privateKeyString));
		//返回私钥对象
		return keyFactory.generatePrivate(keySpec);
	}
	
	/**
	 * 读取公钥
	 * @param priPath 公钥的路径
	 * @param algorithm 算法
	 * @return
	 * @throws Exception 返回公钥的key对象
	 */
	private static PublicKey getPublicKey(String publicPath,String algorithm) throws Exception{
    
    
		String publicKeyString=FileUtils.readFileToString(new File(publicPath),Charset.defaultCharset());
		//创建key的工厂
		KeyFactory keyFactory=KeyFactory.getInstance(algorithm);
		//创建公钥key的规则
		X509EncodedKeySpec keySpec=new X509EncodedKeySpec(Base64.decodeBase64(publicKeyString));
		//返回公钥对象
		return keyFactory.generatePublic(keySpec);
		
	}
}

누구나 읽을 수 있습니다. 저는 지식이 제한되어 있고 제가 쓴 블로그에 필연적으로 실수 나 누락이 있습니다. 여러분들이 저에게 조언을 해주시기를 바랍니다. 감사합니다. 이 기사가 도움이되었다고 생각한다면, 그것을 좋아하고 더 많은 독자들에게 보여주세요.

추천

출처blog.csdn.net/qq_41936224/article/details/113114129