码迷,mamicode.com
首页 > 编程语言 > 详细

java RSA公钥加密,私钥解密算法例子

时间:2015-11-04 23:07:57      阅读:661      评论:0      收藏:0      [点我收藏+]

标签:

"非对称加密算法"。 
  (1)乙方生成两把密钥(公钥和私钥)。公钥是公开的,任何人都可以获得,私钥则是保密的。 
  (2)甲方获取乙方的公钥,然后用它对信息加密。 
  (3)乙方得到加密后的信息,用私钥解密。 
如果公钥加密的信息只有私钥解得开,那么只要私钥不泄漏,通信就是安全的。公钥用于加密, 私钥用于解密. 

RSA 是一种非对称加密算法,一般很难破解,因此一些要求比较高的系统通常会采用rsa加密算法,一般来说用RSA加密有如下几个步骤. 
1. 生成公钥与私钥 
2. 用公钥对需要加密的字符串等进行加密 
3. 在需要解密的地方,用私钥进行解密 
下面对上面的几个部分贴出代码. 

1. 生成公钥与私钥 



Java代码 复制代码 收藏代码
1.package com.rsa;  
2.import java.io.FileOutputStream;   
3.import java.security.KeyPair;   
4.import java.security.KeyPairGenerator;   
5.import java.security.SecureRandom;   
6.import java.util.Date;  
7.  
8.public class GenKeys {  
9.    public static void main(String[] args) throws Exception {  
10.        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");   
11.        SecureRandom secureRandom = new SecureRandom(new Date().toString().getBytes());  
12.        keyPairGenerator.initialize(1024, secureRandom);  
13.        KeyPair keyPair = keyPairGenerator.genKeyPair();  
14.        String publicKeyFilename = "D:/publicKeyFile";  
15.        byte[] publicKeyBytes = keyPair.getPublic().getEncoded();  
16.        FileOutputStream fos = new FileOutputStream(publicKeyFilename);   
17.        fos.write(publicKeyBytes);   
18.        fos.close();  
19.        String privateKeyFilename = "D:/privateKeyFile";   
20.        byte[] privateKeyBytes = keyPair.getPrivate().getEncoded();  
21.        fos = new FileOutputStream(privateKeyFilename);   
22.        fos.write(privateKeyBytes);   
23.        fos.close();  
24.    }  
25.}  





2. 读取公钥方法 



Java代码 复制代码 收藏代码
1.package com.rsa;  
2.  
3.import java.io.DataInputStream;  
4.import java.io.File;  
5.import java.io.FileInputStream;  
6.import java.security.PublicKey;  
7.import java.security.spec.X509EncodedKeySpec;  
8.import java.security.KeyFactory;  
9.  
10.public class PublicKeyReader {      
11.    public static PublicKey get(String filename) throws Exception {  
12.        File f = new File(filename);  
13.        FileInputStream fis = new FileInputStream(f);   
14.        DataInputStream dis = new DataInputStream(fis);  
15.        byte[] keyBytes = new byte[(int)f.length()];   
16.        dis.readFully(keyBytes);   
17.        dis.close();  
18.        X509EncodedKeySpec spec = new X509EncodedKeySpec(keyBytes);  
19.        KeyFactory kf = KeyFactory.getInstance("RSA");   
20.        return kf.generatePublic(spec);  
21.    }  
22.  
23.  
24.}  






3.读取私钥方法 



Java代码 复制代码 收藏代码
1.package com.rsa;  
2.  
3.import java.io.DataInputStream;  
4.import java.io.File;  
5.import java.io.FileInputStream;  
6.import java.io.IOException;  
7.import java.security.KeyFactory;  
8.import java.security.PrivateKey;  
9.import java.security.spec.InvalidKeySpecException;  
10.import java.security.spec.PKCS8EncodedKeySpec;  
11.public class PrivateKeyReader {      
12.    public static PrivateKey get(String filename)throws Exception {  
13.        File f = new File(filename);  
14.        FileInputStream fis = new FileInputStream(f);  
15.        DataInputStream dis = new DataInputStream(fis);  
16.        byte[] keyBytes = new byte[(int)f.length()];  
17.        dis.readFully(keyBytes);  
18.        dis.close();  
19.        PKCS8EncodedKeySpec spec =new PKCS8EncodedKeySpec(keyBytes);  
20.        KeyFactory kf = KeyFactory.getInstance("RSA");  
21.        return kf.generatePrivate(spec);  
22.      }  
23.  
24.      
25.    public static void main(String[] args) throws Exception, InvalidKeySpecException, IOException {  
26.        PrivateKeyReader.get("d:/privateKeyFile");  
27.    }  
28.}  






4. 测试公钥加密,私钥解密 




Java代码 复制代码 收藏代码
1.package com.rsa;  
2.  
3.import java.security.interfaces.RSAPrivateKey;  
4.import java.security.interfaces.RSAPublicKey;  
5.import javax.crypto.Cipher;  
6.  
7.public class TestEncryptAndDecrypt {      
8.    public static void main(String[] args) throws Exception {  
9.        String input = "thisIsMyPassword$7788";  
10.        Cipher cipher = Cipher.getInstance("RSA");          
11.        RSAPublicKey pubKey = (RSAPublicKey) PublicKeyReader.get("d:/publicKeyFile");  
12.        RSAPrivateKey privKey = (RSAPrivateKey) PrivateKeyReader.get("d:/privateKeyFile");  
13.        cipher.init(Cipher.ENCRYPT_MODE, pubKey);  
14.        byte[] cipherText = cipher.doFinal(input.getBytes());  
15.        //加密后的东西  
16.        System.out.println("cipher: " + new String(cipherText));          
17.        //开始解密  
18.        cipher.init(Cipher.DECRYPT_MODE, privKey);   
19.        byte[] plainText = cipher.doFinal(cipherText);  
20.        System.out.println("plain : " + new String(plainText));  
21.    }  
22.  
23.}  






查看结果: 

程序代码 程序代码 


cipher: J??? 
?nE??J?b9??CO??I???g[B{?w??u0????}?r6 
?Q??Xa???????N}n?]?@??_9!D??_?|k??&g?^????XTa$?7??*?{7?R???v?S 
plain : thisIsMyPassword$7788 




说明加密解密成功。 

备注,这里记录的只是测试方法,当然在实际使用过程中,可能还需要 对加密后的 byte[] 采用 base64 编码,转换成字符串存储起来,在解密的时候,先通过 base64 还原成 byte, 然后在解密,这样会更好。详细的方法, 

获取【下载地址】   java后台框架 springmvc整合mybatis框架源码 bootstrap html5 mysql oracle

java RSA公钥加密,私钥解密算法例子

标签:

原文地址:http://www.cnblogs.com/opisnhihs/p/4937610.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!