实验报告 - 密码学(3)

2020-06-18 19:44

return 0; }

加密结果为:

二、公钥加密算法—RSA

一、实验目的

通过使用 RSA 算法对实验数据进行加密和解密,掌握公钥加密算法的基本原理,熟练 掌握 RSA 算法各功能模块的工作原理和具体运算过程。

二、实验原理

RSA 公钥加密算法是 1977 年由 Ron Rivest、Adi Shamirh 和 LenAdleman 在(美国麻省理工学院)开发的。RSA 取名来自开发他们三者的名字。RSA 是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的所有密码攻击,已被 ISO 推荐为公钥数据加密标准。RSA 算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但那时想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。

1. RSA 的密钥生成

RSA 的算法涉及三个参数,n、e、d。

其中,n 是两个大质数 p、q 的积,n 的二进制表示时所占用的位数,就是所谓的密 钥长度。鉴于现代对于大整数分解的水平不断增强,一般 P、Q 的取值都要求在 1024 位以上。

e 和 d 是一对相关的值,e 可以任意取,但要求 e 与(p-1)*(q-1)互质;再选择 d,要求:

(e*d)mod((p-1)*(q-1))=1。

就是密钥对。一般将前者当作公钥,后者作为私钥使用。

2. RSA 加密/解密过程

RSA 加解密和解密的算法完全相同,设 A 为明文,B 为密文,则:

A=B^e mod n;B=A^d mod n;

e 和 d 可以互换使用,即:

A=B^d mod n;B=A^e mod n;

三、实验环境

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

四、实验内容和步骤

1. 根据本讲义提供的 RSA 程序,分析 RSA 算法的实现过程:

(1)、利用:void GenerateKey(RSA_Key& PublicKey,RSA_Key& PrivateKey,unsigned int iKeySize)函数根据实际需要生成符合要求长度的公钥和私钥,大致步骤如下: a) 随机生成两个指定长度的大素数 P,Q。

b) 计算 N=P*Q,以及 N 的欧拉函数 φ(N)=(P-1)*(Q-1)。 c) 随机生成一个与 φ(N)互素的大整数 E(公钥)。

d) 根据公式 ed≡1(modΦ(N)),利用函数 multi_inverse(1, Big*, Big, Big*)计算出 私钥 D。 (2)、将某个大整数赋值给一个 Big 型变量 M(明文)。 (3)、调用函数 powmod(..,..,..,..)对明文 M 加密得到密文 C。 (4)、调用函数 powmod(..,..,..,..)对密文 C 解密得到明文 D。 (5)、比较 M 与 D 是否一致,判断实验结果是否正确。

(6)、调换公钥、私钥后重复以上步骤,验证 e、d 的可互换性,并思考为什么可以这样 做。

2. 使用实例分析 取 p=11,q=13。 首先计算:

n=pq=11×13=143

φ(n)=(p-1)(q-1)=(11-1) ×(13-1)=120

然后选择 e=17,满足 gcd(e,φ(n))=gcd(17,120)=1,然后根据 ed≡1(modφ(N))计算 d=113。

则:公钥:<17,143>、私钥:<113, 143>。

设明文信息:m=24。对明文信息加密,得密文为:

c≡m^e % N=24^173=7

密文 c 经过公开信道发送到接收方后,接收方用私钥 d 对密文进行解密:

m≡c^d % N=7^1133=24

从而正确地恢复出明文。

五、思考题

1、阐明 RSA 密钥生成以及加密、解密流程

(1)RSA密钥生成:1)找出p,q,r三个数,p,q互质,r与(p-1)(q-1)互质,p,q,r这三个数便是private key。

2)找出m,使得mr==1 mod (p-1)(q-1)

3)计算n=pq,m,n这两个数便是public key (2)流程:用户A用B的公钥对key进行加密,B收到消息后用自己的私钥进行解密获取key。

2. 使用提供的模块编写 RSA 加密程序对数据进行加密和解密,提交程序代码和执行结果。 程序代码:

#include \#include \#include

#define BUFFERSIZE 4096

static miracl* mip = mirsys ( BUFFERSIZE, 0 );

struct RSA_Key//密钥结构体 { };

int main(void) {

Big e; Big N;

}

void GenerateKey(RSA_Key& PublicKey,RSA_Key& PrivateKey,unsigned int iKeySize);//密钥生

RSA_Key PublicKey;//公钥 RSA_Key PrivateKey;//私钥 Big M;//明文M Big C;//密文C Big D;//解密文D unsigned int iKeySize;

std::cout<<\请输入加密密钥长度(单位比特)\<>iKeySize;

std::cout<<\密钥生成中......\<

GenerateKey(PublicKey,PrivateKey,iKeySize/4);//产生iKeySize bit密钥 std::cout<<\密钥生成完毕\<>std::hex>>M;

powmod(M.getbig(), PublicKey.e.getbig(), PublicKey.N.getbig(), C.getbig());//调用加密函std::cout<<\加密密文:\<

powmod(C.getbig(), PrivateKey.e.getbig(), PrivateKey.N.getbig(), D.getbig());//解密与加std::cout<<\解密:\<

std::cout<

system(\); return 0;

成函数

数计算:C=(M^e)%N

密使用同一函数,只是密钥不同即:D=(C^d)%N

void GenerateKey(RSA_Key& PublicKey,RSA_Key& PrivateKey,unsigned int iKeySize) {

unsigned int RAND_SEED = InitRandom(); irand(RAND_SEED); mip->IOBASE = 16;

set_io_buffer_size( BUFFERSIZE);

void GeneratePrime(Big* bigGenPrime,int iLength, int iBase); unsigned int InitRandom();

}

Big E,D,P,Q,N,Z;

GeneratePrime(&P, iKeySize /4, 16);//生成强素数P GeneratePrime(&Q, iKeySize /4, 16);//生成强素数Q N =P *Q;//计算N

Z = (P-1) * (Q-1);//计算N的欧拉函数 do {

GeneratePrime(&D, iKeySize /4, 16);

}while(Z % D == 0);//反复生成素数,直到该素数与Z互素,得到密钥D

multi_inverse(1, &D, Z, &E); PublicKey.e=E; PublicKey.N=N; PrivateKey.e=D; PrivateKey.N=N; return;

// 根据公式ed mod z = 1 计算E

void GeneratePrime(Big* bigGenPrime,int iLength, int iBase) { }

unsigned int InitRandom()//随机数生成函数 {

__time64_t long_time;

srand((unsigned)time(&long_time)); unsigned int RAND_SEED=rand(); }

return RAND_SEED; *bigGenPrime = 4;

// 任取非素数

set_io_buffer_size(50000);

while (!isprime(bigGenPrime->getbig()))//若非素数则: { } return;

bigdig (iLength,iBase,bigGenPrime->getbig());//重新生成


实验报告 - 密码学(3).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:20-黄德全-差分GPS在动态吃水改正中的应用与实现

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: