密码学实验

密码学实验二

一、实验目的(本次实验所涉及并要求掌握的知识点)

  1. 掌握RSA算法的基本原理并根据给出的RSA算法简单的实现代码源程序,以及能够使用RSA对文件进行加密。
  2. 掌握素性测试的基本原理,并且会使用Python进行简单的素性测试以及初步理解Solovag-Strassen检测,Lehmam检测,Rabin-Miller检测算法。

二、实验原理和技术路线

(一)RSA编码实验

  1. 非对称密码
    对称密码算法要求通信双方通过交换密钥实现使用同一个密钥,这在密钥管理、发布和安全性方面存在很多问题,而非对称密码算法解决了这个问题。非对称密码算法是指一个加密系统的加密密钥和解密密钥是不相同,或者说不能从其中一个推导出另一个。在非对称密码算法的两个密钥中,一个是用于加密的密钥,可以公开的称为公钥;另一个是用于解密的密钥,是保密的称为私钥。非对称密码算法解决了对称密码体制中密钥管理难题,并提供对信息发送人的身份进行验证的手段,是现代密码学的最重要的发明和进展。
  2. RSA编码密码原理
    RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但是想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作。RSA是被研究得最广泛的公钥算法,从提出到现今的三十多年里,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一。由于进行的都是大数计算,使得RSA最快的情况也比DES慢上好几倍,无论是软件还是硬件实现,速度一直是RSA的缺陷,一般来说只用于少量数据加密,RSA的速度比对应同样安全级别的对称密码算法要慢1000倍左右。
  • 公钥:选择两个互异的大素数p和q,n是二者的乘积,即n=pq使Φ(n)=(p-1)(q-1),Φ(n)为欧拉函数,随机选取正整数e使其满足gcd(e,Φ(n))=1即e和Φ(n)互质,则将(n,e)作为公钥。
  • 私钥:求出正数d使其满足e×d=1modΦ(n)则将(n,d)作为私钥。
  • 加密算法:对于明文M由C=Memodn得到密文C。
  • 解密算法:对于密文C由M=Cdmodn得到明文M如果窃密者获得了n,e和密文C为了破解密文必须计算出私钥d为此需要先分解n为p和q为了提高破解难度,达到更高的安全性,一般商业应用要求n的长度不小于1024bit,更重要的场合不小于2048bit。
    加密解密算法的数学表达式为:
    加密: c i = m i e m o d n ( 1 ≤ i ≤ t ) c_i=m_i^emodn(1≤i≤t) ci=miemodn(1it)
    解密: m i = c i d m o d n ( 1 ≤ i ≤ t ) m_i=c_i^dmodn(1≤i≤t) mi=cidmodn(1it)
  1. RSA算法缺点
    1)产生密钥很麻烦,受到素数产生技术的限制,因而难以做到一次一密。
    2)安全性,RSA的安全性依赖于大数的因子分解,但并没有从理论上证明破译RSA的难度与大数分解难度等价,而且密码学界多数人士倾向于因子分解不是NP问题。
    3)速度太慢,由于RSA的分组长度太大,为保证安全性,n至少也要600bits以上,使运算代价很高,尤其是速度较慢,较对称密码算法慢几个数量级;且随着大数分解技术的发展,这个长度还在增加,不利于数据格式的标准化。

