最近为了分析一段请求流,不得不去研究一下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使用方法代码示例