java加解密RSA使用方法代码示例

  

最近为了分析一段请求流,不得不去研究一下RSA加密。
  

  

首先,强调一点:密钥的“钥”读“悦”,不是“姚明”,额…
  

  

网上关于RSA的原理一抓一大把的,这里只是简单说说我的理解:
  

  

<强> 1。两个足够大的互质数p, q,
  2. 用于模运算的模n=p *;
  3.公钥KU (e, n)中的e满足1 & lt; e<(p - 1) (q1),且与(p - 1) (q1)互质;
  4. 密钥KR (d, n)中的d满足,d * e % (p - 1) (q1)=1, %是取余运算。
  

  

因为公钥是公开的,所以我知道了e和n,那么根据2,3,4式子的关系,我们只要从n的值推出p, q的值则可计算出d的值,也就能找到密钥。
  

  

然而,   

好了,这里作为研究的随笔,记录一下java如何使用,以下主要有三种方法,基本大同小异,只是获取公钥私钥的途径不一样就是了:
  

  


  

  

利用KeyPairGenerator直接生成公钥和密钥,一般私钥保留给服务端,公钥交给客户端。

        公开课RSACryptography {   公共静态字符串数据=" https://www.yisu.com/zixun/hello世界”;   公共静态void main (String [] args){抛出异常//TODO自动生成方法存根   密钥对密钥对=genKeyPair (1024);//获取公钥,并以base64格式打印出来   PublicKey PublicKey=keyPair.getPublic ();   system . out。println(“公钥:“+新字符串(Base64.getEncoder () .encode (publicKey.getEncoded ())));//获取私钥,并以base64格式打印出来   PrivateKey PrivateKey=keyPair.getPrivate ();   system . out。println(“私钥:“+新字符串(Base64.getEncoder () .encode (privateKey.getEncoded ())));//公钥加密   byte [] encryptedBytes=加密(data.getBytes (), publicKey);   system . out。println(“加密后:“+新字符串(encryptedBytes));//私钥解密   byte [] decryptedBytes=解密(encryptedBytes privateKey);   system . out。println(“解密后:“+新字符串(decryptedBytes));   }//生成密钥对   公共静态密钥对genKeyPair (int keyLength)抛出异常{   KeyPairGenerator KeyPairGenerator=KeyPairGenerator.getInstance (RSA);   keyPairGenerator.initialize (1024);   返回keyPairGenerator.generateKeyPair ();   }//公钥加密   公共静态byte[]加密(byte[]内容,PublicKey PublicKey){抛出异常   密码密码=. getinstance (RSA);//java默认“RSA”=癛SA/欧洲/PKCS1Padding”   cipher.init(密码。ENCRYPT_MODE publicKey);   返回cipher.doFinal(内容);   }//私钥解密   公共静态byte[]解密(byte[]内容,PrivateKey PrivateKey){抛出异常   密码密码=. getinstance (RSA);   cipher.init(密码。DECRYPT_MODE privateKey);   返回cipher.doFinal(内容);   }   }      

运行结果:

        公钥:MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCSl6V7XNkVR9 + NotekZm1FjHdL7oDqA66hrG5D/wgQ1XIF22mex7pnNc8PRBRScJQZJbzQ3ZnVmV5XqrVSCGbqaMPFmIXetu6lifQHoGptH9ghZsemanqp0sSd1TkHcPL2Njk/hZabWYBzPbjlidgfcMotehnFUdlIMGCusMV0awIDAQAB   私钥:MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAJKXpXtc2RVH342i16RmbUWMd0vugOoDrqGsbkP/CBDVcgXbaZ7Humc1zw9EFFJwlBklvNDdmdWZXleqtVIIZupow8WYhd627qWJ9Aegam0f2CFmx6ZqeqnSxJ3VOQdw8vY2OT + FlptZgHM9uOWJ2B9wyi16GcVR2UgwYK6wxXRrAgMBAAECgYA8YBjX5jXCfgek3hzSqRz4OBIqQ + D0gO + 7 xrjjahz5 + G8t2mB19Ozg9ViCgRednKBiexh6LcveHXytvrFPSAaagoa9DFKktaQmIQ15z3xXtgiHxg2dxDFJ1GNyhNjhMl8RSff2nSfQaRrgA8y36k0OZq240sdls6GbBMMoHRuRAQJBAOm6fw7cVXfmvzL0JBZmDl3SPK3sSNM6tfxaDy39W1g9rmGHKqs2XOubCe06ic/m9pxJnPmUXhgvYtiYLdC6NbkCQQCgj5O sA0wYQQvW + WxQvleBLND9ZT2QOG5wvYRMoKP + uYE3SwsfKTZ1YsD5DjoyQPrc/lbCX7x + A8qRqLdRw1DAkAmhwJ4vaMtD5FG4e2s74fAuW4dMUzT3OKwxVupNhE/m3NKSlCjRmPMxpK9Ux ycF0IaC4DCgz0qaL + lx8 + P + OpAkA6Kol + AgtlIWBgv8wAYaDxPIas8gTbCTo9D7IRHNlLy7sUvANKwoT + HWxVJpKvUlNHMyZ8on4IrrLfv + M0go79AkAUwV5Nipi7ekScrzEMiaRJoYXgpFv2pQnRQzBQm5xVxtbuCpmuopNyk/9 zm33riwwjn6uyv9hfg7e6hnsk2qir   加密后:v?,Y9?檂o庬鉤h﹎m_?$惇櫤?p崃?4蹥bhhN?25/?6T駩樁w草遏鬼碙&柀&*軄Q晛1鱋A祉@眽`剪啃`噾?>x/运婣?HI砛奊瑘i?$B捞   & # 63;毟”圣   解密后:hello world   之前      


  

  

实际上,方法一只是用来生成密钥就好了,生成的密钥需要保存到本地文件中,所以一般不会在客户端调用KeyPairGenerator进行密钥的生成操作。
  

  

这里,我们可以将方法一得到的密钥保存到文件,下次我们直接读取就可以了。我假设以字符串的形式保存在文件内,那么接下来直接使用读取到的字符串生成密钥即可。
  

  

当然,你也可以使用openssl来生成也可以,不过我觉得麻烦就不弄了。

java加解密RSA使用方法代码示例