(二)素性测试编码实验

  1. 素数(质数):质数又称素数。一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数;否则称为合数。(质数和合数中不包括负数)
  2. 素性检测:在以往判断一个数a是不是素数时,都是采用i从2到sqrt(a)能否整除a。如果能整除,则a是合数;否则是素数。但是该算法的时间复杂度为O(sqrt(a)),当a较大时,时间性能很差,特别是在网络安全和密码学上一般都需要很大的素数。而从目前来看,确定性算法判断素数的性能都不好,所以可以用MC(蒙特卡洛)概率算法来解决,其中MillerRabin算法就是其中的很经典的解决方法。下面首先介绍下相关的数学理论。
  3. 理论基础:Fermat小定理:若a是素数,则对所有1≤n≤a-1的整数a,有n(a-1)moda=1;该定理的逆否命题也成立,即n(a-1)moda!=1,则n为合数。但是如果a是素数,就不一定成立了,比如当n=4,a=15时,4^14mod15=1,但是4不是素数而是合数。
  4. Fermat素性测试:算法Fermat(n,t),其中n>2为奇数,t为测试次数。
    1)对i从1到t做如下循环:
  • 随机选择m,1<m<n-1;
  • 计算d=gcd(m,n),如果d>1,则返回“合数”,否则反之;
  • 计算r≡m^(n-1)(modn);
  • 若r≠1,则返回“合数”。
    2)返回“素数”。
    算法主要应用了费马小定理,但m^(p-1)≡1(modp)仅是素数的必要条件。
    上述算法将一个合数判断为素数的出错概率为1/2^t,但是返回合数的判定总是对的。只要增加测试次数t,就可以把出错概率降至趋近于0。
  1. Lehmam素性测试
    1)对i从1到t做如下循环:
  • 选择一个小于n的随机数a;
  • 计算a^((n-1)/2)modn;
  • 如果a^((n-1)/2)≠1或-1,那么返回合数。(n肯定不是素数)
    2)返回素数。(n不是素数的可能性至多是50%)
    算法主要运用了上面提到的第一条定理,2是素数且是n-1的素因子,在这里代替了q。
  1. Solovay-Strassen素性测试
    1)对i从1到t做如下循环:
  • 选择一个小于n的随机数a;
  • 计算j≡a^((n-1)/2)modn;
  • 如果j≠1或-1,则返回n不是素数;
  • 计算Jacobi符号J(a,n)=(a/n);
  • 如果j≠(a/n),返回n不是素数。
    2)返回n是素数
    算法中的步骤3同样使用了第一条定理判断出合数。而后又用素数性质加强了判断,所以这一测试准确度更高。

三、实验方法和步骤(或程序代码或操作流程)

(1)RSA编码实验

运行代码RSA.py:
在系统中打开文档进行代码的查看,在Linux系统命令行中输入vimcryptography/RSA/RSA.py,系统显示出来代码:

#!/usr/bin/env python
#-*-coding: utf-8-*-
import math
def isPrime(number):
i=2
sqrtNumber=int( math. sqrt(number))
for i in range( 2, sqrtNumber+1):
if number%i=0:
return False
i=i+1
return True
if
name_-"_main_":
print"*"*77
Flag =False
while Flag=False
p = int( raw_input( "Please input a prime(P):"))
Flag=isPrime(p)
if Flag=False
print "What you input is not a prime!"
print "The P is:", p
Flag =False
while Flag=False
q = int( raw_input( "Please input a prime(Q):"))
ifp=q
continue
Flag =isPrime(q)
if Flag=False
print "What you input is not a prime!"
print "The Q is:",q)while Flag =False
e =int(raw_input( "Please input a number(E):"))
if (e<1 or e>t):
continue
d=0
while (((e*d)%t)!=1):
d+=1
Flag =True
print "The E is: ", e
print "The D is: ", d
print "The Public Key(E, N) is:",e, n
print "The Private Key(D, N) is:", d, n
print "*"*77
Flag =False
while Flag =False:
plainText =int(raw_input("Please input a plaintext:"))
if (plainText < n):
Flag =True
print "The plaintext is: ", plainText
print "Encrypt"+","*7
cipherText =(plainText**e)%n
print "cipherText is: ", cipherText
print "Decrypt"+","*7
plain =(cipherText**d)%n
print "The plain is: ", plain
print "*"*77
if plainText =plain:
print "RSA Test success, "
else
print "RSA Test unsuccess!")

查看完毕后,输入:q退出查看,之后对这段代码进行验证,输入以下代码查看到目录下有一个RSA.py文件。

cd/root/cryptography/RSA/ls

在这里插入图片描述

执行RSA.py来验证加密过程。

在这里插入图片描述

(2)素性测试编码实验

登录系统后,查看到目录"/root/cryptography/"下有个"zhishucs.py"文件。
在这里插入图片描述

查看该文件的内容:
在这里插入图片描述

执行zhishucs.py,判断给定的数字是否为素数。

在这里插入图片描述

四、实验过程原始记录(测试数据、图表截图、计算等)

(1)RSA编码实验测试数据

  1. 测试数据为:11,17,13,180 得到加密后的密文为130
    在这里插入图片描述

  2. 测试数据为13 29 17 250 得到加密后的密文为113
    在这里插入图片描述

(2)素性检测实验数据

  1. 16 检测结果为非素数

在这里插入图片描述

  1. 17 检测结果为素数
    在这里插入图片描述

  2. 331 检测结果为素数

在这里插入图片描述

