以为是高性能神仙算法,一看源代码才发现...

GitHub 上有哪些优秀的项目? 首先,这个神仙项目请你pick: https://github.com/sindresorhus/awesome 各领域各语言资源大合集 另外,可以关注GitHub的每日榜单,看看大家都在关注些什么(虽然有国外小哥吐槽榜单上都是中文哈哈 https://github.com/trending/python?since=daily 推荐不同语言的几个项目: Python : youtube-dl 这个程序是一个开源的python项目。支持MacOS、Linux和Windows平台,可以在官网直接下载编译好 阅读详情

点击上方“编程派”,选择设为“设为星标”

优质文章,第一时间送达!

在昨天的文章中,我们讲到了 RSA 算法。RSA 算法的根本原理中,有两个核心质数 p和 q,他们相乘得到一个数 n。由于反向从 n 分解出 p 和 q 非常困难,所以只要 p 和 q 足够大,RSA 算法在现在的计算机水平下就无法被破解。

现在,你先暂停一下,打开百度或者 Google,搜索一下 RSA 算法的教程。随便看10篇。

你会发现,这些教程无一例外都是说:寻找两个足够大的质数 p 和 q。但他们都不会告诉你,怎么寻找。

在现在的数学体系中,质数是找出来的,而不是生成出来的。还没有一个完美的通项公式可以生成质数。我们可以做到快速检查一个数是不是质数,但是我们现在还做不到直接生成一个质数。

那么问题来了,RSA 算法中生成密钥时,需要的这两个质数,到底是怎么来的?

当我们使用 RSA 算法生成2048 bit的密钥时,我们需要找到的两个质数 p 和 q,他们各是1024bit。1024bit的数字有多大?它最小的值为 ,最大为 。如果你从最小的这个数字开始数,数到最大的这个数,每秒你能数1亿个数字,你需要数570044753571256946895391042233962688235025678254156066950247593726955466151385601004275993538836681954338260654082297557264046704764131857219835840434659197037569423594829671728507799344387665269701556798848952843855120124119935570376436804099528276139492994306780499238797710357939232321万年才能数完。

这么大范围的数字里面,让你去找两个质数。你说,这 TM 怎么找?

所以,Python的这个 rsa 库,里面是使用了什么神仙算法,能够快速找到这两个质数的?于是我去阅读了它的源代码[1]。结果吓得我一身冷汗。

生成密钥使用的是rsa.newkeys()函数,于是我首先在 rsa/key.py文件中找到了这个函数:

先看758-762行,这里它通过poolsize参数来决定使用CPU的几个核,如果我的 CPU 是4核心,那么可以同时开4个进程来寻找质数。但这段代码我们可以先跳过,因为在昨天的文章里面,我们没有指定 poolsize参数,所以它使用默认值1.于是代码运行到第767行,通过gen_keys函数来生成p 和 q。

我们再来看gen_keys函数:

可以看到,在第714行,通过函数find_p_q生成了 p 和 q,并且这里如果我们的密钥是2048bit的话,p 和q 均是1024bit。

我们再来看 find_p_q函数:

这个函数很长,但是大部分是在验证生成的 p 和 q 是否符合要求(不能相等,并且要相差足够大),如果不符合要求就重试。所以真正核心的代码只有第613行和第615行。这里调用的genprime_func函数是通过参数传进来的。而这个genprime_func是我们在newkeys函数第764行获得的rsa.prime.getprime函数。

现在我们进入/rsa/prime.py文件,阅读getprime函数的源代码:

这段代码竟然非常简单。在第162行先判断要生成的质数的bit 数不小于3.然后高潮来了:

while True:
        integer = rsa.randnum.read_random_odd_int(nbits)

        # Test for primeness
        if is_prime(integer):
            return integer

开一个死循环,调用read_random_odd_int不停获取nbit的奇数,然后,使用is_prime判断它是不是质数,如果是,返回这个数。如果不是质数,继续随机生成一个 nbit 的奇数,再判断它是不是质数。

