java rsa算法_求RSA算法JAVA实现源代码(带界面的)

展开全部

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 工具类。提供加密,解密,生成密62616964757a686964616fe59b9ee7ad9431333234326339钥对等方法。

* 需要到http://www.bouncycastle.org下载bcprov-jdk14-123.jar。

* @author xiaoyusong

* mail: xiaoyusong@etang.com

* msn:xiao_yu_song@hotmail.com

* @since 2004-5-20

*

*/

public class RSAUtil {

/**

* 生成密钥对

* @return KeyPair

* @throws EncryptException

*/

public static KeyPair generateKeyPair() throws EncryptException {

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 EncryptException(e.getMessage());

}

}

/**

* 生成公钥

* @param modulus

* @param publicExponent

* @return RSAPublicKey

* @throws EncryptException

*/

public static RSAPublicKey generateRSAPublicKey(byte[] modulus, byte[] publicExponent) throws EncryptException {

KeyFactory keyFac = null;

try {

keyFac = KeyFactory.getInstance("RSA", new org.bouncycastle.jce.provider.BouncyCastleProvider());

} catch (NoSuchAlgorithmException ex) {

throw new EncryptException(ex.getMessage());

}

RSAPublicKeySpec pubKeySpec = new RSAPublicKeySpec(new BigInteger(modulus), new BigInteger(publicExponent));

try {

return (RSAPublicKey) keyFac.generatePublic(pubKeySpec);

} catch (InvalidKeySpecException ex) {

throw new EncryptException(ex.getMessage());

}

}

/**

* 生成私钥

* @param modulus

* @param privateExponent

* @return RSAPrivateKey

* @throws EncryptException

*/

public static RSAPrivateKey generateRSAPrivateKey(byte[] modulus, byte[] privateExponent) throws EncryptException {

KeyFactory keyFac = null;

try {

keyFac = KeyFactory.getInstance("RSA", new org.bouncycastle.jce.provider.BouncyCastleProvider());

} catch (NoSuchAlgorithmException ex) {

throw new EncryptException(ex.getMessage());

}

RSAPrivateKeySpec priKeySpec = new RSAPrivateKeySpec(new BigInteger(modulus), new BigInteger(privateExponent));

try {

return (RSAPrivateKey) keyFac.generatePrivate(priKeySpec);

} catch (InvalidKeySpecException ex) {

throw new EncryptException(ex.getMessage());

}

}

/**

* 加密

* @param key 加密的密钥

* @param data 待加密的明文数据

* @return 加密后的数据

* @throws EncryptException

*/

public static byte[] encrypt(Key key, byte[] data) throws EncryptException {

try {

Cipher cipher = Cipher.getInstance("RSA", new org.bouncycastle.jce.provider.BouncyCastleProvider());

cipher.init(Cipher.ENCRYPT_MODE, key);

int blockSize = cipher.getBlockSize();//获得加密块大小,如:加密前数据为128个byte,而key_size=1024 加密块大小为127 byte,加密后为128个byte;因此共有2个加密块,第一个127 byte第二个为1个byte

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 EncryptException(e.getMessage());

}

}

/**

* 解密

* @param key 解密的密钥

* @param raw 已经加密的数据

* @return 解密后的明文

* @throws EncryptException

*/

public static byte[] decrypt(Key key, byte[] raw) throws EncryptException {

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 EncryptException(e.getMessage());

}

}

/**

*

* @param args

* @throws Exception

*/

public static void main(String[] args) throws Exception {

File file = new File("test.html");

FileInputStream in = new FileInputStream(file);

ByteArrayOutputStream bout = new ByteArrayOutputStream();

byte[] tmpbuf = new byte[1024];

int count = 0;

while ((count = in.read(tmpbuf)) != -1) {

bout.write(tmpbuf, 0, count);

tmpbuf = new byte[1024];

}

in.close();

byte[] orgData = bout.toByteArray();

KeyPair keyPair = RSAUtil.generateKeyPair();

RSAPublicKey pubKey = (RSAPublicKey) keyPair.getPublic();

RSAPrivateKey priKey = (RSAPrivateKey) keyPair.getPrivate();

byte[] pubModBytes = pubKey.getModulus().toByteArray();

byte[] pubPubExpBytes = pubKey.getPublicExponent().toByteArray();

byte[] priModBytes = priKey.getModulus().toByteArray();

byte[] priPriExpBytes = priKey.getPrivateExponent().toByteArray();

RSAPublicKey recoveryPubKey = RSAUtil.generateRSAPublicKey(pubModBytes,pubPubExpBytes);

RSAPrivateKey recoveryPriKey = RSAUtil.generateRSAPrivateKey(priModBytes,priPriExpBytes);

byte[] raw = RSAUtil.encrypt(priKey, orgData);

file = new File("encrypt_result.dat");

OutputStream out = new FileOutputStream(file);

out.write(raw);

out.close();

byte[] data = RSAUtil.decrypt(recoveryPubKey, raw);

file = new File("decrypt_result.html");

out = new FileOutputStream(file);

out.write(data);

out.flush();

out.close();

}

}

