非对称加密称为公钥加密,速度慢,加密和解密的钥匙不相同,某一个人持有私钥,任何一个人都可以知道公钥
基本步骤:
·得到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|��-
解密后的数据:私密数据