最近为了分析一段请求流,不得不去研究一下RSA加密。
创新互联公司主要从事成都网站建设、网站制作、网页设计、企业做网站、公司建网站等业务。立足成都服务古县,10多年网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:18982081108首先,强调一点:密钥的“钥”读“yue”,不是“yao”,额。。。
网上关于RSA的原理一抓一大把的,这里只是简单说说我的理解:
1. 两个足够大的互质数p, q;
2. 用于模运算的模 n=p*q;
3. 公钥KU(e, n)中的e满足 1
因为公钥是公开的,所以我知道了e和n,那么根据2,3,4式子的关系,我们只要从n的值推出p, q的值则可计算出d的值,也就能找到密钥。
然而,关键就在这里, n=p*q,如果两个互质数p和q足够大,那么根据目前的计算机技术和其他工具,至今也没能从n分解出p和q,这是数学上的一个难题,也正是这个难题成为了RSA加密至今被广泛使用的原因。换句话说,只要密钥长度n足够大(一般1024足矣),基本上不可能从公钥信息推出私钥信息。
好了,这里作为研究的随笔,记录一下java如何使用,以下主要有三种方法,基本大同小异,只是获取公钥私钥的途径不一样就是了:
方法一:
利用KeyPairGenerator直接生成公钥和密钥,一般私钥保留给服务端,公钥交给客户端。
public class RSACryptography { public static String data="hello world"; public static void main(String[] args) throws Exception { // TODO Auto-generated method stub KeyPair keyPair=genKeyPair(1024); //获取公钥,并以base64格式打印出来 PublicKey publicKey=keyPair.getPublic(); System.out.println("公钥:"+new String(Base64.getEncoder().encode(publicKey.getEncoded()))); //获取私钥,并以base64格式打印出来 PrivateKey privateKey=keyPair.getPrivate(); System.out.println("私钥:"+new String(Base64.getEncoder().encode(privateKey.getEncoded()))); //公钥加密 byte[] encryptedBytes=encrypt(data.getBytes(), publicKey); System.out.println("加密后:"+new String(encryptedBytes)); //私钥解密 byte[] decryptedBytes=decrypt(encryptedBytes, privateKey); System.out.println("解密后:"+new String(decryptedBytes)); } //生成密钥对 public static KeyPair genKeyPair(int keyLength) throws Exception{ KeyPairGenerator keyPairGenerator=KeyPairGenerator.getInstance("RSA"); keyPairGenerator.initialize(1024); return keyPairGenerator.generateKeyPair(); } //公钥加密 public static byte[] encrypt(byte[] content, PublicKey publicKey) throws Exception{ Cipher cipher=Cipher.getInstance("RSA");//java默认"RSA"="RSA/ECB/PKCS1Padding" cipher.init(Cipher.ENCRYPT_MODE, publicKey); return cipher.doFinal(content); } //私钥解密 public static byte[] decrypt(byte[] content, PrivateKey privateKey) throws Exception{ Cipher cipher=Cipher.getInstance("RSA"); cipher.init(Cipher.DECRYPT_MODE, privateKey); return cipher.doFinal(content); } }