如何在java中使用RSA算法对密码进行加密与解密

  介绍

本篇文章给大家分享的是有关如何在java中使用RSA算法对密码进行加密与解密,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

<强>前言:

,RSA是第一个比较完善的公开密钥算法,它既能用于加密,也能用于数字签名.RSA以它的三个发明者Ron Rivest,阿迪,伦纳德艾德曼的名字首字母命的名,这个算法经受住了多年深入的密码分析,虽然密码分析者既不能证明也不能否定RSA的安全性,但这恰恰说明该算法有一定的可信性,目前它已经成为最流行的公开密钥算法。

,,,,,,RSA的安全基于大数分解的难度。其公钥和私钥是一对大素数(100到200位十进制数或更大)的函数。从一个公钥和密文恢复出明文的难度,等价于分解两个大素数之积(这是公认的数学难题)。

<>强RSA加密与解密

RSA算法的密钥由公钥和私钥组成,公钥用于加密,私钥用于解密。顾名思义,公钥就是可以进行公开的密钥,一般可以公开给你的合作伙伴;私钥就是私有的,也就是只有你知道的,你的合作伙伴通过你提供的公钥进行加密的内容只有你能进行解密,这样也就只有你知道他发的是什么内容。用于加密的公钥和私钥是配对的。这样的一对密钥在Java中由

java.security。KeyPairGenerator来产生。以下是一个生成密钥对的示例,该示例中还将生成的密钥对分别保存到了文件中。

, private  static  final  String  ALGORITHM =,“RSA";   ,private  static  final  String  PRIVATE_KEY_PATH =,“D: \ \ rsa_private.isa";   ,private  static  final  String  PUBLIC_KEY_PATH =,“D: \ \ rsa_public.isa";   ,/* *   ,*生成公钥和私钥并存储到文件中   ,* @throws 例外   ,*/,@Test   ,public  void  geneKeyPair (), throws  Exception  {   ,KeyPairGenerator  KeyPairGenerator =, KeyPairGenerator.getInstance(算法);   ,keyPairGenerator.initialize (1024);   ,KeyPair  KeyPair =, keyPairGenerator.generateKeyPair ();   ,PrivateKey  PrivateKey =, keyPair.getPrivate();//私钥   ,PublicKey  PublicKey =, keyPair.getPublic();//公钥   ,byte [], privateKeyBytes =, privateKey.getEncoded();//私钥对应的字节数组   ,byte [], publicKeyBytes =, publicKey.getEncoded();//公钥对应的字节数组   ,Files.write (Paths.get (PRIVATE_KEY_PATH), privateKeyBytes);   ,Files.write (Paths.get (PUBLIC_KEY_PATH), publicKeyBytes);   以前,}

<强>加密

加密的过程跟使用AES算法进行加密的过程类似,唯一需要注意的是使用存储起来的公钥时需要使用X509EncodedKeySpec进行封装,然后通过KeyFactory.generatePublic (KeySpec)进行生成。

@Test   ,public  void  testEncrypt (), throws  Exception  {   ,this.encrypt (“Hello  RSA");   ,}   ,/* *   ,*公钥加密   ,* @param 价值   ,* @return   ,* @throws 例外   ,*/,private  byte[],加密(String 价值),throws  Exception  {   ,Cipher  Cipher =, . getinstance(算法);   ,//读取公钥对应的字节数组   ,byte [], publicKeyCode =, Files.readAllBytes (Paths.get (PUBLIC_KEY_PATH));   ,//构造公钥,存储起来的公钥需要使用X509EncodedKeySpec进行读取   ,X509EncodedKeySpec  keySpec =, new  X509EncodedKeySpec (publicKeyCode);   ,KeyFactory  KeyFactory =, KeyFactory.getInstance(算法);   ,//根据已有的KeySpec生成对应的公钥   ,PublicKey  PublicKey =, keyFactory.generatePublic (keySpec);   ,cipher.init (Cipher.ENCRYPT_MODE, publicKey);   ,byte [], result =, cipher.doFinal (value.getBytes ());   ,System.out.println (Base64.getEncoder () .encodeToString(结果));   ,return 结果;   以前,}

<强>解密

解密是使用的密钥对中的私钥,其使用方法跟AES算法进行解密类似。存储起来的私钥需要通过PKCS8EncodedKeySpec加载,然后通过KeyFactory.generatePrivate (KeySpec)生成私钥。

,/* *   ,*私钥解密   ,* @throws 例外   ,*/,@Test   ,public  void  testDecrypt (), throws  Exception  {   ,Cipher  Cipher =, . getinstance(算法);   ,byte [], privateKeyCode =, Files.readAllBytes (Paths.get (PRIVATE_KEY_PATH));   ,//私钥需要通过PKCS8EncodedKeySpec来读取   ,PKCS8EncodedKeySpec  keySpec =, new  PKCS8EncodedKeySpec (privateKeyCode);   ,KeyFactory  KeyFactory =, KeyFactory.getInstance(算法);   ,//生成私钥   ,PrivateKey  PrivateKey =, keyFactory.generatePrivate (keySpec);   ,cipher.init (Cipher.DECRYPT_MODE, privateKey);   ,String  content =,“Java  Program";   ,byte [], input =, this.encrypt (“Java  Program");   ,byte [], result =, cipher.doFinal(输入);   ,Assert.assertTrue (content.equals (new 字符串(结果)));   ,}

如何在java中使用RSA算法对密码进行加密与解密