搜档网
当前位置:搜档网 › rsa加密算法_源代码_c__实现

rsa加密算法_源代码_c__实现

rsa加密算法_源代码_c__实现
rsa加密算法_源代码_c__实现

RSA算法

#include

#include

#include

typedef struct RSA_PARAM_Tag

{

unsigned __int64 p, q; //两个素数,不参与加密解密运算

unsigned __int64 f; //f=(p-1)*(q-1),不参与加密解密运算

unsigned __int64 n, e; //公匙,n=p*q,gcd(e,f)=1

unsigned __int64 d; //私匙,e*d=1 (mod f),gcd(n,d)=1

unsigned __int64 s; //块长,满足2^s<=n的最大的s,即log2(n)

} RSA_PARAM;//小素数表

const static long g_PrimeTable[]=

{

3,

5,

7,

11,

13,

17,

19,

23,

29,

31,

37,

41,

43,

47,

53,

59,

61,

67,

71,

73,

79,

83,

89,

97

};

const static long g_PrimeCount=sizeof(g_PrimeTable) / sizeof(long);const unsigned __int64 multiplier=12747293821;

const unsigned __int64 adder=1343545677842234541;//随机数类

class RandNumber

{

/* */

private:

unsigned __int64 randSeed;/* */

public:

RandNumber(unsigned __int64 s=0);

unsigned __int64 Random(unsigned __int64 n);

};/* */

RandNumber::RandNumber(unsigned __int64 s)

{

if(!s)

{

randSeed= (unsigned __int64)time(NULL);

}

else

{

randSeed=s;

}

}/* */

unsigned __int64 RandNumber::Random(unsigned __int64 n)

{

randSeed=multiplier * randSeed + adder;

return randSeed % n;

}static RandNumber g_Rnd;/*

模乘运算,返回值x=a*b mod n

*/

inline unsigned __int64 MulMod(unsigned __int64 a, unsigned __int64 b, unsigned __int64 n) {

return a * b % n;

}/*

模幂运算,返回值x=base^pow mod n

*/

unsigned __int64 PowMod(unsigned __int64 &base, unsigned __int64 &pow, unsigned __int64 &n)

{

unsigned __int64 a=base, b=pow, c=1;

while(b)

{

while(!(b & 1))

{

b>>=1; //a=a * a % n; //函数看起来可以处理64位的整数,但由于这里a*a在a>=2^32时已经造成了溢出,因此实际处理范围没有64位

a=MulMod(a, a, n);

} b--; //c=a * c % n; //这里也会溢出,若把64位整数拆为

两个32位整数不知是否可以解决这个问题。

c=MulMod(a, c, n);

} return c;

}/*

Rabin-Miller素数测试,通过测试返回1,否则返回0。

n是待测素数。

注意:通过测试并不一定就是素数,非素数通过测试的概率是1/4

*/

long RabinMillerKnl(unsigned __int64 &n)

{

unsigned __int64 b, m, j, v, i;

m=n - 1;

j=0; //0、先计算出m、j,使得n-1=m*2^j,其中m是正奇数,j是非负整数while(!(m & 1))

{

++j;

m>>=1;

} //1、随机取一个b,2<=b

b=2 + g_Rnd.Random(n - 3); //2、计算v=b^m mod n

v=PowMod(b, m, n); //3、如果v==1,通过测试

if(v == 1)

{

return 1;

} //4、令i=1

i=1; //5、如果v=n-1,通过测试

while(v != n - 1)

{

//6、如果i==l,非素数,结束

if(i == j)

{

return 0;

} //7、v=v^2 mod n,i=i+1

v=PowMod(v, 2, n);

++i; //8、循环到5

} return 1;

}/*

Rabin-Miller素数测试,循环调用核心loop次

全部通过返回1,否则返回0

*/

long RabinMiller(unsigned __int64 &n, long loop)

{

//先用小素数筛选一次,提高效率

for(long i=0; i < g_PrimeCount; i++)

{

if(n % g_PrimeTable[i] == 0)

{

return 0;

}

} //循环调用Rabin-Miller测试loop次,使得非素数通过测试的概率降为(1/4)^loop for(long i=0; i < loop; i++)

{

if(!RabinMillerKnl(n))

{

return 0;

}

} return 1;

}/*

随机生成一个bits位(二进制位)的素数,最多32位

*/

unsigned __int64 RandomPrime(char bits)

{

unsigned __int64 base;

do

{

base= (unsigned long)1 << (bits - 1); //保证最高位是1

base+=g_Rnd.Random(base); //再加上一个随机数

base|=1; //保证最低位是1,即保证是奇数

} while(!RabinMiller(base, 30)); //进行拉宾-米勒测试30次

return base; //全部通过认为是素数

}/*

欧几里得法求最大公约数

*/

unsigned __int64 EuclidGcd(unsigned __int64 &p, unsigned __int64 &q)

{

unsigned __int64 a=p > q ? p : q;

unsigned __int64 b=p < q ? p : q;

unsigned __int64 t;

if(p == q)

{

return p; //两数相等,最大公约数就是本身

}

else

{

while(b) //辗转相除法,gcd(a,b)=gcd(b,a-qb)

{

a=a % b;

t=a;

a=b;

b=t;

} return a;

}

}/*

Stein法求最大公约数

*/

unsigned __int64 SteinGcd(unsigned __int64 &p, unsigned __int64 &q)

