计算机网络安全实验报告--非对称密码算法RSA

计算机网络安全实验报告--非对称密码算法RSA
计算机网络安全实验报告--非对称密码算法RSA

实验二非对称密码算法RSA

一、实验目的

通过实际编程了解非对称密码算法RSA的加密和解密过程,加深对非对称密码算法的认识。

二、实验环境

运行Windows或Linux操作系统的PC机,具有gcc(Linux)、VC(Windows)等C语言编译环境。

三、实验内容和步骤

1)编写一个程序,随机选择3个较大的数x、e、n,然后计算xe mod n,

记录程序运行时间。实际中应用的素数为512位,n也就为1024位。

这样的大数在计算机上如何表示、如何进行运算,查阅资料给出简单说明。

RSA依赖大数运算,目前主流RSA算法都建立在512位到1024位的大数运算之上,所以我们在现阶段首先需要掌握1024位的大数运算原理。

大多数的编译器只能支持到64位的整数运算,即我们在运算中所使用的整数必须小于等于64位,即:0xffffffffffffffff也就是

18446744073709551615,这远远达不到RSA的需要,于是需要专门建立大数运算库来解决这一问题。

最简单的办法是将大数当作字符串进行处理,也就是将大数用10进制字

符数组进行表示,然后模拟人们手工进行“竖式计算”的过程编写其加减乘除函数。但是这样做效率很低,因为1024位的大数其10进制数字个数就有数百个,对于任何一种运算,都需要在两个有数百个元素的数组空间上做多重循环,还需要许多额外的空间存放计算的进位退位标志及中间结果。当然其优点是算法符合人们的日常习惯,易于理解。

另一种思路是将大数当作一个二进制流进行处理,使用各种移位和逻辑操作来进行加减乘除运算,但是这样做代码设计非常复杂,可读性很低,难以理解也难以调试。

(2)计算机在生成一个随机数时,并不一定就是素数,因此要进行素性检测。

是否有确定的方法判定一个大数是素数,要查阅资料,找出目前实际可行的素数判定法则,并且比较各自的优缺点。

所谓素数,是指除了能被1和它本身整除而不能被其他任何数整除的数。

根据素数的定义,只需用2到N-1去除N,如果都除不尽则N是素数,结束知其循环。由此得算法1。

(1)flay=0,i=2. /*flay为标志,其初值为0,只要有一个数除尽,其值变为1.

(2)If n mod i=0 then flay=l else i=i+1/* n mod i是n除以i的余数.

(3)If flay=0 and I<=n-1 then(2) else go (4)

(4)If flay=0 then write“n是素数。”else write“不是素数”

最坏的情形下,即N是素数时,算法1需要执行N-2次除法,时间复杂

性太大。

假设N桶分解成iXj(i,j是小于N的整数),则必存在一个因子(1<=i<=int(√n)),这样只需用2到int(√n)去除N即可,于是循环次数可以大减小,由此得出算法2

算法2(改进算法)

(1)flag=0,i=2

(2)if n mod i then flag=1else i=i+1

(3)if flag=0 and i<=int(√n) then go(2) else go(4)

(4)if flah=0 then write”n是素数”else write “n不是素数“。

最坏的情形下,即当N是纱数时1需要执行int(√n)-1次除法。

虽然算法2比算法1确是快了不小,但有重复计算,如果用2去除N时若不尽则用2的倍数去除N也除不尽,于是只要2除不尽,2的倍数就不用去除,这样可以减少除法次数,由此得出算法3(1)for(i=2;int(√n);

i++)mark[i]=0/*mark是标记其初值为0,只要它的因子除不尽其值变为1。

(2)i=2,flag=0

(3)while(flag=0and i<=int(√n)

{If mark[i]=0

Then

{ If n mod i=0

Then flag=1

Else

S=i+i

While s

{Mark[s]=1

S=s+i}

}

}i=i+1

}

(4)if flag=0 then write”n是素数。Else write “N不是素数。“

该算法迭代重复次数仍为int(√n)次,但是筛法算法在执行过程中,每次都筛去许多数,使下一次迭代时不用再除法而只做比较,比较比除法运算要简单得多,因此实际执行速度比算法1,算法2要得多。

当然,对于素数的判定还有别的方法,如用概率算法求素数,但其理论太难,一般情况下很少用。关于素数的判定问题还有待发现简单更高效的方法。

(3)附件中给出了一个密码算法库,其中包括各种对称加密算法、非对称加

密算法、Hash算法和数字签名算法。找出其中关于RSA算法的部分,并且基于标准输入输出写一段用RSA加密文件的程序。

程序代码:

#include

#include "mycrypt.h"

using namespace std;

int main(void)

{

int err, hash_idx, prng_idx, res;

unsigned long l1,l2;

unsigned char pt2[128],out[1024];

rsa_key key;

/* register prng/Hash */

