使用RSA算法对数据进行非对称加密和加密

非对称加密称为公钥加密,速度慢,加密和解密的钥匙不相同,某一个人持有私钥,任何一个人都可以知道公钥

基本步骤:

·得到keyPairGenerator 的实例对象,并调用其generateKeyPair()方法得到KeyPair对象。

·调用KeyPair对象的getPrivate()和getPublic()方法,分别得到PrivateKey对象和PublicKey对象。

·得到Cipher的实例对象,并调用其init()方法指定PrivateKey对象或PublicKey对象,并指定要进行加密、还是进行解密操作。

·调用Cipher对象的doFinal()方法完成加密或解密操作。


package com.alex.security;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;

import javax.crypto.Cipher;


public class AsymmetricEncryption {

	private static String dataPath="D:/publicKey.data";
	public static void main(String[] args) throws Exception {
		//得到keyPairGenerator 的实例对象,并调用其generateKeyPair()方法得到KeyPair对象
		KeyPair keyPair= KeyPairGenerator.getInstance("RSA").generateKeyPair();
		publicKeyEncryption(keyPair);
		privateKeyEncryption(keyPair);
	}

	private static void privateKeyEncryption(KeyPair keyPair) throws Exception{
		Cipher decryptionCipher = Cipher.getInstance("RSA");
		//调用KeyPair对象的getPrivate(),得到PrivateKey对象
		PrivateKey privateKey = keyPair.getPrivate();
		//使用Cipher的实例对象,并调用其init()方法指定PublicKey对象,并指定进行加密操作
		decryptionCipher.init(Cipher.DECRYPT_MODE, privateKey);
		byte[] data = readData(dataPath);
		//调用Cipher对象的doFinal()方法完成解密操作。
		byte[] result = decryptionCipher.doFinal(data);
		System.out.println("解密后的数据:"+new String(result,"UTF-8"));
	}

	private static void publicKeyEncryption(KeyPair keyPair) throws Exception {
		Cipher encryptionCipher = Cipher.getInstance("RSA");
		//调用KeyPair对象的getPublic()方法,得到PublicKey对象
		PublicKey publicKey = keyPair.getPublic();
		String securityData="私密数据";
		System.out.println("加密前的数据:"+securityData);
		//使用Cipher的实例对象,并调用其init()方法指定PrivateKey对象,并指定进行解密操作
		encryptionCipher.init(Cipher.ENCRYPT_MODE, publicKey);
		//调用Cipher对象的doFinal()方法完成加密操作
		byte[] result = encryptionCipher.doFinal(securityData.getBytes("UTF-8"));
		System.out.println("加密后的数据:"+new String(result,"UTF-8"));
		savaData(result,dataPath);
		
	}
	
	private static void savaData(byte[] data,String fileName) throws Exception {
		File file = new File(fileName);
		FileOutputStream fos = new FileOutputStream(file);
		fos.write(data);
		fos.close();
		
	}
	
	private static byte[] readData(String fileName) throws Exception{
		File file = new File(fileName);
		FileInputStream fis = new FileInputStream(file);
		byte[] src = new byte[fis.available()];
		int len = 0;
		int total=0;
		while(total<src.length){
			total=total+len;
			len=fis.read(src, total, src.length-total);
		}
		fis.close();
		return src;
	}
	
}

加密前的数据:私密数据
加密后的数据:Q������#C|��-
解密后的数据:私密数据

你可能感兴趣的:(exception,算法,加密,String,解密,byte)