![计算机网络安全实验指导](https://wfqqreader-1252317822.image.myqcloud.com/cover/930/35276930/b_35276930.jpg)
2.2 RSA数据加密、解密算法实验
2.2.1 实验内容
1. 实验目的
通过实验,让学生充分理解和掌握RSA算法。
2. 实验内容与要求
(1)编程实现RSA加、解密软件,并调试通过。
(2)利用RSA对某一数据文件进行单次加密和解密操作。
(3)提供大素数生成功能:可产生长度最大可达300位十六进制数(约合360位十进制数)的大素数,可以导出素数,也可以从文件中导入素数,也可以产生一个指定长度的随机大素数。
3. 实验环境
(1)平台:Windows或Linux。
(2)编程语言:C、C++、Python任选其一,建议由教师指定。
(3)RSA加密、解密函数库(由教师提供,或要求学生从互联网上搜索下载)。鼓励不使用已有的加密、解密函数库,而是完全自己实现所有代码。
2.2.2 gmpy2简介
gmpy2是Python的一个扩展库,是对GMP的封装,与其早期版本gmpy相比,经过调整和封装,gmpy2使用起来要方便得多。
GMP高精度算术运算库(GNU Multiple Precision Arithmetic Library)是一个开源的高精度运算库,不仅支持普通的整数、实数、浮点数的高精度运算,还支持随机数生成,尤其是提供了非常完备的数论中的运算接口,比如Miller-Rabin素数测试算法、大素数生成、欧几里德算法、求域中元素的逆、Jacobi符号、legendre符号等。很多Python版本的RSA算法的实现使用了gmpy2扩展库提供的功能函数。
gmpy扩展库的源码下载地址为https://github.com/aleaxit/gmpy,gmpy2扩展库的源码下载地址为https://pypi.python.org/pypi/gmpy2/。
下面是利用gmpy2实现的大数分解的示例代码:
![](https://epubservercos.yuewen.com/7E3453/18822094208349606/epubprivate/OEBPS/Images/39779-00-024-01.jpg?sign=1739686844-zieiMiac7RVxx39CWFLzVDImkhKJX9tv-0-43b1cc53057a42e4c0b674c418b1bcf2)
上述代码将大数63281217910257742583918406571分解为125778791843321和5031151 67373251。分解所需的时间与运行平台有关。
下面的示例Python代码是寻找1000以内的素数。
![](https://epubservercos.yuewen.com/7E3453/18822094208349606/epubprivate/OEBPS/Images/39779-00-024-02.jpg?sign=1739686844-jeMGU375Hs6GBv8Sr8cqKLhFe2d7BrEG-0-8257916a8986f0ed829647f0368bf6f4)
下面以ubuntu 18.04操作系统为例,介绍gmpy2的安装过程。
gmpy2依赖GMP、MPFR、MPC三个库,因此在Linux上安装前得先安装这三个库。
需要在Python 3.6中进行,用python --version查看版本,如果是3.6就直接做第一步,如果不是就进行预准备。
预准备工作如下:
(1)sudo apt-get install git python-virtualenv libssl-dev libffi-dev build-essential libpython3-dev python3-minimal authbind virtualenv //安装Python 3.6.9
(2)update-alternatives --list python //如果报错update-alternatives: error: no alternatives for python,则做下一步,没有则下一步不用做
(3)update-alternatives --install /usr/bin/python python /usr/bin/python2.7 1 update-alternatives --install /usr/bin/python python /usr/bin/python3.6 1
(4)update-alternatives --config python //可以看到几个Python版本的候选项,选择Python 3.6的编号
(5)python --version //确认这时候Python已经是3.6.9版本了
下面是正式的安装过程:
(1)先建立两个文件夹。
![](https://epubservercos.yuewen.com/7E3453/18822094208349606/epubprivate/OEBPS/Images/39779-00-025-01.jpg?sign=1739686844-hWLDIsGhiRLaVeD6UP4bBMQqqBC39VPJ-0-17becb193a0cdb6062a29dc90c334d43)
(2)测试有没有安装m4模块,安装GMP。
![](https://epubservercos.yuewen.com/7E3453/18822094208349606/epubprivate/OEBPS/Images/39779-00-025-02.jpg?sign=1739686844-ODu4LyUQqEY8JMTD9qRXcT5KXJjXaXLC-0-7981836c48bdfafc88ba81769ae50935)
出现No manual entry for m4,说明没有安装m4模块。所以先安装m4模块,防止编译GMP时报错:
![](https://epubservercos.yuewen.com/7E3453/18822094208349606/epubprivate/OEBPS/Images/39779-00-025-03.jpg?sign=1739686844-9DphT0kfi9nKX7mRBb1kRIInnkjwPzTP-0-f4f649dad004486800ce933c52439295)
开始安装GMP:
![](https://epubservercos.yuewen.com/7E3453/18822094208349606/epubprivate/OEBPS/Images/39779-00-025-04.jpg?sign=1739686844-SEGaP8dhfw1Y0qwQY3mW9b3ejc1xYJHa-0-1d861103c602d68ffb77818a70f87280)
(3)安装MPFR。
![](https://epubservercos.yuewen.com/7E3453/18822094208349606/epubprivate/OEBPS/Images/39779-00-025-05.jpg?sign=1739686844-uYoNsuDIziApKGnAF7JrE6smJ6Y7ACMm-0-edb1ca6d3e942c8adc4301511ff1934a)
(4)安装MPC。
![](https://epubservercos.yuewen.com/7E3453/18822094208349606/epubprivate/OEBPS/Images/39779-00-026-01.jpg?sign=1739686844-RhjKoXQz20QqKtgrfEvhSuxmGyPTiEd9-0-fed478043b8dc164b20e28a0d1f218ae)
(5)安装gmpy2。
![](https://epubservercos.yuewen.com/7E3453/18822094208349606/epubprivate/OEBPS/Images/39779-00-026-02.jpg?sign=1739686844-2AAqkjRVpTl6RcSeZfAhgkkdjuG9Bmau-0-e3a116fc5694387954ee579aa57249b1)
(6)检查。
命令行进入Python模式后,输入import gmpy2没报错就成功了:
![](https://epubservercos.yuewen.com/7E3453/18822094208349606/epubprivate/OEBPS/Images/39779-00-026-1.jpg?sign=1739686844-BLCQEduFFO6QUXviJN11p8jAuATl911z-0-5b2a3ad7899427bbdf3317651f5802e2)
说明:关于m4、GMP、MPFR及MPC的下载,可以选择使用最新版本,也可以不选择使用最新版本。GMP官网地址为https://gmplib.org/,MPFR官网地址为http://www.mpfr.org/mpfr-current/#download,MPC官网地址为http://www.multiprecision.org/mpc/download.html。注意:MPFR要使用最新版,如果要使用GMP和MPC的其他版本,则替换版本号即可。
版本在2-2.1.0b1以上的gmpy2在执行python setup.py build_ext --static=$HOME/static install时会报错,所以这里选取的是低版本的2-2.1.0a1。
2.2.3 实验示例
RSA算法的详细介绍参考教材2.5.1节。
1. 示例代码(Python语言)
![](https://epubservercos.yuewen.com/7E3453/18822094208349606/epubprivate/OEBPS/Images/39779-00-026-03.jpg?sign=1739686844-ngx9vPBBwOaJj2XRlEsDJdG9AQD8pdVH-0-8aa094c8466d90272e2de94a443211be)
![](https://epubservercos.yuewen.com/7E3453/18822094208349606/epubprivate/OEBPS/Images/39779-00-027-01.jpg?sign=1739686844-rbKMVV1zlFrHKJbo9sT3XlJBMIKi4tsD-0-6f20b8a978a03019c61ba9f03b37b451)
2. 运行结果
(1)运行平台:Windows 10。
(2)编译环境:Python 2.7、gmpy2。
运行结果如图2-2所示。
![](https://epubservercos.yuewen.com/7E3453/18822094208349606/epubprivate/OEBPS/Images/39779-00-028-1.jpg?sign=1739686844-dBZz3D9IH7K9XAwrnR9N2z6PUoJPDzeC-0-358af7c2c913cd384be7a909387b00ae)
图2-2 运行结果