上个学期的计算机安全与保密课里的作业... 其实做出来完全是演示作用,几乎没什么实用性,还得修改
交了作业再没动过
RSA过程简介(FromBaidu..-,-)
生成两个大素数p和q
取n=p*q
取t=(p-1)*(q-1)
取任何一个数e,要求满足e<t并且e与t互素(就是最大公因数为1)
取d*e%t==1
这样最终得到三个数: n d e
设消息为数M (M <n)
设c=(M**d)%n就得到了加密后的消息c
设m=(c**e)%n则 m == M,从而完成对c的解密。
注:**表示次方,上面两式中的d和e可以互换。
在对称加密中:
n d两个数构成公钥,可以告诉别人;
n e两个数构成私钥,e自己保留,不让任何人知道。
给别人发送的信息使用e加密,只要别人能用d解开就证明信息是由你发送的,构成了签名机制。
别人给你发送信息时使用d加密,这样只有拥有e的你能够对其解密。
rsa的安全性在于对于一个大数n,没有有效的方法能够将其分解
从而在已知n d的情况下无法获得e;同样在已知n e的情况下无法
求得d。
代码可能比较啰嗦..不过确实实现了
import java.math.BigInteger;
import java.util.Random;
/**
* RSA算法简单实现
* @author windy
*/
public class RSA {
/**生成素数的长度 按照bit */
public static int bit = 16; //最好是30以下
/**几个char为一组*/
public static int s = 3;
//大数参数
BigInteger p;
BigInteger q;
BigInteger n;
BigInteger xn;
BigInteger e;
BigInteger d;
/**
* 初始化所有参数
*/
public RSA() {
Random r = new Random();
p = BigInteger.probablePrime(bit, r);
q = BigInteger.probablePrime(bit, r);
n = p.multiply(q);
xn = (p.subtract(BigInteger.ONE)).multiply(q.subtract(BigInteger.ONE));
e = this.getE();
d = this.getMod();
}
/**获取E参数*/
public BigInteger getE(){
BigInteger bi = new BigInteger("123");
int k = new Random().nextInt(655) + 200;
int count = 1;
for (long i = 3; i < xn.longValue(); i++) {
k = Math.abs(k);
bi = new BigInteger(""+i);
if(bi.gcd(xn).equals(BigInteger.ONE)){
if (count > k){
return bi;
}else{
count++;
}
}
}
return bi;
}
public void print(char[] c){
System.out.println();
for (int i = 0; i < c.length; i++) {
System.out.print(c[i]+", ");
}
}
public void print(byte[] c){
System.out.println();
for (int i = 0; i < c.length; i++) {
System.out.print(c[i]+", ");
}
}
/**
* 获取加密数据
* @param meg
* @return String
*/
public String getEncryptMeg(String meg){
BigInteger[] bi = this.diliverMeg(meg);
BigInteger[] re = new BigInteger[bi.length];
for (int i = 0; i < bi.length; i++) {
re[i] = this.getWordsEncrypt(bi[i]);
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < re.length; i++) {
sb.append(re[i]);
}
return sb.toString();
}
/**
* 传入连接分组后的BI数组,进行加密和解密
* (演示用..)
* @param bi
* @return String
*/
public String getBigIntegerArrayUnencrypt(BigInteger[] bi){
BigInteger[] re = new BigInteger[bi.length];
BigInteger[] ree = new BigInteger[bi.length];
for (int i = 0; i < bi.length; i++) {
re[i] = this.getWordsEncrypt(bi[i]);
System.out.println("原始:"+bi[i]);
System.out.println("加密:"+re[i]);
}
for (int i = 0; i < re.length; i++) {
ree[i] = this.getWordsUnencrypt(re[i]);
System.out.println("解密:"+ree[i]);
}
StringBuilder sb = new StringBuilder();
String s = this.combainateMeg(ree);
return s;
}
/**
* 将字符串按照ASCII码分组连接处理 返回一个biginteger数组
* @param meg
* @return {@link BigInteger}[]
*/
public BigInteger[] diliverMeg(String meg){
int len = meg.length()/s;
if (meg.length()%s != 0){
for (int i = meg.length()%s; i < s; i++) {
meg += ' ';
}
len++;
}
BigInteger[] bi = new BigInteger[len];
for (int i = 0; i < bi.length; i++) {
String c = "";
for (int j = 0; j < s; j++) {
char a = meg.charAt(i*s+j);
System.out.print((int)a+",");
int b = Math.abs((int)a);
if (b < 100){c += "0"+String.valueOf(b);} //不足百的前补零
else{c += String.valueOf(b);} //产生了一个字符串
}
bi[i] = new BigInteger(c);
}
System.out.println();
return bi;
}
/**
* 把大数数组按照编码还原为内容
* @param bi
* @return String
*/
public String combainateMeg(BigInteger[] bi){
char[] re = new char[bi.length*s]; //解密字符串数组的容器
int index = 0;
for (int i = 0; i < bi.length; i++) {
String a = bi[i].toString();
if (a.length()%3 == 1){
// System.out.println("%3==1");
a = "00"+a;
}else if(a.length()%3 == 2){
// System.out.println("%3==2");
a = "0"+a;
}
for (int j = 0; j < s; j++) {
String b = a.substring(j*3, (j+1)*3);
int c = Integer.parseInt(b);
System.out.print(c+",");
re[index] = (char)c;
index++;
}
}
System.out.println();
return String.copyValueOf(re);
}
public BigInteger getWordsEncrypt(BigInteger bi){
return bi.modPow(e, n);
}
public BigInteger getWordsUnencrypt(BigInteger bi){
return bi.modPow(d, n);
}
/**
* 计算D的 需要一个好点的算法
* @return {@link BigInteger}
*/
public BigInteger getMod(){
long k = 1;
BigInteger re;
BigInteger temp;
for (long i = 1; i < 200000; i++) { //基本适合32bit的素数了
re = xn.multiply(BigInteger.valueOf(i));
// System.out.println(re);
re = re.add(BigInteger.ONE);
temp = re.mod(this.e);
if(temp.equals(BigInteger.ZERO)){
return re.divide(e);
}
}
return null; //时间太长 退出
}
/**
* 产生一个bit长度的素数
* @return prime
*/
public BigInteger getPrime(){
Random random = new Random();
BigInteger bi = BigInteger.probablePrime(RSA.bit, random);
System.out.println(bi);
return bi;
}
public static void main(String[] args) {
RSA rsa = new RSA();
System.out.println("q = "+rsa.q);
System.out.println("p = "+rsa.p);
System.out.println("n = "+rsa.n);
System.out.println("xn ="+rsa.xn);
System.out.println("e = "+rsa.e);
System.out.println("d = "+rsa.d);
String meg = "Test RSA encrypt method. 900";
System.out.println("原始信息: "+meg);
BigInteger[] re = rsa.diliverMeg(meg);
String s = rsa.getBigIntegerArrayUnencrypt(re);
System.out.println("还原的信息: "+s);
// System.out.println(rsa.getEncryptMeg("Test RSA encrypt method. 900"));
}
}
运行结果..
引用
RSA加密
q = 55217
p = 54499
n = 3009271283
xn =3009161568
e = 3391
d = 2555701951
原始信息: Test RSA encrypt method. 900
84,101,115,116,32,82,83,65,32,101,110,99,114,121,112,116,32,109,101,116,104,111,100,46,32,57,48,48,32,32,
原始:84101115
加密:2566550520
原始:116032082
加密:2066845781
原始:83065032
加密:2569581573
原始:101110099
加密:2576260799
原始:114121112
加密:407908162
原始:116032109
加密:1265851031
原始:101116104
加密:1573076073
原始:111100046
加密:1601185412
原始:32057048
加密:345058220
原始:48032032
加密:1574686393
解密:84101115
解密:116032082
解密:83065032
解密:101110099
解密:114121112
解密:116032109
解密:101116104
解密:111100046
解密:32057048
解密:48032032
84,101,115,116,32,82,83,65,32,101,110,99,114,121,112,116,32,109,101,116,104,111,100,46,32,57,48,48,32,32,
还原的信息: Test RSA encrypt method. 900
分享到:
相关推荐
RSA加密算法的实现,使用c++语言编程,使用dev c++平台编码,文件为cpp格式。经过反复测试代码正确,可搭配RSA讲解教程一起使用,讲解教程点击我的个人主页即可查看,希望能够对你有帮助,谢谢。
RSA加密算法是公钥密码学领域的一个里程碑,由Ron Rivest、Adi Shamir和Leonard Adleman在1977年提出,因此得名RSA。它是一种非对称加密算法,即加密和解密使用不同的密钥,极大地提高了安全性。在C语言中实现RSA...
"RSA加密算法实验报告.pdf" ...RSA加密算法实验报告的主要内容是介绍RSA加密算法的原理和实现,包括密钥对的产生、加密和解密过程、数字签名等。本实验报告的目的是帮助读者更好地理解RSA加密算法的原理和实现。
RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。1987年首次公布,当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏...
在C语言中实现RSA加密算法,通常涉及到以下几个关键知识点: 1. 大数运算:RSA的核心在于大整数的运算,包括加法、减法、乘法、模幂运算等。C语言本身不支持大数操作,因此需要使用特定的大数库,如GMP(GNU ...
RSA加密算法C语言实现,int范围内可行。主要运用扩展的欧几里得算法,快速模幂算法。由于采取int四则运算,因此此版本不能进行1024bit密钥的加密。满足无限长密钥的C语言代码将稍后上传。
在本项目中,"rsa.zip_QT RSA加密算法_Qt rsa加密_qt rsa加密步骤_rsa_rsa算法 qt",开发者已经实现了RSA加密算法,并结合Qt创建了一个具有图形界面的应用,使得加密过程更为直观易用。 首先,我们来深入理解RSA...
本rsa算法是使用Java与javascript加密解密范例代码,该资料从互联网收集,加上了自己的使用体会,如果对你有帮助那是万幸! js加密部分
在C#中实现RSA加密算法需要使用到RSACryptoServiceProvider类,该类提供了RSA加密算法的实现。下面是一个简单的RSA加密和解密的示例: ```csharp using System.Security.Cryptography; public class RSAExample { ...
RSA加密算法.ppt
标题提到的"C#实现RSA加密算法"着重讲述了如何在C#中利用大整数类BigInteger和RSACryptoServiceProvider类来完成私钥加密公钥解密的过程。以下是对这个话题的详细解释: 1. **RSA算法基础**: RSA算法由Rivest、...
RSA加密算法是一种非对称加密技术,由Ron Rivest、Adi Shamir和Leonard Adleman在1977年提出,因此得名RSA。它是现代密码学的基础之一,广泛应用于网络安全,如数据传输加密、数字签名等场景。在这个案例中,我们将...
在Java中实现RSA加密算法,主要涉及以下几个核心概念和步骤: 1. **RSA原理**:RSA算法基于数论中的大数因子分解难题,由两个大素数P和Q相乘得到N,然后计算N的欧拉函数φ(N) = (P-1) * (Q-1),选取一个与φ(N)互质...
RSA加密算法是公钥密码学领域中的一个经典算法,由Ron Rivest、Adi Shamir和Leonard Adleman...同时,理解并实现这些步骤能够加深对RSA加密算法原理的理解,这对于从事信息安全和密码学领域的开发者来说是至关重要的。
在VB(Visual Basic)环境中实现RSA加密算法,可以帮助开发者更好地理解加密过程,并在实际项目中应用。 首先,我们需要了解RSA算法的基本原理。RSA的核心是两个大素数p和q的乘积N=p*q,以及欧拉函数φ(N)=(p-1)*(q...
### RSA加密算法实现及其安全性分析 #### 一、概述 RSA加密算法是一种非对称加密技术,由Ron Rivest、Adi Shamir和Leonard Adleman三位科学家在1978年共同提出。该算法基于大数分解的数学难题,并且在密码学领域...
这个算法非原创,真心不错,所以上传分享出来.实测过,满足需求
源码文件"RSA-demo"很可能包含了完整的RSA加密算法实现,通常会包含以下关键部分: 1. 大数操作:RSA涉及到大整数的加减乘除以及模幂运算,这部分通常需要自定义大数库或者利用现有的大数库实现。 2. 密钥生成:...
RSA加密算法 C++ 实现,RSA公钥加密算法是1977年由Ron Rivest、Adi Shamirh和LenAdleman在(美国麻省理工学院)开发的。RSA取名来自开发他们三者的名字。RSA是目前最有影响力的公钥加密算法,它能够抵抗到目前为止...