本篇文章给大家分享的是有关如何在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算法对密码进行加密与解密