密码学第二次实验报告:RSA算法

实验题目

RSA算法

实验目的

了解公钥算法基本原理和RSA算法的原理。了解RSA算法在数据加密和数字签名中的应用。了解RSA算法中大和数分解的困难性,从而理解单向函数的
内涵。

实验要求

  1. 编程实现素数的选择判断
  2. 编程实现模逆算法。
  3. 编程实现快速模指运算。
  4. 编程实现RSA算法。
  5. 编程实现利用RSA进行数据加解密。
  6. 实现利用RSA对较大数据进行加解密(选作)
  7. 实现简单的GUI界面

实验原理与理论基础

RSA算法:

简介

RSA算法的单向函数基于质因数分解问题。
质因数分解问题指数论中的一个简单事实:计算两个素数的乘积很简单,但要把这个乘积重新分解为两个素数却很难。

步骤

RSA算法由三部分构成:密钥生成算法,加密算法,解密算法

1. 密钥生成算法

随机生成两个素数 p,q
计算 n=pq
计算欧拉函数 φ(n)=(p−1)(q−1)φ(n)=(p−1)(q−1)
选取一较小的与φ(n)φ(n)互质的正整数e。那么(n, e)为密钥对中的公钥

计算e在模φ(n)φ(n)下的数论倒数d,d≡e−1modφ(n)d≡e−1modφ(n),那么(n, d)为密钥对中的私钥

2. 加密算法

计算
C=fe(M)=Memodn
C=fe(M)=Memodn

其中M为明文,(n, e)为公钥,C为密文

3. 解密算法

计算
M=fd(C)=Cdmodn
M=fd(C)=Cdmodn

其中C为密文,(n, d)为私钥,M为明文
根据加密、解密过程中n、e、d三数扮演的角色,我们把n称为公共模数,把e称为公共指数,把d称为私有指数。

数学基础:

同余

两个整数a、b,如果他们除以正整数m的余数相等,那a和b同余。用公式来表示就是:

amodm=bmodm⇔a≡bmodm

数论倒数

普通算术运算中,如果ab=1ab=1,那么我们说a和b互为倒数。类似地,在同余式中,如果ab≡1modmab≡1modm ,我们说在模m下,a和b互为数论倒数,或者说乘法逆元。有时候也记作a≡b−1modma≡b−1modm或者b≡a−1modm

欧拉函数

欧拉函数φ(n)φ(n),也就是对于正整数n,小于或等于n且与n互质的正整数的个数。比如φ(6)φ(6),不超过6并且跟6互质的有1和5两个数,则φ(6)=2φ(6)=2。
特别地,对于任意素数p,所有小于p的正整数都跟它互质,所以φ(p)=p−1φ(p)=p−1。
另外,如果p和q均为素数,那么对于整数n=pqn=pq,有φ(n)=φ(p)φ(q)=(p−1)(q−1)φ(n)=φ(p)φ(q)=(p−1)(q−1)

欧拉定理

如果a和m都是整数,并且互质,那么有:
···
aφ(m)≡1modm
···

费马小定理

如果a为整数,p为素数,且a与p互质(也就是p不能整除a),那么:

ap−1≡1modp

中国剩余定理

中国剩余定理常用于一元线性同余方程组的求解,在这里我们介绍它的一个推论。
如果 p, q 互质,n = p * q,则对任意整数 x 和 a
···
{x≡amodpx≡amodq⇔x≡amodn
···

实验过程和结果测试

素数测试

1. 平方根测试:如果n是素数,则 1 模 n 的平方根是 +1 和 -1

如果n是合数,则 1 模n 的平方根除了 +1 和 -1外,还可能有其他值。

  • 输入123,可以看到123没有通过平方根测试


    image.png
image.png
  • 输入13,可以看到13通过平方根测试


    image.png

2.费马测试:

如果n是素数,则a^n = a mod n
如果n是合数,则a^n = a mod n 以一定概率成立
比如561是合数,但它可以通过费马测试,有许多这样的数存在,所以要配合其他素数判定规则
注意,不能使用a^(n-1) = 1 mod n 来判断,因为 a 不一定与n 互素

  • 输入123,测试次数为123的一半,可以看到123费马测试不通过



    image.png
  • 输入17,通过费马测试


    image.png

3. miller素数测试

  • 输入123


  • 输入17


    image.png

RSA算法的加密与解密

  • 输入p,q,可算出n和n的欧拉函数t


    image.png
  • 输入e,判断e是否与t互素,如果不互素重新输入,如果互素,则计算得出d


    image.png

    image.png
  • 输入1,进行加密


    image.png
  • 输入2,进行解密


  • 输入0,退出

实验分析与反思

  • 平方根测试:一开始不知道怎么做,后来仔细想了一下,按老师密码学例子那里的原理一步一步写,因为负数和整数是一样的,所以负数部分没有,因此计算出结果为1的有几个,如果超过一个就判断为合数,否则为素数。
  • 费马测试:一开始想着说要随机生成a,那就得随机生成不同的a,在这里卡了一段时间,后来写出来了,就让他随机生成后的a和之前的比较,如果一样就舍弃,否则加入数组。然后这里测试的次数用的是输入的n的一半,一开始想着固定100次,但是如果输入的n太小,就会做很多无用功,所以选择了n的一半。
  • miller测试:一开始想自己写,但实在写不出来了,所以后来网上找了代码,并看懂。
  • rsa算法:本来自己把需要的函数都写好了,打算输入明文然后程序自动生成p和q,还有e和d,但是写了很久一直有错误,后来因为时间原因只能放弃了,采用手动输入p,q,e的方法,就很简单了,一下子就写好了。

你可能感兴趣的:(密码学第二次实验报告:RSA算法)