非対称暗号化RSAアルゴリズムコードの実装例

非対称暗号化: 2つの鍵があります。暗号化に公開鍵を使用する場合は、復号化に秘密鍵を使用する必要があります。暗号化に秘密鍵を使用する場合は、復号化に公開鍵を使用する必要があります。

暗号化と復号化のコアクラス:暗号

次のコードは、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