`
wh8766
  • 浏览: 35690 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

RSA加密算法简单实现

阅读更多
上个学期的计算机安全与保密课里的作业... 其实做出来完全是演示作用,几乎没什么实用性,还得修改
交了作业再没动过 
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++实现

    RSA加密算法的实现,使用c++语言编程,使用dev c++平台编码,文件为cpp格式。经过反复测试代码正确,可搭配RSA讲解教程一起使用,讲解教程点击我的个人主页即可查看,希望能够对你有帮助,谢谢。

    RSA加密算法的C语言实现

    RSA加密算法是公钥密码学领域的一个里程碑,由Ron Rivest、Adi Shamir和Leonard Adleman在1977年提出,因此得名RSA。它是一种非对称加密算法,即加密和解密使用不同的密钥,极大地提高了安全性。在C语言中实现RSA...

    RSA加密算法实验报告.pdf

    "RSA加密算法实验报告.pdf" ...RSA加密算法实验报告的主要内容是介绍RSA加密算法的原理和实现,包括密钥对的产生、加密和解密过程、数字签名等。本实验报告的目的是帮助读者更好地理解RSA加密算法的原理和实现。

    rsa加密算法(Delphi实现).zip

    RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。1987年首次公布,当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏...

    rsa加密算法的实现

    在C语言中实现RSA加密算法,通常涉及到以下几个关键知识点: 1. 大数运算:RSA的核心在于大整数的运算,包括加法、减法、乘法、模幂运算等。C语言本身不支持大数操作,因此需要使用特定的大数库,如GMP(GNU ...

    RSA加密算法在VB中的实现.rar_RSA VB_VB RSA_rsa加密算法_vb rsa_vb 加密

    在VB(Visual Basic)环境中实现RSA加密算法,可以帮助开发者更好地理解加密过程,并在实际项目中应用。 首先,我们需要了解RSA算法的基本原理。RSA的核心是两个大素数p和q的乘积N=p*q,以及欧拉函数φ(N)=(p-1)*(q...

    RSA加密算法C语言实现

    RSA加密算法C语言实现,int范围内可行。主要运用扩展的欧几里得算法,快速模幂算法。由于采取int四则运算,因此此版本不能进行1024bit密钥的加密。满足无限长密钥的C语言代码将稍后上传。

    rsa.zip_QT RSA加密算法_Qt rsa加密_qt rsa加密步骤_rsa_rsa算法 qt

    在本项目中,"rsa.zip_QT RSA加密算法_Qt rsa加密_qt rsa加密步骤_rsa_rsa算法 qt",开发者已经实现了RSA加密算法,并结合Qt创建了一个具有图形界面的应用,使得加密过程更为直观易用。 首先,我们来深入理解RSA...

    js实现rsa加密算法

    本rsa算法是使用Java与javascript加密解密范例代码,该资料从互联网收集,加上了自己的使用体会,如果对你有帮助那是万幸! js加密部分

    C#中关于RSA加密算法(案例代码) c#经典案例.pdf

    在C#中实现RSA加密算法需要使用到RSACryptoServiceProvider类,该类提供了RSA加密算法的实现。下面是一个简单的RSA加密和解密的示例: ```csharp using System.Security.Cryptography; public class RSAExample { ...

    RSA加密算法.ppt

    RSA加密算法.ppt

    C#实现RSA加密算法

    标题提到的"C#实现RSA加密算法"着重讲述了如何在C#中利用大整数类BigInteger和RSACryptoServiceProvider类来完成私钥加密公钥解密的过程。以下是对这个话题的详细解释: 1. **RSA算法基础**: RSA算法由Rivest、...

    C++实现RSA加密算法

    RSA加密算法是一种非对称加密技术,由Ron Rivest、Adi Shamir和Leonard Adleman在1977年提出,因此得名RSA。它是现代密码学的基础之一,广泛应用于网络安全,如数据传输加密、数字签名等场景。在这个案例中,我们将...

    java rsa加密算法实现

    在Java中实现RSA加密算法,主要涉及以下几个核心概念和步骤: 1. **RSA原理**:RSA算法基于数论中的大数因子分解难题,由两个大素数P和Q相乘得到N,然后计算N的欧拉函数φ(N) = (P-1) * (Q-1),选取一个与φ(N)互质...

    RSA加密算法的实现

    RSA加密算法是公钥密码学领域中的一个经典算法,由Ron Rivest、Adi Shamir和Leonard Adleman...同时,理解并实现这些步骤能够加深对RSA加密算法原理的理解,这对于从事信息安全和密码学领域的开发者来说是至关重要的。

    RSA加密算法实现附源代码

    ### RSA加密算法实现及其安全性分析 #### 一、概述 RSA加密算法是一种非对称加密技术,由Ron Rivest、Adi Shamir和Leonard Adleman三位科学家在1978年共同提出。该算法基于大数分解的数学难题,并且在密码学领域...

    python实现rsa加密算法

    这个算法非原创,真心不错,所以上传分享出来.实测过,满足需求

    RSA加密算法源码

    源码文件"RSA-demo"很可能包含了完整的RSA加密算法实现,通常会包含以下关键部分: 1. 大数操作:RSA涉及到大整数的加减乘除以及模幂运算,这部分通常需要自定义大数库或者利用现有的大数库实现。 2. 密钥生成:...

    RSA加密算法 C++ 实现

    RSA加密算法 C++ 实现,RSA公钥加密算法是1977年由Ron Rivest、Adi Shamirh和LenAdleman在(美国麻省理工学院)开发的。RSA取名来自开发他们三者的名字。RSA是目前最有影响力的公钥加密算法,它能够抵抗到目前为止...

Global site tag (gtag.js) - Google Analytics