RSA算法

RSA算法

RSA 算法描述

*RSARivetShamirAdleman1978年在美国麻省理工学院研制出来的,它是一种比较典型的公开密钥加密算法。

*基础

大数分解和素性检测——将两个大素数相乘在计算上很容易实现,但将该乘积分解为两个大素数因子的计算量是相当巨大的,以至于在实际计算中是不能实现的。 

1.RSA密码体制的建立:

(1)选择两个不同的大素数pq

(2)计算乘积n=pqΦ(n)=(p-1)(q-1); 

(3)选择大于1小于Φ(n)的随机整数e,使得gcd(e,Φ(n))=1

(4)计算d使得de=1mod Φ(n)

(5)对每一个密钥k=(n,p,q,d,e),定义加密变换为Ek(x)=xemodn,解密变换为Dk(x)=ydmodn,这里x,y∈Zn

(6){e,n}为公开密钥,{p,q,d}为私有密钥。

 

2.RSA算法实例:

下面用两个小素数717来建立一个简单的RSA算法:

(1)选择两个素数p=7q=17

(2)计算n=pq=7    17=119,计算Φ(n)=(p-1)(q-1)=6  16=96

(3)选择一个随机整数e=5,它小于Φ(n)96并且于96互素;

(4)求出d,使得de=1mod96d<96,此处求出d=77,因为

   77   53854  961

(5)输入明文M19,计算191195次幂,Me19566mod119,传出密文C66

(6)接收密文66,计算6611977次幂;Cd=6677≡19mod119得到明文19。   

题目:hdu1211(水题)、pku2447、zoj2320、http://acm.timus.ru/problem.aspx?space=1&num=1141

 

PS:

专家建议


p和q的长度应只差几个数字。
(p-1)和(q-1)都应该包含大的素因子。
gcd(p-1,q-1)应该很小。

e的选择 

为了提高RSA的加密速度。最常用的三个e值是3,17和65537。(X.509中建议采用65537,PEM中建议采用3,PKCS#1中建议采用3或65537)。

转自:http://www.cnblogs.com/feature/articles/1824514.html

hdu1211

import java.util.Scanner;

public class hdu1211RSA {
//2013-12-15 17:45:17	Accepted	1211	140MS	5280K	791 B	Java	1983210400
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		long  e, c, F, n, p, q,l, d, i;;
	
	  Scanner sc = new Scanner(System.in );
	  while(sc.hasNext()){
		  p = sc.nextLong();
		  q = sc.nextLong();
		  e = sc.nextLong();
		  l = sc.nextLong();		 
		  n = p*q;		 
		  F =(p-1)*(q-1); 
		  for( i=1; ; i++)
			  if((i*e)%F==1)
				  break;
			d = i;  		  
		  for( i=0;i<l;i++){
			  c = sc.nextLong();
			  System.out.print((char)powMod(c,d,n));
		  }
		System.out.println();
	  }     
	}
	private static long powMod(long c, long d, long n) {
		long res=1;
		while(d>0){
			if((d&1)==1)
				res =((res%n)*c)%n;
			    c = ((c%n)*(c%n))%n; 
			d >>= 1;			
		}
		return res;
	}
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值