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