最近为了分析一段请求流,不得不去研究一下RSA加密。首先,强调一点:密钥的“钥”读“yue”,不是“yao”,额。。。网上关于RSA的原理一抓一大把的,这里只是简单说说我的理解:1. 两个足够大的互质数p, q;2. 用于模运算的模 n=p
最近为了分析一段请求流,不得不去研究一下RSA加密。
首先,强调一点:密钥的“钥”读“yue”,不是“yao”,额。。。
网上关于RSA的原理一抓一大把的,这里只是简单说说我的理解:
1. 两个足够大的互质数p, q;
2. 用于模运算的模 n=p*q;
3. 公钥KU(e, n)中的e满足 1<e< (p-1)(q-1),且与(p-1)(q-1)互质;
4. 密钥KR(d, n)中的d满足 d*e % (p-1)(q-1)= 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 stubKeyPair 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);}}
--结束END--
本文标题: java加解密RSA使用方法代码示例
本文链接: https://www.lsjlt.com/news/221964.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
下载Word文档到电脑,方便收藏和打印~
2024-04-30
2024-04-30
2024-04-30
2024-04-30
2024-04-30
2024-04-30
2024-04-30
2024-04-30
2024-04-30
2024-04-30
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0