你的位置:首页 > ASP.net教程

[ASP.net教程]java RSA公钥加密,私钥解密算法例子

"非对称加密算法"。   (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