使用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|��-
解密后的数据:私密数据

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值