- package com.hexun.blog.dongliwei.utils;
- import javax.crypto.Cipher;
- import java.security.*;
- import java.security.spec.RSAPublicKeySpec;
- import java.security.spec.RSAPrivateKeySpec;
- import java.security.spec.InvalidKeySpecException;
- import java.security.interfaces.RSAPrivateKey;
- import java.security.interfaces.RSAPublicKey;
- import java.io.*;
- import java.math.BigInteger;
- /**
- * RSA 工具类。提供加密,解密,生成密钥对等方法。
- * 需要到http://www.bouncycastle.org下载bcprov-jdk14-123.jar。
- * RSA加密原理概述
- * RSA的安全性依赖于大数的分解,公钥和私钥都是两个大素数(大于100的十进制位)的函数。
- * 据猜测,从一个密钥和密文推断出明文的难度等同于分解两个大素数的积
- * ===================================================================
- * (该算法的安全性未得到理论的证明)
- * ===================================================================
- * 密钥的产生:
- * 1.选择两个大素数 p,q ,计算 n=p*q;
- * 2.随机选择加密密钥 e ,要求 e 和 (p-1)*(q-1)互质
- * 3.利用 Euclid 算法计算解密密钥 d , 使其满足 e*d = 1(mod(p-1)*(q-1)) (其中 n,d 也要互质)
- * 4:至此得出公钥为 (n,e) 私钥为 (n,d)
- * ===================================================================
- * 加解密方法:
- * 1.首先将要加密的信息 m(二进制表示) 分成等长的数据块 m1,m2,...,mi 块长 s(尽可能大) ,其中 2^s<n
- * 2:对应的密文是: ci = mi^e(mod n)
- * 3:解密时作如下计算: mi = ci^d(mod n)
- * ===================================================================
- * RSA速度
- * 由于进行的都是大数计算,使得RSA最快的情况也比DES慢上100倍,无论 是软件还是硬件实现。
- * 速度一直是RSA的缺陷。一般来说只用于少量数据 加密。
- *文件名:RSAUtil.java<br>
- *@author 董利伟<br>
- *版本:<br>
- *描述:<br>
- *创建时间:2008-9-23 下午09:58:16<br>
- *文件描述:<br>
- *修改者:<br>
- *修改日期:<br>
- *修改描述:<br>
- */
- public class RSAUtil {
- //密钥对
- private KeyPair keyPair = null ;
- /**
- * 初始化密钥对
- */
- public RSAUtil(){
- try {
- this .keyPair = this .generateKeyPair();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- /**
- * 生成密钥对
- * @return KeyPair
- * @throws Exception
- */
- private KeyPair generateKeyPair() throws Exception {
- try {
- KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA" , new org.bouncycastle.jce.provider.BouncyCastleProvider());
- //这个值关系到块加密的大小,可以更改,但是不要太大,否则效率会低
- final int KEY_SIZE = 1024 ;
- keyPairGen.initialize(KEY_SIZE, new SecureRandom());
- KeyPair keyPair = keyPairGen.genKeyPair();
- return keyPair;
- } catch (Exception e) {
- throw new Exception(e.getMessage());
- }
- }
- /**
- * 生成公钥
- * @param modulus
- * @param publicExponent
- * @return RSAPublicKey
- * @throws Exception
- */
- private RSAPublicKey generateRSAPublicKey( byte [] modulus, byte [] publicExponent) throws Exception {
- KeyFactory keyFac = null ;
- try {
- keyFac = KeyFactory.getInstance("RSA" , new org.bouncycastle.jce.provider.BouncyCastleProvider());
- } catch (NoSuchAlgorithmException ex) {
- throw new Exception(ex.getMessage());
- }
- RSAPublicKeySpec pubKeySpec = new RSAPublicKeySpec( new BigInteger(modulus), new BigInteger(publicExponent));
- try {
- return (RSAPublicKey) keyFac.generatePublic(pubKeySpec);
- } catch (InvalidKeySpecException ex) {
- throw new Exception(ex.getMessage());
- }
- }
- /**
- * 生成私钥
- * @param modulus
- * @param privateExponent
- * @return RSAPrivateKey
- * @throws Exception
- */
- private RSAPrivateKey generateRSAPrivateKey( byte [] modulus, byte [] privateExponent) throws Exception {
- KeyFactory keyFac = null ;
- try {
- keyFac = KeyFactory.getInstance("RSA" , new org.bouncycastle.jce.provider.BouncyCastleProvider());
- } catch (NoSuchAlgorithmException ex) {
- throw new Exception(ex.getMessage());
- }
- RSAPrivateKeySpec priKeySpec = new RSAPrivateKeySpec( new BigInteger(modulus), new BigInteger(privateExponent));
- try {
- return (RSAPrivateKey) keyFac.generatePrivate(priKeySpec);
- } catch (InvalidKeySpecException ex) {
- throw new Exception(ex.getMessage());
- }
- }
- /**
- * 加密
- * @param key 加密的密钥
- * @param data 待加密的明文数据
- * @return 加密后的数据
- * @throws Exception
- */
- public byte [] encrypt(Key key, byte [] data) throws Exception {
- try {
- Cipher cipher = Cipher.getInstance("RSA" , new org.bouncycastle.jce.provider.BouncyCastleProvider());
- cipher.init(Cipher.ENCRYPT_MODE, key);
- //获得加密块大小,如:加密前数据为128个byte,而key_size=1024 加密块大小为127 byte,加密后为128个byte;
- //因此共有2个加密块,第一个127 byte第二个为1个byte
- int blockSize = cipher.getBlockSize();
- int outputSize = cipher.getOutputSize(data.length); //获得加密块加密后块大小
- int leavedSize = data.length % blockSize;
- int blocksSize = leavedSize != 0 ? data.length / blockSize + 1 : data.length / blockSize;
- byte [] raw = new byte [outputSize * blocksSize];
- int i = 0 ;
- while (data.length - i * blockSize > 0 ) {
- if (data.length - i * blockSize > blockSize)
- cipher.doFinal(data, i * blockSize, blockSize, raw, i * outputSize);
- else
- cipher.doFinal(data, i * blockSize, data.length - i * blockSize, raw, i * outputSize);
- //这里面doUpdate方法不可用,查看源代码后发现每次doUpdate后并没有什么实际动作除了把byte[]放到ByteArrayOutputStream中
- //,而最后doFinal的时候才将所有的byte[]进行加密,可是到了此时加密块大小很可能已经超出了OutputSize所以只好用dofinal方法。
- i++;
- }
- return raw;
- } catch (Exception e) {
- throw new Exception(e.getMessage());
- }
- }
- /**
- * 解密
- * @param key 解密的密钥
- * @param raw 已经加密的数据
- * @return 解密后的明文
- * @throws Exception
- */
- public byte [] decrypt(Key key, byte [] raw) throws Exception {
- try {
- Cipher cipher = Cipher.getInstance("RSA" , new org.bouncycastle.jce.provider.BouncyCastleProvider());
- cipher.init(cipher.DECRYPT_MODE, key);
- int blockSize = cipher.getBlockSize();
- ByteArrayOutputStream bout = new ByteArrayOutputStream( 64 );
- int j = 0 ;
- while (raw.length - j * blockSize > 0 ) {
- bout.write(cipher.doFinal(raw, j * blockSize, blockSize));
- j++;
- }
- return bout.toByteArray();
- } catch (Exception e) {
- throw new Exception(e.getMessage());
- }
- }
- /**
- * 返回公钥
- * @return
- * @throws Exception
- */
- public RSAPublicKey getRSAPublicKey() throws Exception{
- //获取公钥
- RSAPublicKey pubKey = (RSAPublicKey) keyPair.getPublic();
- //获取公钥系数(字节数组形式)
- byte [] pubModBytes = pubKey.getModulus().toByteArray();
- //返回公钥公用指数(字节数组形式)
- byte [] pubPubExpBytes = pubKey.getPublicExponent().toByteArray();
- //生成公钥
- RSAPublicKey recoveryPubKey = this .generateRSAPublicKey(pubModBytes,pubPubExpBytes);
- return recoveryPubKey;
- }
- /**
- * 获取私钥
- * @return
- * @throws Exception
- */
- public RSAPrivateKey getRSAPrivateKey() throws Exception{
- //获取私钥
- RSAPrivateKey priKey = (RSAPrivateKey) keyPair.getPrivate();
- //返回私钥系数(字节数组形式)
- byte [] priModBytes = priKey.getModulus().toByteArray();
- //返回私钥专用指数(字节数组形式)
- byte [] priPriExpBytes = priKey.getPrivateExponent().toByteArray();
- //生成私钥
- RSAPrivateKey recoveryPriKey = this .generateRSAPrivateKey(priModBytes,priPriExpBytes);
- return recoveryPriKey;
- }
- /**
- * 测试
- * @param args
- * @throws Exception
- */
- public static void main(String[] args) throws Exception {
- RSAUtil rsa = new RSAUtil();
- String str = "董利伟" ;
- RSAPublicKey pubKey = rsa.getRSAPublicKey();
- RSAPrivateKey priKey = rsa.getRSAPrivateKey();
- System.out.println("加密后==" + new String(rsa.encrypt(pubKey,str.getBytes())));
- System.out.println("解密后==" + new String(rsa.decrypt(priKey, rsa.encrypt(pubKey,str.getBytes()))));
- }
-
}
相关推荐
RSA算法Java实现完整项目实战
本文还有配套的精品资源,点击获取 简介:RSA算法是一种非对称加密算法,广泛用于数据加密和数字签名。本课程设计项目实战将指导你使用Java实现RSA算法,包括密钥生成、加密和解密过程。通过理解和应用模的重复平方算法和中国剩余定理,你将掌握RSA算法的实际应用,为在信息安全领域开发安全且高效的解决方案奠定基础。 1. RSA算法简介 RSA算法是一种非对称加密...
RSA原理,java实现RSA
RSA原理,java实现RSA
RSA算法的Java实现
RSA加密算法的Java实现。详见:http://blog.youkuaiyun.com/he_qiao/article/details/44758711
【算法】Java实现RSA算法
RSA(Rivest-Shamir-Adleman)是一种非对称加密算法,它是目前最广泛使用的公钥加密算法之一。RSA算法是由三位密码学家(Ron Rivest、Adi Shamir、Leonard Adleman)在1977年提出的。RSA算法基于大数因子分解的数学难题,它使用一对密钥:公钥和私钥。公钥用于加密数据,私钥用于解密数据。公钥可以公开分享给其他人,而私钥必须保密。选择两个不同的大素数p和q。计算n = p * q,n被称为模数(modulus)。
rsa加密算法的java实现实例
提供了rsa算法的java类及测试代码.其中已经用过,有需要的可以拿去
杂记 | 使用keycloak实现SSO单点登录(新手向,概念、原理、逻辑、详细步骤、难点解释)
使用keycloak实现SSO单点登录(概念、原理、逻辑、详细步骤、难点解释)
编程利用Java实现RSA算法
目录1.使用说明2.运行截图3.总体设计3.1类和函数3.2结构说明4.详细设计5.源码 1.使用说明 本程序利用eclipse使用Java语言编写。使用该程序可利用eclipse打开源代码文件夹,然后运行RSA.java即可根据默认的明文和密钥输出加密、解密结果。默认使用的密钥由文件读出的1024位大素数产生,也可以更改参数使用自定义算法产生指定位的大素数。同时为保证安全性以及照顾到算法加密、解密时间,两个大素数强制规定必须在1024位及以上,公钥指数为最常用的65537。 2.运行截图 3.总体设计
从零到一:Ollama工具在RK3588上的深度优化实践
本文详细介绍了如何在RK3588开发板上深度优化Ollama工具,以高效运行DeepSeek模型。通过CPU与NPU负载平衡、模型量化、温度控制等策略,显著提升性能并降低功耗,适用于边缘计算场景。文章提供了具体的配置命令和优化方案,帮助开发者充分发挥RK3588的硬件潜力。
RSA非对称加密
package com.example; import javax.crypto.Cipher; import java.io.ByteArrayOutputStream; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.security.*; import java.security.spec.PKCS8EncodedKeySpec; import java.security..
激光及激光器超全细节&原理总结
本文详细展示了激光、激光器、PN结、半导体激光器、光纤激光器的原理和应用;
Frida精准定位Shopee x-sap-ri动态签名生成函数
x-sap-ri是Shopee客户端生成的上下文感知型动态令牌,本质为基于设备标识、请求路径与毫秒级时间戳三元组的SHA256哈希值,经Base64编码后作为防重放与防批量伪造的核心校验字段。其生成逻辑深度混淆且跨Java/Native层,静态分析失效,而Frida凭借内存级函数调用拦截与JNI层穿透能力,成为唯一可行的技术路径。本文聚焦Frida在加固App中的实战适配——通过libcrypto.so API特征扫描反向定位被抹名的生成函数,实现对x-sap-ri输入参数(如16字节device_id加密
基于Java的RSA加密算法实现
一、RSA算法描述(1)选取长度相等的两个大素数p、q,计算其乘积n=p.q(2)计算n的欧拉数Φ(n)=(p-1).(q-1)(3)随机选择加密密钥e,使得e与(p-1)、(q-1)互素(4)用欧几里得扩展算法计算解密密钥d,满足:ed=1modΦ(n),(e,n)是公钥,d是私钥。(5)加密明文:Ci=mi^e(modn)(6)解密密文:mi=Ci^d(modn)二、RSA实现的Java代码1...
ArcMap新手必看:Shape属性中的点ZM值到底是什么?如何快速处理
本文深入解析ArcMap中Shape属性中的点ZM值,揭示其在GIS数据中的隐藏维度作用,包括Z值(高程值)和M值(测量值)。针对ZM值可能引发的服务发布问题,提供三种高效处理方案,帮助新手快速掌握数据导入时的ZM值管控策略及精准去除方法。
rsa算法 java实现_RSA算法介绍及JAVA实现详解
最近处理RSA算法,找了一些相关的资料和代码,整理了一下,汇总成这篇文章。基础RSA算法非常简单,概述如下:找两素数p和q取n=p*q取t=(p-1)*(q-1)取任何一个数e,要求满足e取d*e%t==1这样最终得到三个数: n d e设消息为数M (M 设c=(M**d)%n就得到了加密后的消息c设m=(c**e)%n则 m == M,从而完成对c的解密。注:**表示次方,上面两式中的d和e可...
58.Sobel边缘检测算子
注:在梯度运算中,很可能会出现负的灰度值,我们不能再采用uint8类型作为像素的数据类型,而是采用了CV_16S或者CV_32F这种有负数范围的类型,运算结果里的负数也不能不处理,否则在显示的时候就会被截断为0,这样就会丢失边界信息。如下图所示,对中心像素Z5求取多个方向的灰度差分,对于Z5的8邻域,分为4个方向,即对角线和水平垂直4个方向对:(z1, z9) ,(z2, z8), (z3, z7), (z6, z4) 给定邻域方向梯度矢量g的幅度为:|g| = <像素灰度差分>/<相邻像素的距离>。
Python爬虫实战:高效爬取华尔街日报文章的技术与代码详解
在当今信息爆炸的时代,金融数据和分析对于投资者、研究人员和企业决策者来说至关重要。华尔街日报(WSJ)作为全球最具影响力的财经媒体之一,其文章内容具有极高的价值。本文将详细介绍如何使用Python最新技术构建一个高效、稳定的华尔街日报文章爬虫,涵盖从基础到高级的各种技术要点。本文详细介绍了如何使用Python最新技术构建一个高效、稳定的华尔街日报文章爬虫。我们从基础爬虫实现开始,逐步添加了高级功能如分布式处理、反反爬虫策略、数据清洗和存储等。异步处理:使用asyncio和httpx实现高性能网络请求。
JAVA实现RSA算法
1.关于RSA算法,主要就是要掌握好公钥和私钥的使用。首先,公钥是由N,E组成,私钥由N,D组成。那个下面我,先将java生成密钥对的方法写出来: public void createRsaKeyPair(String length) { try { // 调用产生rsa算法 KeyPairGenerator keyPairGe
YOLO26改进策略【卷积层】| CVPR 2024 可变形卷积 v4(DCNv4)无界权重提表达 + 线程合并降冗余,强化模型收敛速度
DCNv4(Deformable Convolution v4)是一种专为广泛视觉应用设计的高效算子,它对DCNv3进行了关键改进,有效解决了DCNv3存在的速度慢和表达能力受限等问题。
详解RSA加密算法 | Java模拟实现RSA算法
本文旨在分析讲解RSA加密算法,并且用Java模拟实现
ssm框架搭建
这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载
迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)
迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)
java标准rsa算法,JAVA实现RSA算法
1.关于RSA算法,主要就是要掌握好公钥和私钥的使用。首先,公钥是由N,E组成,私钥由N,D组成。那个下面我,先将java生成密钥对的方法写出来:public void createRsaKeyPair(String length) {try {// 调用产生rsa算法KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(...
SAP B1中文培訓教材_SDK
公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说
java的rsa加密算法_基于Java的RSA加密算法实现
一、RSA算法描述(1)选取长度相等的两个大素数p、q,计算其乘积n=p.q(2)计算n的欧拉数Φ(n)=(p-1).(q-1)(3)随机选择加密密钥e,使得e与(p-1)、(q-1)互素(4)用欧几里得扩展算法计算解密密钥d,满足:ed=1modΦ(n),(e,n)是公钥,d是私钥。(5)加密明文:Ci=mi^e(modn)(6)解密密文:mi=Ci^d(modn)二、RSA实现的Java代码1...
VC中sqlite的使用
在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示
25行代码实现完整的RSA算法Java版
25行代码实现完整的RSA算法Java版 我的上一篇博客《25行代码实现完整的RSA算法》自从上个月发表了以后,很多程序员给我打电话或者发短信说,终于看到了一篇能把RSA算法的代码写明白的,他们问我说能不能把代码写成Java版的,我说Java的会看着很费劲,Python代码的直观性在数字计算方面有很大的优势。 但是架不住他们非要我写,我一拍肩膀说,好吧,我答应你们的请求。花了一晚上的时...
rsa算法的java实现,RSA算法的实现——java版
RSA算法的实现——java版以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!package rsa;import java math BigInteger;public class RSA {private long p q e d n;public RSA(){int pIndex = (int)(Math ...
RSA加密算法java实现
转载自: https://blog.youkuaiyun.com/zyhlwzy/article/details/77948195 RSA加密算法是目前最有影响力的公钥加密算法,并且被普遍认为是目前最优秀的公钥方案之一。RSA是第一个能同时用于加密和数宇签名的算法,它能够抵抗到目前为止已知的所有密码攻击,已被ISO推荐为公钥数据加密标准。RSA加密算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但那...

1172



被折叠的 条评论
为什么被折叠?