这 TM 在逗我?在死循环里面随机生成奇数,然后判断是不是质数,不是就重试直到随机到一个质数为止?

在  到  这么大的范围里面随机选奇数?这要选多少年才碰得上两个质数啊?

为了解决这个疑惑,我们来看一下素数定理[2]。

对于正实数 ,定义π(x)为素数计数函数,亦即不大于x的素数个数。数学家找到了一些函数来估计π(x)的增长:

”

在  足够大时,可以使用这个公式估算出不大于  的质数的个数。

那么我们来看看,在  到  的范围中,质数的密度是多少:

质数的密度竟然高达0.14%!那么随机选一个数字,不是质数的概率是99.86%。我们来计算一下,如果随机选10000个数字,即使在不考虑奇偶性的情况下:

也就是说,在随机10000个数字里面,不出现质数的概率是一千万分之一。出现质数的概率超过99.9999%

而用 Python 循环10000次,并不需要多长时间。所以,rsa 库里面的这个算法,竟然没什么问题!!

最后,大家有兴趣可以看看prime.py中的is_prime函数,用于快速判断一个数是不是质数。还有randnum.py中的read_random_odd_int用于随机生成一个奇数,代码都很简单,相信你能学到不少东西。

参考资料

[1]

源代码: https://github.com/sybrenstuvel/python-rsa

[2]

素数定理: https://zh.wikipedia.org/wiki/%E8%B3%AA%E6%95%B8%E5%AE%9A%E7%90%86

回复下方「关键词」,获取优质资源

回复关键词「 pybook03」,立即获取主页君与小伙伴一起翻译的《Think Python 2e》电子版
回复关键词「入门资料」,立即获取主页君整理的 10 本 Python 入门书的电子版
回复关键词「m」,立即获取Python精选优质文章合集
回复关键词「book 数字」,将数字替换成 0 及以上数字,有惊喜好礼哦~
题图:pexels,CC0 授权。

好文章,我在看
深入分析Prime95 v308b15a源码:软件开发与优化的实践探索 在1996年,George Woltman编写了Prime95,这款软件起初是为测试互联网梅森素数大搜索(GIMPS)项目的服务器计算能力而设计。随着时间的推移,Prime95逐渐成为了一个知名工具,不仅帮助数学家和程序员发现大素数,还在电脑硬件爱好者之间变得流行,用于测试个人电脑组件的稳定性和极限性能。Prime95的源码文件结构是其功能模块划分和维护的基础。在软件的根目录下,源码按照功能被划分为多个子目录,通常包括核心算法实现、用户界面和系统性能监控等模块。 阅读详情

相关推荐

docker-prime95

这是一个运行Mersenne Prime Search软件Prime95的Docker容器。 Github: : DockerHub: ://hub.docker.com/r/lbthomsen/docker-prime95/ 在Github上提交新版本时,会自动生成Docker映像。 请注意,该图像使用Prime95的二进制版本。

2021-11-01

RSA #!/usr/bin/env python3 import gmpy2 from Crypto.Util.number import getPrime from Crypto.PublicKey import RSA from Crypto.Cipher import PKCS1_v1_5 from base64 import b64encode flag = open('flag', 'r').read().strip() * 23 def encrypt(p, q, e, msg):

m0_57291352的博客 3616

100位大奇数生成

100位大奇数随机生成,运用c++语言,少用循环,效率还行,每次生成不同数,可和质数判定连用,生成大素数。

限量版算法神仙文档,在Github上标星50W+的,足矣让你吊打95%的对手,厉害了~

前不久,GitHub 上出现了一个手把手带你刷 LeetCode 的项目。该项目此前在 GitHub 开源后,连续多次霸榜 GitHub Trending 首页,用了两个月 Star 数便破 50k,受欢迎程度由此可见一斑: 还在为面试算法问题发愁吗?书中给算法与数据结构总结出了一套框架模板,还有整整一个章节教你如何套模板做题,这是用套路解决算法问题的文章: 有别于其他 LeetCode 刷题仓库,该项目里面不止提供了题解代码,还有算法的具体解答思路与思考框架。 内容前后共分为以下3份PDF,内容