http://book.77169.org/data/web5409/20050328/20050328__3830259.html

这个行吧

http://soft.zdnet.com.cn/software_zone/2007/0925/523319.shtml

再参考这个吧

http://topic.csdn.net/t/20040427/20/3014655.html

2Q==

已赞过

已踩过<

你对这个回答的评价是?

评论

收起

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/559979.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java string值传递_String是值传递还是引用传递

string中的坑最近看到一道关于string的面试题&#xff0c;差点让我以为string是值传递&#xff0c;就是下面这个例子&#xff0c;体验下&#xff1a;public class demo{public static void main(string[] args) {demo d new demo();string str "bea";d.change(str)…

java切换jdk版本_切换JDK版本quick

最近遇到一个小问题&#xff0c;同时做两个项目&#xff0c;jdk版本一个是5&#xff0c;一个是6&#xff0c;我也去网上找了找方法&#xff0c;但是感觉不是特别好用&#xff0c;最后自己通过一些环境变量设置的技巧和一些批处理命令来使得这件事情只需要双击&#xff0c;输入一…

Linux下导出MySQL为SQL文件_MySQL导入导出.sql文件步骤

MySQL导入导出.sql文件步骤如下&#xff1a;一.MySQL的命令行模式的设置&#xff1a;桌面->我的电脑->属性->环境变量->新建->PATH“&#xff1b;path\mysql\bin;”其中path为MySQL的安装路径。二.简单的介绍一下命令行进入MySQL的方法&#xff1a;1.C:\>mys…

java 对象视图框架_Stripes视图框架Java对象属性验证和prototype.js Ajax的测试

Stripes视图框架Java对象属性验证&#xff0c;它允许对字段设置是否必须填写&#xff0c;对数字大小进行限制等。我用prototype.js Ajax 将验证后的数据及时地展示出来&#xff0c;下面来看程序。1、编写User实体类此用户共三个属性&#xff1a; name、email、age.package com.…

java中unicode显示乱码_Java 已知Java系统编码是GBK,jtextarea从一编码为Unicode的文本中读取数据,出现乱码,怎么正常显示?...

Java 已知Java系统编码是GBK&#xff0c;jtextarea从一编码为Unicode的文本中读取数据&#xff0c;出现乱码&#xff0c;怎么正常显示&#xff1f;关注:159 答案:2 mip版解决时间 2021-02-03 12:45提问者鉨瞞着所囿亾&#xff0c;爱着誰2021-02-02 16:35我觉得jtextarea中读取…

php怎么seo,怎样学习seo

学习seo的方法&#xff1a;1、从搜索引擎原理开始&#xff0c;学习seo要先从搜索引擎原理开始&#xff1b;2、多思考&#xff1b;3、学习seo要多看高质量的seo教程&#xff1b;4、多和seo高手交流&#xff0c;经常听听大神的seo理论&#xff0c;集百家之所长&#xff0c;这样会…

php ip 短时间 重复,php 限制同一个IP 一段时间不能评论多次,能给我详细解决的...

php 限制同一个IP 一段时间不能评论多次,能给我详细解决的mip版 关注:163 答案:3 悬赏:30解决时间 2021-01-25 15:27已解决2021-01-25 05:54php 限制同一个IP 一段时间不能评论多次,能给我详细解决的最佳答案2021-01-25 06:49在评论的操作中&#xff0c;都需要记录用户ip地址…

java 8 list,JAVA8 ListListInteger list中再装一个list转成一个list操作

我就废话不多说了&#xff0c;大家还是直接看代码吧~List collect IntStream.range(1, 10).boxed().collect(Collectors.toList());List collect1 IntStream.range(10, 20).boxed().collect(Collectors.toList());List> lists new ArrayList<>();lists.add(collect…

matlab中创建一个工程,从文件夹创建新工程

从文件夹创建新工程如果您有许多文件并希望将它们整理为一个工程(无论是否进行源代码管理)&#xff0c;请按照以下步骤创建一个新工程。使用 Simulink Start Page 中的 Folder to Project 模板可轻松将一个文件夹转换为工程。该模板会自动将您的文件添加到工程中&#xff0c;并…