五、实验小结

  1. 实验中遇到的问题及解决方式
  • 现象:在输入素数 P 和 Q 时,系统提示 “输入非素数”,但实际输入的数字(如 11、17)应为素数,导致程序反复要求重新输入。
  • 原因:根据实验文档描述,代码中素数判断函数isPrime的逻辑可能存在漏洞,例如未正确处理边界值(如输入 1 或 2 时的判断),或循环条件错误导致漏检因子。
  • 解决方式:根据提示输入素数或非素数
  1. 实验体会和收获
  • 知识落地:通过代码运行直观理解 RSA 密钥生成与加解密流程,验证了欧拉函数、模逆元的数学关系。
  • 算法局限:试除法不适用于大素数判断,认识到概率素性测试的必要性;RSA 效率受大数运算制约,需结合实际场景选择算法。
  • 编程细节:调试中发现边界条件处理和模运算的重要性,提升了代码逻辑严谨性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/83854.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

力扣面试150题-- 从中序与后序遍历序列构造二叉树

Day 44 题目描述 思路 这题类似与昨天那题&#xff0c;首先来复习一下&#xff0c;后序遍历&#xff0c;对于后序遍历每一个元素都满足以下规律&#xff1a; &#xff08;左子树&#xff09;&#xff08;右子树&#xff09;&#xff08;根&#xff09;&#xff0c;那么我们直…

2区组的2水平析因实验的混区设计

本文是实验设计与分析&#xff08;第6版&#xff0c;Montgomery著傅珏生译)第7章2k析因的区组化和混区设计第7.4节的python解决方案。本文尽量避免重复书中的理论&#xff0c;着于提供python解决方案&#xff0c;并与原书的运算结果进行对比。您可以从Detail 下载实验设计与分析…

反向传播算法——矩阵形式递推公式——ReLU传递函数

总结反向传播算法。 来源于https://udlbook.github.io/udlbook/&#xff0c;我不明白初始不从 x 0 \boldsymbol{x}_0 x0​开始&#xff0c;而是从 z 0 \boldsymbol{z}_0 z0​开始&#xff0c;不知道怎么想的。 考虑一个深度神经网络 g [ x i , ϕ ] g[\boldsymbol{x}_i, \bold…

2025年PMP 学习二十三 16章 高级项目管理

2025年PMP 学习二十三 16章 高级项目管理 文章目录 2025年PMP 学习二十三 16章 高级项目管理高级项目管理战略管理战略管理的组成要素&#xff1a;企业战略转化为战略行动的阶段&#xff1a; 组织战略类型战略组织类型组织级项目管理OPM&#xff08;公司项目管理&#xff09; 组…

Journal of Real-Time Image Processing 投稿过程

投稿要求双栏12页以内(包括参考文献)&#xff0c;这个排版要求感觉不是很严格&#xff0c;我当时就是用普通的双栏的格式去拍的版&#xff0c;然后就提交了&#xff0c;也没单独去下载模版。 投稿过程 12.12 Submission received 12.12 Submission is under technical check 1…

t检验详解:原理、类型与应用指南

t检验详解&#xff1a;原理、类型与应用指南 t检验&#xff08;t-test&#xff09;是一种用于比较两组数据均值是否存在显著差异的统计方法&#xff0c;适用于数据近似正态分布且满足方差齐性的场景。以下从核心原理、检验类型、实施步骤到实际应用进行系统解析。 一、t检验的…

Web4X·AI实业未来家庭普及产品矩阵

Web4XAI实业未来家庭普及产品矩阵 > 打造一个“AI能干活、人更自由”的超级生活系统&#xff08;web4-web4.0&#xff09; 一、AI生活服务类 1、代表产品&#xff1a;  AI语音助手&#xff08;对话、提醒、天气、家庭调度&#xff09;  AI陪护机器人&#xff08;老…

Centos上搭建 OpenResty

一、OpenResty简介 OpenResty 是基于 Nginx 的扩展平台&#xff0c;完全兼容 Nginx 的核心功能&#xff08;如 HTTP 服务和反向代理&#xff09;&#xff0c;同时通过内嵌 LuaJIT 支持&#xff0c;允许开发者用 Lua 脚本灵活扩展业务逻辑。它简化了动态逻辑的实现。 二、安装…

项目管理进阶:基于IPD流程的项目管理部分问题及建议书【附全文阅读】

该文档主要探讨了研发项目管理中存在的问题及改进建议。指出项目组织、项目计划、项目监控等方面存在的问题&#xff0c;并给出了相应的设计要点。建议建立跨部门、全流程的项目计划体系&#xff0c;加强风险管理&#xff0c;引入科学的估计方法&#xff0c;建立项目历史数据积…

JVM之GC常见的垃圾回收器