如果频繁就私信一下呢 265

prime 求质数的和

PYTHON 求给定范围内质数和 代码。 def get_primes(n): numbers = set(range(n, 1, -1)) primes = [] while numbers: p = numbers.pop() primes.append(p) numbers.difference_update(set(range(p*2, n+1, p))) return primes primes=get_primes(20000000) print sum(primes)

Prime95v258.zip

rime95是一款专门测试系统稳定的软件,在所有的拷机软件中,Prime95是公认的最残酷的一款。它把负荷高得有点离谱的工作量加载在CPU身上,以此来考验CPU的承受能力。这一测试因其可以发现其他测试程序无法发现的稳定性问题而备受关注,更加被许多专业的计算机 OEM 制造商用来确定计算机的稳定性。 Prime95和Superπ有类似的地方,都是利用不停计算函数来达到测试系统稳定性的目地。不过Prime95的测试环境非常苛刻,即使能在Superπ中顺利通过419万次测试的系统,也不见得能在Prime95中熬过几分钟。很多玩家用Prime95来测试超频后CPU的稳定性,并以此作为超频成功的依据。 二:作为GIMPS客户端程序 另外Prime95还是利用分布式计算搜索梅森素数(有译为梅森质数)的GIMPS客户 端程序。GIMPS的全称是 The Great Internet Mersenne Prime Search.翻译过来的意思是互联网梅森素数大搜索。GIMPS成立于1996年1月目的就是通过互联网利用数以万计的个人计算机进行这项“大海捞针”般的活动不断寻找梅森质数。 那么梅森质数到底是什么?我们为什么要寻找? 如果一个比1大的整数只能被它和1整除那么它就是一个质数。比如2,3,5,7,11等等。最初的几个梅森质数是3,7,31,127等等。现在仅仅知道41个梅森质数。但找到一个梅森素数的几率小之又小,就算你拥有当今性能最强劲的处理器也要通过少则几个月长则几年的计算才能计算出一个结果,往往经过这么长时间的计算出来的却不是一个梅森素数,这就意味着您几个月甚至几年的努力白费了,但就算这样质数还是使无数业余数学爱好者以及专业数学家痴迷。许多加入搜索行列的GIMPS成员们都会为可能找到一个具有历史性的新梅森质数而感到狂喜。当然,其中也有其他的原因,Electronic Frontier Foundation(电子前沿基金会)承诺对发现一个新的梅森素数的人奖励10万美金。

RSA算法的实现

RSA算法是公钥密码学中的重要部分。关于RSA算法的原理部分,阮一峰讲的很清楚,具体可以阅读他的博客:http://www.ruanyifeng.com/blog/2013/06/rsa_algorithm_part_one.html http://www.ruanyifeng.com/blog/2013/07/rsa_algorithm_part_two.html 但是,网上很多都是原理的讲解,很

flyingzhao 1万+

prime95使用教程.pdf

prime95使用教程.pdfprime95使用教程.pdfprime95使用教程.pdfprime95使用教程.pdfprime95使用教程.pdfprime95使用教程.pdf

2024金三银四面试必备:算法神仙文档(5000字解析总结)

总而言之,面试官问来问去,问的那些Redis知识点也就这么多吧,复习的不够到位,知识点掌握不够熟练,所以面试才会卡壳。将这些Redis面试知识解析以及我整理的一些学习笔记分享出来给大家参考学习《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!学习笔记面试资料也分享如下:[外链图片转存中…(img-od8bBXCV-1713048828155)]《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

2401_84048149的博客 399

飞书云文档API操作详细介绍

开通云文档API、python程序调用飞书api、飞书获取app_id和app_secret、

Brother_ning的博客 1万+

内网CentOS离线部署LibreOffice:从依赖缺失到服务启动的完整避坑指南