Java定义变量x初始值为3,JAVA 第一章

第一章1.注释&#xff1a;一个好的开发习惯&#xff0c;应该是多编写注释&#xff0c;这样程序的可读性增强。单行注释// 单行注释 &#xff0c;只注释当前行多行注释/*多行注释多行注释*/javadoc 注释/**javadoc 注释javadoc 注释javadoc 注释*/注意&#xff1a;这种注释是比较…

血型算法php,血型排行榜!(真的很准)

一最容易动怒的人是&#xff1a;1.O 型&#xff1a;急性子&#xff0c;一点小事就能惹火他&#xff0c;性格中有好斗的一面&#xff0c;会以 " 我想发泄一下 " 为理由大发雷霆。2.B 型&#xff1a;看上去脾气很好&#xff0c;其实性情很直接&#xff0c;被愤怒冲昏头…

每个java小应用程序都得继承,JAVA复习题3

23.容器JFrame及JPanel默认的布局管理器分别是()A、FlowLayout和GridLayoutB、BorderLayout和FlowLayoutC、FlowLayout和FlowLayoutD、CardLayout和BorderLayout24.在开发一个JAVA GUI程序时&#xff0c;通常都要对按键事件作出响应和处理&#xff0c;一般需要在程序的开头写上…

anaconda下安装python,Windows下Anaconda的安装和简单使用方法

Anaconda is a completely free Python distribution (including for commercial use and redistribution). It includes over 195 of the most popular Python packagesfor science, math, engineering, data analysis.1、安装anaconda之前什么都不需要安装&#xff0c;直接在…

oracle免费云攻略,使用免费的Oracle云服务-创建云主机

上一篇我们讲了如何注册并使用Oracle的免费云服务&#xff0c;这篇我们讲如何创建免费的云主机。进入到控制台后&#xff0c;从左上角的菜单栏进入到Instances的管理界面&#xff1a;然后点击&#xff0c;则会进入创建云主机的界面。创建云主机真的非常简单&#xff0c;甚至你都…

oracle groupq by,oracle group by 性能优化

慕田峪9158850(1) 选择最有效率的表名顺序(只在基于规则的优化器中有效)&#xff1a;ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名&#xff0c;FROM子句中写在最后的表(基础表 driving table)将被最先处理&#xff0c;在FROM子句中包含多个表的情况下,你必须选择记录…

oracle面向对象的数据类型,Oracle面向对象编程OOP

1.2.6 嵌套表AS TABLE OF嵌套表是表中之表&#xff0c;一个嵌套表是某些行的集合&#xff0c;它在主表中表示为其中的一列。对主表中的每一条记录&#xff0c;嵌套表可以包含多个行。语法如下&#xff1a;CREATE OR REPLACE TYPE table_name AS TABLE OF type;语法说明&#x…

oracle 序列验证脚本,oracle 生成序列脚本

今天在移植一个项目的的数据库时,要移动所有的序列,下面就是一个如何生成序列脚本的语句方法一:SELECT CREATE SEQUENCE ||SEQUENCE_NAME|| INCREMENT BY ||INCREMENT_BY || START WITH ||LAST_NUMBER|| MAXVALUE ||MAX_VALUE || CACHE ||CACHE_SIZE|| ORDER NOCYCLE ;FROM u…

php打开EXCEL过慢,打开excel很慢,编辑某个工作表很卡

一些啰嗦的话&#xff1a;同事一个office ,excel档有五个工作表&#xff0c;打开时非常慢的。进去后其中只要点击到两个工作表其中一个就很卡甚至没响应。试用wps打开流畅。但她坚持要用office说用惯了&#xff0c;没办法女人。这个文档接近3M&#xff0c;都是一些数据也没见有…

linux vim命令跳到67行,Linux学习之Vim/Vi使用(十三)

Linux学习之Vim/Vi使用Vim/Vi简介Vim/Vi工作模式Vim/Vi基本使用Vim/Vi应用技巧Vim/Vi简介Vim/Vi是一个功能强大的全屏幕文本编辑器&#xff0c;是Linux/UNIX上最常用的文本编辑器&#xff0c;它的作用是建立、编辑、显示文本文件。Linux下的编辑器最常用的就是vim或者vi文本编辑…

linux查看端口属性,linux如何查看系统属性指令?

linux是一款非常免费资源的操作系统&#xff0c;但是很多用户不知道怎么查看系统信息&#xff0c;今天小编就给大家带来了linux查看系统属性指令分享。喜欢的快点下载吧。linux查看系统属性指令分享1、查看cpu信息查看所有cpu信息&#xff1a;cat /proc/cpuinfo查看cpu类型&…