收集器适用区域特点适用场景Serial新生代单线程&#xff0c;STW&#xff08;Stop-The-World&#xff09;客户端小应用Parallel Scavenge新生代多线程&#xff0c;吞吐量优先后台计算任务ParNew新生代Serial 的多线程版配合 CMS 使用CMS老年代并发标记&#xff0c;低延迟响应优先…

免费私有化部署! PawSQL社区版,超越EverSQL的企业级SQL优化工具面向个人开发者开放使用了

1. 概览 1.1 快速了解 PawSQL PawSQL是专注于数据库性能优化的企业级工具&#xff0c;解决方案覆盖SQL开发、测试、运维的整个流程&#xff0c;提供智能SQL审核、查询重写优化及自动化巡检功能&#xff0c;支持MySQL、PostgreSQL、Oracle、SQL Server等主流数据库及达梦、金仓…

HTTP/HTTPS与SOCKS5协议在隧道代理中的兼容性设计解析

目录 引言 一、协议特性深度对比 1.1 协议工作模型差异 1.2 隧道代理适配难点 二、兼容性架构设计 2.1 双协议接入层设计 2.2 统一隧道内核 三、关键技术实现 3.1 协议转换引擎 3.1.1 HTTP→SOCKS5转换 3.1.2 SOCKS5→HTTP转换 3.2 连接管理策略 3.2.1 智能连接池 …

3DGS——基础知识学习笔记

1.什么是3D高斯泼溅&#xff08;3D Gaussian Splatting&#xff09;&#xff1f; 目标&#xff1a;从一组稀疏的3D点&#xff08;比如通过相机或激光雷达采集的点云&#xff09;重建出高质量的3D场景&#xff0c;并支持实时渲染。 核心思想&#xff1a;用许多“3D高斯分布”&…

【C++】不推荐使用的std::allocator<void>

文章目录 不推荐使用的std::allocator<void>1. 核心区别2. 成员函数对比(1) allocate 和 deallocate(2) construct 和 destroy 3. 设计动机(1) std::allocator<T>(2) std::allocator<void> 4. 使用场景示例(1) std::allocator<int>(2) std::allocator&…

Go 语言云原生微服务全栈实战:Docker 镜像优化、K8s 编排与 Istio 流量治理

本系列文章将以 Go 语言为主导开发语言&#xff0c;系统性地讲解如何从零构建一个基于微服务架构的应用系统&#xff0c;涵盖以下核心模块&#xff1a; 使用 Go 构建高性能微服务构建精简且高效的 Docker 镜像利用 Kubernetes 进行微服务编排与部署通过 Istio 实现微服务的流量…

windows下authas调试tomcat

一般情况下&#xff0c;我们只需要输入以下代码 java -jar authas.jar调试tomcat时需要加上进程号 java -jar authas.jar <PID> 此外&#xff0c;如果你使用的是 Java 11 或更高版本&#xff0c;你需要添加 --add-opens 参数&#xff0c;以便 Arthas 能够访问 JVM 的内…

01_springboot中bean的生命周期

文章目录 bean的生命周期1. Bean定义阶段2. Bean实例化阶段3. 属性赋值阶段4. 初始化阶段5. 使用阶段6. 销毁阶段 bean的生命周期 在Spring Boot中&#xff0c;Bean的生命周期包括定义、实例化、属性赋值、初始化、使用和销毁等阶段。下面我将详细解释这些阶段&#xff0c;并提…

Oracle基础知识

目录 1.别名的使用 2.AND的优先级高于OR 3.where后面可以接别名&#xff0c;order by后面不可以 4.Oracle中SQL的执行顺序(重点) 5.dual万用表 6.是否区分大小写 7.Oracle常用数据类型 8.Oracle常用函数 (1)length字符、lengthb字节和cast强制类型转换 (2)数据类型转…

React 播客专栏 Vol.13|样式不难搞,Tailwind CSS 与 SVG 实战入门

&#x1f44b; 欢迎回到《前端达人 React 播客书单》第 13 期&#xff08;正文内容为学习笔记摘要&#xff0c;音频内容是详细的解读&#xff0c;方便你理解&#xff09;&#xff0c;请点击下方收听 视频版&#xff1a; 文字版&#xff1a; 今天我们进入样式化的实战环节&…

matlab慕课学习3.5

于20250520 3.5 用while 语句实现循环结构 3.5.1while语句 多用于循环次数不确定的情况&#xff0c;循环次数确定的时候用for更为方便。 3.5.2break语句和continue语句 break用来跳出循环体&#xff0c;结束整个循环。 continue用来结束本次循环&#xff0c;接着执行下一次…