if (register_prng(&sprng_desc) ==-1) { printf("Error registering sprng");

return EXIT_FAILURE;

}

if (register_hash(&sha1_desc) ==-1) { printf("Error registering sha1");

return EXIT_FAILURE;

}

hash_idx = find_hash("sha1");

prng_idx = find_prng("sprng");

/* make an RSA-1024 key */

if ((err = rsa_make_key(NULL, /* PRNG state */ prng_idx,/* PRNG idx */

1024/8, /* 1024-bit key */

65537,/* we like e=65537 */

&key)/* where to store the key */

) != CRYPT_OK) {

printf("rsa_make_key %s", error_to_string(err));

return EXIT_FAILURE;

}

FILE *fd1;

FILE *fd2;

FILE *fd3;

fd1=fopen("plaintext1.txt","rb");

fd2=fopen("cipertext.txt","wb");

int count=0;

unsigned char p_buf[16];

unsigned char tt[]="TestApp";

l1 = sizeof(out);

while(true)

{

count=fread(p_buf,sizeof(unsigned char),16,fd1);

for(int j=0;j

cout<

if ((err = rsa_encrypt_key(p_buf,/* data we wish to encrypt */ count,/* data is 16 bytes long */

out, /* where to store ciphertext */

&l1, /* length of ciphertext */

tt,/* our lparam for this program */

7,/* lparam is 7 bytes long */

NULL,/* PRNG state */

prng_idx,/* ping idx */

hash_idx,/* Hash idx */

&key)/* our RSA key */

) != CRYPT_OK) {

printf("rsa_encrypt_key %s", error_to_string(err));

return EXIT_FAILURE;}

fwrite(out,sizeof(unsigned char),l1,fd2);

if(count<16)

break;

count=0;

}

fclose(fd1);

fclose(fd2);

fd2=fopen("cipertext.txt","rb");

fd3=fopen("plaintext2.txt","wb");

unsigned char c_buf[128];

long l3=sizeof(c_buf);

while(true)

{

count=fread(c_buf,sizeof(unsigned char),128,fd2);

if(count==0)

break;

l2=sizeof(pt2);

if((err=rsa_decrypt_key(c_buf,/*encrypted data*/ l3,/*length of ciphertext*/

pt2,/*where to put plaintext*/

&l2,/*plaintext length*/

tt,/*lparam for this program*/

7,/*lparam is 7 bytes long*/

NULL,/*PRNG state*/

prng_idx,/*prng idx*/

hash_idx,/*hash idx*/

&res,/*validity of data*/

&key)/*our RSA key*/

) != CRYPT_OK){

printf("err=rsa_decrypt_key %s",error_to_string(err));

return EXIT_FAILURE;}

for(int k=0;k

cout<

fwrite(pt2,sizeof(unsigned char),l2,fd3);

count=0;

}

fclose(fd2);

fclose(fd3);

return 0;

}

程序执行结果如下:

加密前的明文为:

加密后的密文为:

心得体会

对非对称密码算法RSA的理解加深了,会运用一些现成的算法进行编程,对一些比较复杂的算法开始基本认识并深刻的掌握。

相关主题
相关文档
最新文档