非对称加密,在加密和解密的过程中需要不同的密码,即必须具备同时具备两个密码信息才可能获得完整的数据。
图 非对称算法
在非对称算法中,首先得有一个密钥对,这个密钥对含有两部分内容,分别称作公钥(PK)和私钥(SK),公钥通常用来加密,私钥则用来解密。在对称算法中,也讲到了可以有两个密钥(分为加密和解密密钥)。但是,对称算法中的加解密密钥可以互相转换,而在非对称算法中,则不能从公钥推算出私钥。所以,我们完全可以将公钥公开到任何地方。
如上图所以,发送者用接收方公开出来的公钥PK进行加密。接受方在收到密文后,再用与公钥对应的私钥SK进行解密。同样,密文可以被截获,但是由于截获者只有公钥,没有私钥,他不能进行解密。
实例: 需要对密码进行非对称加密
产生密匙对,并将数据加密
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 private static void PublicEnrypt() throws Exception{ 2 3 Cipher cipher=Cipher.getInstance("RSA"); 4 5 //实例化Key 6 KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA"); 7 8 9 //获取一对钥匙 10 KeyPair keyPair =keyPairGenerator.generatorKeyPair(); 11 12 //获取公匙 13 Key publicKey=keyPair.getPublic(); 14 15 //获取私匙 16 Key privateKey=keyPair.getPrivate(); 17 18 //用公匙加密 19 cipher.init(Cipher.ENCRYPT_MODE,publicKey); 20 21 22 byte [] result=cipher.doFinal("helloword".getBytes("UTF-8")); 23 24 //将Key写入到文件 25 saveKey(privateKey,"zxx_private.key"); 26 27 //加密后的数据写入到文件 28 saveData(result,"public_encryt.dat"); 29 30 }
使用私匙进行解密
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 private static void privateDecrypt() throws Exception{ 2 Cipher cipher=Cipher.getInstance("RSA"); 3 4 //得到Key 5 Key privateKey=readKey("zxx_private.key"); 6 7 //用私匙去解密 8 cipher.init(Cipher.DECRYPT_MODE,privateKey); 9 10 11 //读数据源 12 byte[] src= readData("public_encryt.dat"); 13 14 //得到解密后的结果 15 byte[] result=cipher.doFinal(src); 16 17 //二进制数据要变成字符串需要解码 18 System.out.println(new String(result,"UTF-8")); 19 }
将加密后的数据保存到文件中
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 private static void saveData(byte[] result, String fileName) throws Exception { 2 // TODO Auto-generated method stub 3 FileOutputStream fosData=new FileOutputStream(fileName); 4 fosData.write(result); 5 fosData.close(); 6 }
将密匙保存到文件中
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 public static void saveKey(Key key,String fileName)throws Exception{ 2 FileOutputStream fosKey=new FileOutputStream(fileName); 3 ObjectOutputStream oosSecretKey =new ObjectOutputStream(fosKey); 4 oosSecretKey.writeObject(key); 5 oosSecretKey.close(); 6 fosKey.close(); 7 }
从文件中读取出私匙
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 private static Key readKey(String fileName) throws Exception { 2 FileInputStream fisKey=new FileInputStream(fileName); 3 ObjectInputStream oisKey =new ObjectInputStream(fisKey); 4 Key key=(Key)oisKey.readObject(); 5 oisKey.close(); 6 fisKey.close(); 7 return key; 8 }
读取数据从文件中
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 private static byte[] readData(String filename) throws Exception { 2 FileInputStream fisDat=new FileInputStream(filename); 3 byte [] src=http://www.cnblogs.com/new byte [fisDat.available()]; 4 int len =fisDat.read(src); 5 int total =0; 6 while(total<src.length){ 7 total +=len; 8 len=fisDat.read(src,total,src.length-total); 9 } 10 fisDat.close(); 11 return src; 12 }