本文详细介绍了在CentOS内网环境中离线部署LibreOffice的完整流程,包括依赖包准备、安装顺序优化及常见报错解决方案。针对金融等封闭网络场景,提供从rpm包选择到服务启动的全套避坑指南,特别解决libXinerama等图形库缺失问题,确保文档转换服务稳定运行。

weixin_33416697的博客 246

python—求范围以内的素数(质数)

这道题目之前面试zjtd的时候问过,很简单 素数:一个大于1的自然数,除了1和它本身外,不能被其他自然数(质数)整除(2, 3, 5, 7等),换句话说就是该数除了1和它本身以外不再有其他的因数 话不多说,直接上代码 def getPrime(x): res = [] if x <= 1: return for i in range(2,x+1): for j in range(2, i): if i % j == 0: break else: res.appen

qq_36581961的博客 2753

Amesim(五):单个悬架系统搭建

一、组成 单个悬架系统组成包括:端子,质量块*2,弹簧,阻尼器,速度路面反馈,路面激励。 二、搭建 打开Amesim,在 library 选择 1D Mechanical 选择质量模块,添加到skech中,并按 ctrl+r 旋转质量块,将箭头朝上,设置规定的力传递正方向 添加弹簧阻尼器,与质量块连接 添加VX模块,将路面的激励传递转化为速度和位移,传递给悬架系统 在...

林小川的博客 7167

Java程序员不掌握SpringBoot怎么进大厂,阿里神仙级内部手册!

第二部分、分布式应用开发第三部分核心技术源代码分析。

2301_82257317的博客 537

AM243x多核MCU启动流程解析与OSPI Flash烧录实战

嵌入式系统开发中,引导加载器是芯片上电后执行的第一段软件,负责初始化硬件、加载操作系统或应用程序。其工作原理通常遵循多级引导链,从ROM固件到用户可定制的二级引导程序,逐级建立完整的软件运行环境。这一机制的技术价值在于实现可靠的系统启动、支持安全校验,并为多核异构架构提供协同基础。在应用场景上,引导加载器广泛应用于工业控制、汽车电子和物联网设备,确保设备能从非易失性存储器中自主启动。本文聚焦于TI AM243x这类高性能多核MCU,深入剖析其包含RBL和SBL在内的三级启动流程,并详细演示如何通过UART接

weixin_28703451的博客 582

【系统架构设计师】2025年下半年真题论文回忆版及写作要点

本文摘要围绕云原生数据库、性能测试、无服务器架构和秒杀场景等关键技术进行论述。云原生数据库通过容器化、微服务和自动化运维实现弹性扩展;性能测试需要规划测试场景并关注响应时间等关键指标;无服务器架构以事件驱动为核心,简化开发流程;秒杀场景需组合运用扩容、缓存、限流等技术应对高并发。这些技术方案为构建现代高可用系统提供了重要参考。

数据知道的博客 6156

中文能用rsa加密吗_如何给产品经理解释什么是 RSA 加密(一)

摄影:产品经理与产品经理的健康生活我们之前两篇文章已经介绍了如何在 Python 下面使用 RSA 加密,以及 python-rsa 这个库如何寻找两个大质数。今天我们来介绍一下,RSA 加密是什么原理。大家现在停下来,打开 Google 或者百度,搜索 RSA 加密原理。你会看到大量的文章,一上来就讲数学公式,根本看不懂他们在讲什么。例如:你说,这种内容如果不是 Deadline 逼着...

weixin_39527292的博客 280

基于STM32、HAL库的TLV320AIC3204IRHBR音频接口芯片驱动程序设计

* 开启所有数字部分 */#define TLV320AIC3204_REG_LEFT_HEADPHONE_OUT_VOLUME 0x0C /* 左声道耳机输出音量 */#define TLV320AIC3204_REG_DIGITAL_AUDIO_PATH_CONTROL 0x05 /* 数字音频路径控制 */#define TLV320AIC3204_REG_ANALOG_HP_FILTER_CONTROL 0x34 /* 模拟耳机滤波器控制 *//* 最大音量 */