{

unsigned __int64 a=p > q ? p : q;

unsigned __int64 b=p < q ? p : q;

unsigned __int64 t, r=1;

if(p == q)

{

return p; //两数相等,最大公约数就是本身

}

else

{

while((!(a & 1)) && (!(b & 1)))

{

r<<=1; //a、b均为偶数时,gcd(a,b)=2*gcd(a/2,b/2)

a>>=1;

b>>=1;

} if(!(a & 1))

{

t=a; //如果a为偶数,交换a,b

a=b;

b=t;

} do

{

while(!(b & 1))

{

b>>=1; //b为偶数,a为奇数时,gcd(b,a)=gcd(b/2,a)

} if(b < a)

{

t=a; //如果b小于a,交换a,b

a=b;

b=t;

} b=(b - a) >> 1; //b、a都是奇数,gcd(b,a)=gcd((b-a)/2,a) } while(b);

return r * a;

}

}/*

已知a、b,求x,满足a*x =1 (mod b)

相当于求解a*x-b*y=1的最小整数解

*/

unsigned __int64 Euclid(unsigned __int64 &a, unsigned __int64 &b) {

unsigned __int64 m, e, i, j, x, y;

long xx, yy;

m=b;

e=a;

x=0;

y=1;

xx=1;

yy=1;

while(e)

{

i=m / e;

j=m % e;

m=e;

e=j;

j=y;

y*=i;

if(xx == yy)

{

if(x > y)

{

y=x - y;

}

else

{

y-=x;

yy=0;

}

}

else

{

y+=x;

xx=1 - xx;

yy=1 - yy;

} x=j;

} if(xx == 0)

{

x=b - x;

} return x;

}/*

随机产生一个RSA加密参数

*/

RSA_PARAM RsaGetParam(void)

{

RSA_PARAM Rsa={ 0 };

unsigned __int64 t;

Rsa.p=RandomPrime(16); //随机生成两个素数

Rsa.q=RandomPrime(16);

Rsa.n=Rsa.p * Rsa.q;

Rsa.f=(Rsa.p - 1) * (Rsa.q - 1);

do

{

Rsa.e=g_Rnd.Random(65536); //小于2^16,65536=2^16

Rsa.e|=1; //保证最低位是1,即保证是奇数,因f一定是偶数,要互素,只能是奇数

} while(SteinGcd(Rsa.e, Rsa.f) != 1); Rsa.d=Euclid(Rsa.e, Rsa.f);

Rsa.s=0;

t=Rsa.n >> 1;

while(t)

{

Rsa.s++; //s=log2(n)

t>>=1;

} return Rsa;

}/*

拉宾-米勒测试

*/

void TestRM(void)

{

unsigned long k=0;

cout << " - Rabin-Miller prime check.\n" << endl;

for(unsigned __int64 i=4197900001; i < 4198000000; i+=2)

{

if(RabinMiller(i, 30))

{

k++;

cout << i << endl;

}

} cout << "Total: " << k << endl;

}/*

RSA加密解密

*/

void TestRSA(void)

{

RSA_PARAM r;

char pSrc[]="abcdefghijklmnopqrstuvwxyz";

const unsigned long n=sizeof(pSrc);

unsigned char *q, pDec[n];

unsigned __int64 pEnc[n];

r=RsaGetParam();

cout << "p=" << r.p << endl;

cout << "q=" << r.q << endl;

cout << "f=(p-1)*(q-1)=" << r.f << endl;

cout << "n=p*q=" << r.n << endl;

cout << "e=" << r.e << endl;

cout << "d=" << r.d << endl;

cout << "s=" << r.s << endl;

cout << "Source:" << pSrc << endl;

q= (unsigned char *)pSrc;

cout << "Encode:";

for(unsigned long i=0; i < n; i++)

{

pEnc[i]=PowMod(q[i], r.e, r.n);

cout << hex << pEnc[i] << " ";

} cout << endl;

cout << "Decode:";

for(unsigned long i=0; i < n; i++)

{

pDec[i]=PowMod(pEnc[i], r.d, r.n);

cout << hex << (unsigned long)pDec[i] << " ";

} cout << endl;

cout << (char *)pDec << endl;

}/* */

int main(void)

{

TestRSA();

return 0;

}

RSA加密算法_源代码__C语言实现

RSA算法 1978年就出现了这种算法,它是第一个既能用于数据加密也能用于数字签名的算法。它易于理解和操作,也很流行。算法的名字以发明者的名字命名:Ron Rivest, AdiShamir 和Leonard Adleman。但RSA的安全性一直未能得到理论上的证明。 RSA的安全性依赖于大数难于分解这一特点。公钥和私钥都是两个大素数(大于100个十进制位)的函数。据猜测,从一个密钥和密文推断出明文的难度等同于分解两个大素数的积。 密钥对的产生。选择两个大素数,p 和q 。计算:n = p * q 然后随机选择加密密钥e,要求e 和( p - 1 ) * ( q - 1 )互质。最后,利用Euclid 算法计算解密密钥d, 满足e * d = 1 ( mod ( p - 1 ) * ( q - 1 ) )其中n和d也要互质。数e和n是公钥,d是私钥。两个素数p和q 不再需要,应该丢弃,不要让任何人知道。加密信息m(二进制表示)时,首先把m分成等长数据块m1 ,m2,..., mi ,块长s,其中2^s <= n, s 尽可能的大。对应的密文是:ci = mi^e ( mod n ) ( a ) 解密时作如下计算:mi = ci^d ( mod n ) ( b ) RSA 可用于数字签名,方案是用( a ) 式签名,( b )式验证。具体操作时考虑到安全性和m信息量较大等因素,一般是先作HASH 运算。RSA 的安全性。RSA的安全性依赖于大数分解,但是否等同于大数分解一直未能得到理论上的证明,因为没有证明破解RSA 就一定需要作大数分解。假设存在一种无须分解大数的算法,那它肯定可以修改成为大数分解算法。目前,RSA的一些变种算法已被证明等价于大数分解。不管怎样,分解n是最显然的攻击方法。现在,人们已能分解140多个十进制位的大素数。因此,模数n必须选大一些,因具体适用情况而定。 由于进行的都是大数计算,使得RSA最快的情况也比DES慢上100倍,无论是软件还是硬件实现。速度一直是RSA的缺陷。一般来说只用于少量数据加密。 */ #include #include #include

RSA加密算法的基本原理

RSA加密算法的基本原理 1978年RSA加密算法是最常用的非对称加密算法,CFCA 在证书服务中离不了它。但是有不少新来的同事对它不太了解,恰好看到一本书中作者用实例对它进行了简化而生动的描述,使得高深的数学理论能够被容易地理解。我们经过整理和改写特别推荐给大家阅读,希望能够对时间紧张但是又想了解它的同事有所帮助。 RSA是第一个比较完善的公开密钥算法,它既能用于加密,也能用于数字签名。RSA以它的三个发明者Ron Rivest,Adi Shamir,Leonard Adleman的名字首字母命名,这个算法经受住了多年深入的密码分析,虽然密码分析者既不能证明也不能否定RSA的安全性,但这恰恰说明该算法有一定的可信性,目前它已经成为最流行的公开密钥算法。 RSA的安全基于大数分解的难度。其公钥和私钥是一对大素数(100到200位十进制数或更大)的函数。从一个公钥和密文恢复出明文的难度,等价于分解两个大素数之积(这是公认的数学难题)。 RSA的公钥、私钥的组成,以及加密、解密的公式可见于下表: 可能各位同事好久没有接触数学了,看了这些公式不免一头雾水。别急,在没有正式讲解RSA加密算法以前,让我们先复习一下数学上的几个基本概念,它们在后面的介绍中要用到: 一、什么是“素数”? 素数是这样的整数,它除了能表示为它自己和1的乘积以外,不能表示为任何其它两个整数的乘积。例如,15=3*5,所以15不是素数;又如,12=6*2=4*3,所以12也不是素数。另一方面,13除了等于13*1以外,不能表示为其它任何两个整数的乘积,所以13是一个素数。素数也称为“质数”。 二、什么是“互质数”(或“互素数”)? 小学数学教材对互质数是这样定义的:“公约数只有1的两个数,叫做互质数。”这里所说的“两个数”是指自然数。 判别方法主要有以下几种(不限于此): (1)两个质数一定是互质数。例如,2与7、13与19。 (2)一个质数如果不能整除另一个合数,这两个数为互质数。例如,3与10、5与26。(3)1不是质数也不是合数,它和任何一个自然数在一起都是互质数。如1和9908。(4)相邻的两个自然数是互质数。如15与16。 (5)相邻的两个奇数是互质数。如49与51。 (6)大数是质数的两个数是互质数。如97与88。 (7)小数是质数,大数不是小数的倍数的两个数是互质数。如7和16。 (8)两个数都是合数(二数差又较大),小数所有的质因数,都不是大数的约数,这两个数是互质数。如357与715,357=3×7×17,而3、7和17都不是715的约数,

RSA加密算法java编程实现

一、RSA加密算法的原理 (1)、RSA算法描述 RSA公钥密码体制的基本原理:根据数论,寻求两个大素数比较简单,而将他们的乘积分解开则极为困难。 (2)、RSA算法密钥计算过程: 1.用户秘密选取两个大素数p 和q,计算n=pq,n称为 RSA算法的模数,公开。 2.计算出n的欧拉函数Φ(n) = (p-1)×(q-1),保密。 3.从(1, Φ(n))中随机地选择一个与Φ(n)互素的数e作为加 密密钥,公开。 4.计算出满足下式的d 作为解密密钥,保密。 ed=1 mod Φ(n) (3)、RSA算法密钥: 加密密钥PK = |e, n| 公开 解密密钥SK = |d, n| 保密 (4)、RSA算法加密解密过程: RSA算法属于分组密码,明文在加密前要进行分组,分组 的值m 要满足:0 < m < n 加密算法:C = E(m) ≡me mod n 解密算法:m = D(c) ≡cd mod n (5)、RSA算法的几点说明: 1.对于RSA算法,相同的明文映射出相同的密文。

2.RSA算法的密钥长度:是指模数n的长度,即n的二进 制位数,而不是e或d的长度。 3.RSA的保密性基于大数进行因式分解很花时间,因此, 进行RSA加密时,应选足够长的密钥。512bit已被证明 不安全,1024bit也不保险。 4.RSA最快情况也比DES慢100倍,仅适合少量数据的加 密。公钥e取较小值的方案不安全。 二.RSA公钥加密算法的编程实现 以下程序是java编写的实现RSA加密及解密的算法 import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import java.security.interfaces.RSAPrivateKey; import java.security.interfaces.RSAPublicKey; import javax.crypto.Cipher; //RSATest类即为测试类 public class RSATest { //主函数 public static void main(String[] args) { try { RSATest encrypt = new RSATest(); String encryptText = "encryptText";//输入的明文 KeyPair keyPair = encrypt.generateKey();//调用函数生成密钥对,函数见下 RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate(); RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic(); byte[] e = encrypt.encrypt(publicKey, encryptText.getBytes()); //调用自己编写的encrypt函数实现加密, byte[] de = encrypt.decrypt(privateKey, e); //调用自己编写的decrypt函数实现解密, System.out.println(toHexString(e)); //输出结果,采用ASSIC码形式

密码学-RSA加密解密算法的实现课程设计报告

密码学课程报告《RSA加密解密算法》 专业:信息工程(信息安全) 班级:1132102 学号:201130210214 姓名:周林 指导老师:阳红星 时间:2014年1月10号

一、课程设计的目的 当前最著名、应用最广泛的公钥系统RSA是在1978年,由美国麻省理工学院(MIT)的Rivest、Shamir和Adleman在题为《获得数字签名和公开钥密码系统的方法》的论文中提出的。 RSA算法是第一个既能用于数据加密也能用于数字签名的算法,因此它为公用网络上信息的加密和鉴别提供了一种基本的方法。它通常是先生成一对RSA 密钥,其中之一是保密密钥,由用户保存;另一个为公开密钥,可对外公开,甚至可在网络服务器中注册,人们用公钥加密文件发送给个人,个人就可以用私钥解密接受。为提高保密强度,RSA密钥至少为500位长,一般推荐使用1024位。 公钥加密算法中使用最广的是RSA。RSA算法研制的最初理念与目标是努力使互联网安全可靠,旨在解决DES算法秘密密钥的利用公开信道传输分发的难题。而实际结果不但很好地解决了这个难题;还可利用RSA来完成对电文的数字签名以抗对电文的否认与抵赖;同时还可以利用数字签名较容易地发现攻击者对电文的非法篡改,以保护数据信息的完整性。此外,RSA加密系统还可应用于智能IC卡和网络安全产品。 二、RSA算法的编程思路 1.确定密钥的宽度。 2.随机选择两个不同的素数p与q,它们的宽度是密钥宽度的1/2。 3.计算出p和q的乘积n 。 4.在2和Φ(n)之间随机选择一个数e , e 必须和Φ(n)互素,整数e 用做加密密钥(其中Φ(n)=(p-1)*(q-1))。 5.从公式ed ≡ 1 mod Φ(n)中求出解密密钥d 。 6.得公钥(e ,n ), 私钥 (d , n) 。 7.公开公钥,但不公开私钥。 8.将明文P (假设P是一个小于n的整数)加密为密文C,计算方法为: C = Pe mod n 9.将密文C解密为明文P,计算方法为:P = Cd mod n 然而只根据n和e(不是p和q)要计算出d是不可能的。因此,任何人都可对明文进行加密,但只有授权用户(知道d)才可对密文解密 三、程序实现流程图: 1、密钥产生模块:

用实例讲解RSA加密算法(精)

可能各位同事好久没有接触数学了,看了这些公式不免一头雾水。别急,在没有正式讲解RSA加密算法以前,让我们先复习一下数学上的几个基本概念,它们在后面的介绍中要用到: 一、什么是“素数”? 素数是这样的整数,它除了能表示为它自己和1的乘积以外,不能表示为任何其它两个整数的乘积。例如,15=3*5,所以15不是素数;又如,12=6*2=4*3,所以12也不是素数。另一方面,13除了等于13*1以外,不能表示为其它任何两个整数的乘积,所以13是一个素数。素数也称为“质数”。 二、什么是“互质数”(或“互素数”)? 小学数学教材对互质数是这样定义的:“公约数只有1的两个数,叫做互质数。”这里所说的“两个数”是指自然数。 判别方法主要有以下几种(不限于此): (1)两个质数一定是互质数。例如,2与7、13与19。 (2)一个质数如果不能整除另一个合数,这两个数为互质数。例如,3与10、5与26。(3)1不是质数也不是合数,它和任何一个自然数在一起都是互质数。如1和9908。(4)相邻的两个自然数是互质数。如15与16。 (5)相邻的两个奇数是互质数。如49与51。 (6)大数是质数的两个数是互质数。如97与88。 (7)小数是质数,大数不是小数的倍数的两个数是互质数。如7和16。 (8)两个数都是合数(二数差又较大),小数所有的质因数,都不是大数的约数,这两个数是互质数。如357与715,357=3×7×17,而3、7和17都不是715的约数,这两个数为互质数。等等。 三、什么是模指数运算? 指数运算谁都懂,不必说了,先说说模运算。模运算是整数运算,有一个整数m,以n 为模做模运算,即m mod n。怎样做呢?让m去被n整除,只取所得的余数作为结果,就

RSA加密算法及实现

数学文化课程报告题目:RSA公钥加密算法及实现

RSA公钥加密算法及实现 摘要 公钥密码是密码学界的一项重要发明,现代计算机与互联网中所使用的密码技术都得益于公钥密码。公钥密码是基于数学的上的困难问题来保证其性。其中RSA加密算法是一项重要的密码算法,RSA利用大整数的质数分解的困难性,从而保证了其相对安全性。但如果发现了一种快速进行质数分解的算法,则RSA算法便会失效。本文利用C 语言编程技术进行了RSA算法的演示[1]。 关键词:C语言编程、RSA算法、应用数学。

RSA public key encryption algorithm Abstract Public key cryptography is an important invention in cryptography, thanks to public key cryptography, and it is used in modern computer and Internet password technology. Public key cryptography is based on the mathematics difficult problem to ensure its confidentiality. The RSA public key encryption algorithm is an important cryptographic algorithm, RSA using the difficulty that large integer is hard to be factorized into prime Numbers to ensure it safety. But if you can find a kind of fast algorithm to do the factorization, RSA algorithm will be failure. In this paper we used C language programming technology to demonstrate the RSA algorithm. Keywords:C language programming、RSA algorithm、Applied mathematics

RSA加密算法

RSA加密算法 RSA是第一个比较完善的公开密钥算法,它既能用于加密,也能用于数字签名。RSA以它的三个发明者Ron Rivest, Adi Shamir, Leonard Adleman的名字首字母命名,这个算法经受住了多年深入的密码分析,虽然密码分析者既不能证明也不能否定RSA的安全性,但这恰恰说明该算法有一定的可信性,目前它已经成为最流行的公开密钥算法。 RSA的安全基于大数分解的难度。其公钥和私钥是一对大素数(100到200位十进制数或更大)的函数。从一个公钥和密文恢复出明文的难度,等价于分解两个大素数之积(这是公认的数学难题)。 RSA的公钥、私钥的组成,以及加密、解密的公式可见于下表: 可能各位同事好久没有接触数学了,看了这些公式不免一头雾水。别急,在没有正式讲解RSA加密算法以前,让我们先复习一下数学上的几个基本概念,它们在后面的介绍中要用到: 一、什么是“素数”? 素数是这样的整数,它除了能表示为它自己和1的乘积以外,不能表示为任何其它两个整数的乘积。例如,15=3*5,所以15不是素数;又如,12=6*2=4*3,所以12也不是素数。另一方面,13除了等于13*1以外,不能表示为其它任何两个整数的乘积,所以13是一个素数。素数也称为“质数”。 二、什么是“互质数”(或“互素数”)? 小学数学教材对互质数是这样定义的:“公约数只有1的两个数,叫做互质数。”这里所说的“两个数”是指自然数。 判别方法主要有以下几种(不限于此): (1)两个质数一定是互质数。例如,2与7、13与19。 (2)一个质数如果不能整除另一个合数,这两个数为互质数。例如,3与10、5与 26。 (3)1不是质数也不是合数,它和任何一个自然数在一起都是互质数。如1和9908。 (4)相邻的两个自然数是互质数。如 15与 16。 (5)相邻的两个奇数是互质数。如 49与 51。 (6)大数是质数的两个数是互质数。如97与88。 (7)小数是质数,大数不是小数的倍数的两个数是互质数。如 7和 16。(8)两个数都是合数(二数差又较大),小数所有的质因数,都不是大数的约数,这两个数是互质数。如357与715,357=3×7×17,而3、7和17都不是715的约数,这两个数为互质数。等等。

RSA加密算法

RSA加密算法是最常用的非对称加密算法,CFCA在证书服务中离不了它。但是有不少新来的同事对它不太了解,恰好看到一本书中作者用实例对它进行了简化而生动的描述,使得高深的数学理论能够被容易地理解。我们经过整理和改写特别推荐给大家阅读,希望能够对时间紧张但是又想了解它的同事有所帮助。 RSA是第一个比较完善的公开密钥算法,它既能用于加密,也能用于数字签名。RSA以它的三个发明者Ron Rivest,Adi Shamir,Leonard Adleman的名字首字母命名,这个算法经受住了多年深入的密码分析,虽然密码分析者既不能证明也不能否定RSA的安全性,但这恰恰说明该算法有一定的可信性,目前它已经成为最流行的公开密钥算法。 RSA的安全基于大数分解的难度。其公钥和私钥是一对大素数(100到200位十进制数或更大)的函数。从一个公钥和密文恢复出明文的难度,等价于分解两个大素数之积(这是公认的数学难题)。 RSA的公钥、私钥的组成,以及加密、解密的公式可见于下表: 可能各位同事好久没有接触数学了,看了这些公式不免一头雾水。别急,在没有正式讲解RSA加密算法以前,让我们先复习一下数学上的几个基本概念,它们在后面的介绍中要用到: 一、什么是“素数”? 素数是这样的整数,它除了能表示为它自己和1的乘积以外,不能表示为任何其它两个整数的乘积。例如,15=3*5,所以15不是素数;又如,12=6*2=4*3,所以12也不是素数。另一方面,13除了等于13*1以外,不能表示为其它任何两个整数的乘积,所以13是一个素数。素数也称为“质数”。 二、什么是“互质数”(或“互素数”)? 小学数学教材对互质数是这样定义的:“公约数只有1的两个数,叫做互质数。”这里所说的“两个数”是指自然数。 判别方法主要有以下几种(不限于此): (1)两个质数一定是互质数。例如,2与7、13与19。 (2)一个质数如果不能整除另一个合数,这两个数为互质数。例如,3与10、5与26。 (3)1不是质数也不是合数,它和任何一个自然数在一起都是互质数。如1和9908。 (4)相邻的两个自然数是互质数。如15与16。 (5)相邻的两个奇数是互质数。如49与51。 (6)大数是质数的两个数是互质数。如97与88。 (7)小数是质数,大数不是小数的倍数的两个数是互质数。如7和16。 (8)两个数都是合数(二数差又较大),小数所有的质因数,都不是大数的约数,这两个数是互质数。如357与715,357=3×7×17,而3、7和17都不是715的约数,这两个数为互质数。等等。 三、什么是模指数运算? 指数运算谁都懂,不必说了,先说说模运算。模运算是整数运算,有一个整数m,以n为模做模运算,即m mod n。怎样做呢?让m去被n整除,只取所得的余数作为结果,就叫做模运算。例如,10mod3=1;26mod6=2;28mod2=0等等。

RSA加密算法(C实现)

RSA加密算法的编程实现 学号:0806580114 姓名:管睿 RSA算法是世界上第一个既能用于数据加密也能用于数字签名的非对称性加密算法。它易于理解和操作,所以流行甚广。算法的名字以发明者的名字命名,他们是:Ron Rivest,Adi Shamir 和Leonard Adleman。虽然RSA的安全性一直未能得到理论上的证实,但它经历了各种攻击,至今未被完全攻破。 在RSA算法中,先要获得两个不同的质数P和Q做为算法因子,再找出一个正整数E,使得E与 ( P - 1 ) * ( Q - 1 ) 的值互质,这个E就是私钥。找到一个整数D,使得( E * D ) mod ( ( P - 1 ) * ( Q - 1 ) ) = 1成立1[1],D就是公钥1。设N为P和Q的乘积,N则为公钥2。加密时先将文转换为一个或一组小于N的整数I,并计算I D mod N的值M,M就密文。解密时将密文M E mod N,也就是M的E次方再除以N所得的余数就是明文。 因为私钥E与( P - 1 ) * ( Q - 1 )互质,而公钥D使( E * D ) mod ( ( P - 1 ) * ( Q - 1 ) ) = 1成立。破解者可以得到D和N,如果想要得到E,必须得出( P - 1 ) * ( Q - 1 ),因而必须先对N进行因数分解。如果N很大那么因数分解就会非常困难,所以要提高加密强度P和Q的数值大小起着决定性的因素。一般来讲当P和Q都大于2128时,按照目前的机算机处理速度破解基本已经不大可能了。 RSA的安全性依赖于大数难于分解这一特点。公钥和私钥都是两个大素数(大于100个十进制位)的函数。据猜测,从一个密钥和密文推断出明文的难度等同于分解两个大素数的积。 RSA 可用于数字签名,方案是用 ( a ) 式签名, ( b )式验证。具体操作时考虑到安全性和 m信息量较大等因素,一般是先作HASH 运算。RSA 的安全性。RSA的安全性依赖于大数分解,但是否等同于大数分解一直未能得到理论上的证明,因为没有证明破解RSA就一定需要作大数分解。假设存在一种无须分解大数的算法,那它肯定可以修改成为大数分解算法。目前,RSA的一些变种算法已被证明等价于大数分解。不管怎样,分解n是最显然的攻击方法。现在,人们已能分解140多个十进制位的大素数。因此,模数n必须选大一些,因具体适用情况而定。 由于进行的都是大数计算,使得RSA最快的情况也比DES慢上100倍,无论是软件还是硬件实现。速度一直是RSA的缺陷。一般来说只用于少量数据加密。*/ #include #include #include

用java编程实现RSA加密算法

用java编程实现RSA加密算法 RSA加密算法是目前应用最广泛的公钥加密算法,特别适用于通过Internet传送的数据,常用于数字签名和密钥交换。那么我今天就给大家介绍一下如何利用Java编程来实现RSA 加密算法。 一、RSA加密算法描述 RSA加密算法是1978年提出的。经过多年的分析和研究,在众多的公开密钥加密算法中,RSA加密算法最受推崇,它也被推荐为公开密钥数据加密标准。 由数论知识可知,若将一个具有大素数因子的合数进行分解是很困难的,或者说这个问题的计算量是令人望而生畏的,而RSA加密算法正是建立在这个基础上的。 在RSA加密算法中,—个用户A可根据以下步骤来选择密钥和进行密码转换: (1)随机的选取两个不同的大素数p和q(一般为100位以上的十进制数),予以保密;(2)计算n=p*q,作为用户A的模数,予以公开; (3)计算欧拉(Euler)函数z=(p-1)*(q-1),予以保密; (4)随机的选取d与z互质,作为A的公开密钥; (5)利用Euclid算法计算满足同余方程e*d≡1modz的解d,作为用户A的保密密钥;(6)任何向用户A发送信息M的用户,可以用A的公开模数D和公开密钥e根据C=Me mod n得到密文C;

RSA加密算法的安全性是基于大素数分解的困难性。攻击者可以分解已知的n,得到p和q,然后可得到z;最后用Euclid算法,由e和z得到d。然而要分解200位的数,需要大约40亿年。 二、用Java语言描述RSA加密算法的原理 假设我们需要将信息从机器A传到机器B,首先由机器B随机确定一个private_kcy(我们称之为密钥),可将这个private_key始终保存在机器B中而不发出来。然后,由这个private_key计算出public_key(我们称之为公钥)。这个public_key的特性是:几乎不可能通过该public_key计算生成它的priyate_key。接下来通过网络把这个public_key传给机器A,机器A收到public_key后,利用public_key将信息加密,并把加密后的信息通过网络发送到机器B,最后机器B利用已知的pri.rate_key,就可以解开加密信息。 步骤: (1)首先选择两个大素数p和q,计算n=p*q;m=(p-1)(q一1); (2)而后随机选择加密密钥public_key,要求和m互质(比如public_key=m-1);(3)利用Euclid算法计算解密密钥priyate_key,使private_key满足public_key*private_key—1(mod m),其中public_key,n是作为公钥已知,priVate_key 是密钥; (4)加密信息text时,利用公式secretWord=texI^Public_key (mod n)得到密文8ecretword; (5)解密时利用公式word=text^priVate_key(mod n)得到原文word=text。

RSA加密算法的研究与实现

RSA加密算法的研究与实现 摘要:在信息时代,如何保证信息的安全是个十分重要的问题。在多年的发展中,人们提出了许多不同类型的加密算法。其中RSA加密算法是公认的最经典的非对称密码算法之一。本文首先介绍了课题研究的背景和意义,再介绍了使用的研究工具,然后使用Verilog 硬件描述语言设计了一个RSA的加密系统,最后通过Modelsim进行了仿真测试。结果证明本文通过硬件实现的RSA加密算法可以有效的加密数据。 关键词:RSA;Verilog;Modelsim;硬件仿真; Abstract:In the information age, the security of information is a very important issue. In the years of development, people have proposed many different types of encryption algorithms. RSA encryption algorithm is one of the most classical asymmetric cryptographic algorithms. This paper first introduces the background and significance of the research, then introduces the research tools, then designs a RSA encryption system using Verilog hardware description language, and finally performs simulation tests through Modelsim. The result proves that the RSA encryption algorithm implemented in hardware can be effective and efficient. Keywords:RSA; Verilog; Modelsim; Hardware simulation;

RSA算法分析与编程实现

实验二 RSA算法 实验目的: 1.深入了解RSA加密算法的加密原理 2.通过编程模拟RSA算法的加密过程 实验内容: 一. RSA概述 ①RSA加密算法是一种最常用的非对称加密算法,CFCA在证书服务中离不了它。在公钥加密标准和电子商业中,RSA被广泛使用。 ②公钥和私钥 1. 随意选择两个大的质数p和q,p不等于q,计算N=pq。 2. 根据欧拉函数,不大于N且与N互质的整数个数为(p-1)(q-1) 3. 选择一个整数e与(p-1)(q-1)互质,并且e小于(p-1)(q-1) 4. 用以下这个公式计算d:d× e≡ 1 (mod (p-1)(q-1)) 5. 将p和q的记录销毁。 (N,e)是公钥,(N,d)是私钥。(N,d)是秘密的。Alice将她的公钥(N,e)传给Bob,而将她的私钥(N,d)藏起来。 二.RSA算法的编程实现 #include #include using namespace std; void main() { int p,q;//定义存放两个质数的变量 cout<<"请输入两个较大的素数:"<>p>>q; cout<<"p="<

int e,i; float d; cin>>e;//输入e值 for(i=1;;i++)//计算d值 { d=(float)(o*i+1)/e; if(d-(int)d==0) break; } cout<<"e="<>m1[j]; if(m1[j]==-1) break; m2[j]=pow(m1[j],e); m4[j]=m2[j]/n; m3[j]=m2[j]-m4[j]*n; } cout<<"密文为:"<

RSA加密算法实验报告

四川大学计算机学院、软件学院实验报告 学号: _姓名:专业:班级:第 13 周

实验内容(算法、程序、步骤和方法)一、简介 RSA公开密钥密码体制。所谓的公开密钥密码体制就是使用不同的加密密钥与解密密钥,是一种“由已知加密密钥推导出解密密钥在计算上是不可行的”密码体制。 RSA的安全性依赖于大数分解,但是否等同于大数分解一直未能得到理论上的证明,因为没有证明破解RSA就一定需要作大数分解。假设存在一种无须分解大数的算法,那它肯定可以修改成为大数分解算法。 RSA 的一些变种算法已被证明等价于大数分解。不管怎样,分解n是最显然的攻击方法。人们已能分解多个十进制位的大素数。因此,模数n必须选大一些,因具体适用情况而定。 二、加密算法流程 密钥生成 首先要使用概率算法来验证随机产生的大的整数是否质数,这样的算法比较快而且可以消除掉大多数非质数。假如有一个数通过了这个测试的话,那么要使用一个精确的测试来保证它的确是一个质数。 除此之外这样找到的p和q还要满足一定的要求,首先它们不能太靠近,此外p-1或q-1的因子不能太小,否则的话N也可以被很快地分解。 此外寻找质数的算法不能给攻击者任何信息,这些质数是怎样找到的,尤其产生随机数的软件必须非常好。要求是随机和不可预测。这两个要求并不相同。一个随机过程可能可以产生一个不相关的数的系列,但假如有人能够预测出(或部分地预测出)这个系列的话,那么它就已经不可靠了。比如有一些非常好的随机数算法,但它们都已经被发表,因此它们不能被使用,因为假如一个攻击者可以猜出p和q一半的位的话,那么他们就已经可以轻而易举地推算出另一半。 此外密钥d必须足够大,1990年有人证明假如p大于q而小于2q(这是一个很经常的情况)而,那么从N和e可以很有效地推算出d。此外e = 2永远不应该被使用。 运算速度 由于进行的都是大数计算,使得RSA最快的情况也比DES慢上好几倍,无论是软件还是硬件实现。速度一直是RSA的缺陷。一般来说只用于少量数据加密。RSA的速度比对应同样安全级别的对称密码算法要慢1000倍左右。

rsa加密算法_源代码_c__实现

RSA算法 #include #include #include

{ /* */ private: unsigned __int64 randSeed;/* */ public: RandNumber(unsigned __int64 s=0); unsigned __int64 Random(unsigned __int64 n); };/* */ RandNumber::RandNumber(unsigned __int64 s) { if(!s) { randSeed= (unsigned __int64)time(NULL); } else { randSeed=s; } }/* */ unsigned __int64 RandNumber::Random(unsigned __int64 n) { randSeed=multiplier * randSeed + adder; return randSeed % n; }static RandNumber g_Rnd;/* 模乘运算,返回值x=a*b mod n */ inline unsigned __int64 MulMod(unsigned __int64 a, unsigned __int64 b, unsigned __int64 n) { return a * b % n; }/* 模幂运算,返回值x=base^pow mod n */ unsigned __int64 PowMod(unsigned __int64 &base, unsigned __int64 &pow, unsigned __int64 &n) { unsigned __int64 a=base, b=pow, c=1; while(b) { while(!(b & 1)) { b>>=1; //a=a * a % n; //函数看起来可以处理64位的整数,但由于这里a*a在a>=2^32时已经造成了溢出,因此实际处理范围没有64位 a=MulMod(a, a, n); } b--; //c=a * c % n; //这里也会溢出,若把64位整数拆为

RSA加密算法1

Unicode(统一码、万国码、单一码、标准万国码) 1.隨意選擇兩個大的質數p和q,p不等於q,計算N=pq。 2.根據歐拉函數,不大於N且與N互質的整數個數為(p-1)(q-1) 3.選擇一個整數e與(p-1)(q-1)互質,並且e小於(p-1)(q-1) 4.用以下這個公式計算d:d× e≡ 1 (mod (p-1)(q-1)) 5.將p和q的記錄銷毀。

(N,e)是公鑰,(N,d)是私鑰。(N,d)是秘密的。Alice將她的公鑰(N,e)傳給Bob,而將她的私鑰(N,d)藏起來。 加密消息 假设Bob想给Alice送一个消息m,他知道Alice产生的N和e。他使用起先与Alice 约好的格式将m转换为一个小于N的整数n,比如他可以将每一个字转换为这个字的Unicode码,然后将这些数字连在一起组成一个数字。假如他的信息非常长的话,他可以将这个信息分为几段,然后将每一段转换为n。用下面这个公式他可以将n加密为c: 计算c并不复杂。Bob算出c后就可以将它传递给Alice。 解密消息 Alice得到Bob的消息c后就可以利用她的密钥d来解码。她可以用以下这个公式来将c转换为n: 得到n后,她可以将原来的信息m重新复原。 解码的原理是 以及ed≡ 1 (mod p-1)和ed≡ 1 (mod q-1)。由费马小定理可证明(因为p和q是质数) 和 这说明(因为p和q是不同的质数,所以p和q互质) 签名消息

RSA也可以用来为一个消息署名。假如甲想给乙传递一个署名的消息的话,那么她可以为她的消息计算一个散列值(Message diget),然后用她的密钥(private key)加密这个散列值并将这个“署名”加在消息的后面。这个消息只有用她的公钥才能被解密。乙获得这个消息后可以用甲的公钥解密这个散列值,然后将这个数据与他自己为这个消息计算的散列值相比较。假如两者相符的话,那么他就可以知道发信人持有甲的密钥,以及这个消息在传播路径上没有被篡改过。 安全 假设偷听者乙获得了甲的公钥N和e以及丙的加密消息c,但她无法直接获得甲的密钥d。要获得d,最简单的方法是将N分解为p和q,这样她可以得到同余方程d× e≡ 1 (mod (p-1)(q-1))并解出d,然后代入解密公式 导出n(破密)。但至今为止还没有人找到一个多項式時間的算法来分解一个大的整数的因子,同时也还没有人能够证明这种算法不存在(见因数分解)。 至今为止也没有人能够证明对N进行因数分解是唯一的从c导出n的方法,但今天还没有找到比它更简单的方法。(至少没有公开的方法。) 因此今天一般认为只要N足够大,那么駭客就没有办法了。 假如N的长度小于或等于256位,那么用一台个人电脑在几个小时内就可以分解它的因子了。1999年,数百台电脑合作分解了一个512位长的N。今天对N的要求是它至少要1024位长。 1994年彼得·秀爾(Peter Shor)证明一台量子计算机可以在多項式時間内进行因数分解。假如量子计算机有朝一日可以成为一种可行的技术的话,那么秀爾的算法可以淘汰RSA和相关的衍生算法。(即依赖于分解大整数困难性的加密算法) 假如有人能够找到一种有效的分解大整数的算法的话,或者假如量子计算机可行的话,那么在解密和制造更长的钥匙之间就会展开一场竞争。但从原理上来说RSA在这种情况下是不可靠的。 实现细节 密钥生成 首先要使用概率算法来验证随机产生的大的整数是否質数,这样的算法比较快而且可以消除掉大多数非質数。假如有一个数通过了这个测试的话,那么要使用一个精确的测试来保证它的确是一个質数。

基于rsa加密算法本科论文

桂林理工大学 GUILIN UNIVERSITY OF TECHNOLOGY 本科毕业设计(论文) 题目:数据通信中的RSA加密算法的设计与实现

摘要 数据通信是依照一定的通信协议,利用数据传输技术在两个终端之间传递数据信息的一种通信方式和通信业务。随着数据通信的迅速发展而带来了数据失密问题。信息被非法截取和数据库资料被窃的事例经常发生,在日常生活中信用卡密码被盗是常见的例子。所以数据加密成为十分重要的问题,它能保证数据的安全性和不可篡改性。RSA加密算法以它难以破译的优点,被广泛的使用在电子商务和VPN中。 本文针对非对称性加密RSA算法,采用软件Visual C++6.0进行程序编写。根据模乘法运算和模指数运算的数学原理所编写的程序在进行测试后,能够通过输入两个素数进行运算从而实现明文与密文之间的转换,然后通过对公钥和私钥的管理,对所传输的数据进行保护,让数据只能由发送者和接收者阅读,以达到数据通信中数据无法被他人破译的目的。 关键词:RSA算法,数据通信,加密, 解密。

Data communication of the RSA encryption algorithm in the Design and Implementation Teacher:Chen Fei student:Lu Hui Abstract Data communications in accordance with certain communication protocols, the use of data transmission technology in the transmission of data between two terminals as a means of communication of information and communication business. With the rapid development of data communications and has brought the issue of data compromise. Unlawful interception of information and database information on frequent instances of theft, credit card in their daily lives stolen passwords is a common example. Therefore, data encryption has become a very important issue, it can ensure data security and can not be tamper with nature. RSA encryption algorithm to the merits of it difficult to decipher, was widely used in the e-commerce and VPN. In this paper, asymmetric RSA encryption algorithm, the use of software for Visual C + +6.0 programming. According to Die multiplication and modular exponentiation by the mathematical principles in the preparation of test procedures can be adopted for the importation of two prime numbers and computing in order to achieve explicit conversion between the ciphertext, and then through a public key and private key management, for the transmission of data protection, so that data can only be made by the sender and the recipient to read, in order to achieve data communications data can not be the purpose of deciphering the others. Keywords: RSA algorithms, data communication, encryption, decryption.

相关主题