corlin6688的博客 521

ARM NEON自动向量化:从编译选项到代码优化的性能提升指南

在嵌入式和高性能计算领域,数据级并行是提升计算效率的核心概念。其原理是通过单指令多数据(SIMD)技术,让一条指令同时处理多个数据元素,从而大幅提升吞吐量。这项技术的核心价值在于平衡性能与开发效率,使开发者无需深入底层汇编即可获得接近硬件的执行速度。在移动端应用、音视频处理、科学计算等场景中,SIMD优化已成为必备技能。本文聚焦于ARM平台的NEON自动向量化技术,探讨如何通过编译器优化和代码重构,将标量循环自动转换为并行向量指令。文章深入分析了循环无关性、内存访问模式等关键条件,并提供了使用restric

weixin_33724059的博客 190

R语言glm函数构建二分类logistic回归模型、epiDisplay包logistic.display函数获取模型汇总统计信息(自变量初始和调整后的优势比及置信区间,回归系数的Wald检验的p值

R语言glm函数构建二分类logistic回归模型(family参数为binomial)、使用epiDisplay包logistic.display函数获取模型汇总统计信息(自变量初始和调整后的优势比及置信区间,回归系数的Wald检验的p值)

statistics+insight+vista+power 1397

YOLOv8改进-利用图像去雾网络UnfogNet提升检测精度的探索【附核心模块代码】

YOLOv8-UnfogNet联合模型的提出为目标检测和图像去雾领域提供了一个新的思路。通过将图像去雾网络和目标检测网络结合,不仅可以提升在恶劣天气下的目标检测精度,还能够为实际应用中的自动驾驶、监控安防等领域带来更强的鲁棒性和适应性。随着去雾技术和目标检测算法的不断发展,我们相信,这种联合方法将在多个领域中获得更加广泛的应用,并为进一步提升图像质量和检测精度做出重要贡献。

一键难忘的博客 3202

GetPrime

public class GetPrime { public static void main(String[] args) { // TODO 自动生成的方法存根 int a,b = 0,c = 0; a=Integer.parseInt(args[0]); a=Integer.parseInt(args[1]); a=Integer.parseInt(args[2]); boo...

weixin_30236595的博客 5676

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

数论初步

一、辗转相除法 (又称欧几里德算法):gcd(a, b) = gcd(b, a % b); int gcd(int a, int b) { return b == 0 ? a : a % b; } 另外:最小公倍数 * 最大公约数 == 两数之积 二、筛选法构造素数表 int visit[nMax]; int prime[nMax]; int getPrime(int n)//得到[...

java开发指南博客 【转载】 183

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

【Python笔记】函数 你必须知道的一些细节。

函数 定义 一个函数,你可以定义一个由自己想要功能的函数,以下是简单的规则: 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 ()。 任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数。 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。 函数内容以冒号 : 起始,并且缩进。 return [表达式] 结束函数,选择性地返回一个值给调用方,不带表达式的 return 相当于返回 None。 函数定义者:做功能的人        函数调用

风吹屁屁凉@博客 268

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

python实现RSA加密算法 1024位密钥

''' RSA算法,它通常是先生成一对RSA密钥,其中之一是保密密钥,由用户保存; 另一个为公开密钥,可对外公开,甚至可在网络服务器中注册。为提高保密强度, RSA密钥至少为500位长,一般推荐使用1024位。这就使加密的计算量很大。 为减少计算量,在传送信息时,常采用传统加密方法与公开密钥加密方法相结合的方式, 即信息采用改进的DES或IDEA密钥加密,然后使用RSA密钥加密对话密钥和信息摘要。 对方收到信息后,用不同的密钥解密并可核对信息摘要。 1. 随意选择两个大的质数p和q,p不等于q,计算N=p

椰奶冻不安全的博客 4914
上一篇: pip 发布新版本了!
下一篇: 推荐2款优秀的代码截图工具
codingpy
博客等级 码龄11年 1867粉丝 104原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值