RSA密钥生成基准测试深度解析

news/2025/10/14 6:03:12/文章来源:https://www.cnblogs.com/qife122/p/19139863

RSA密钥生成基准测试

RSA密钥生成在概念上很简单,但却是密码学工程领域中最糟糕的实现任务之一。即使对其进行基准测试也很棘手,并且涉及一些数学知识:以下是我们如何生成稳定但具有代表性的"平均情况",而不是使用普通的统计方法。

RSA密钥生成

假设您要生成一个2048位RSA密钥。思路是生成随机的1024位数字,直到找到两个质数,称它们为p和q,然后计算N = p × q和d = 65537⁻¹ mod φ(N)¹(然后还有一些操作以使运算更快,但您可以在此停止)。d的计算是RSA魔法的所在,但今天我们专注于第一部分。

选择质数候选几乎没有什么特别之处。您从CSPRNG中抽取适当大小的随机数,并且为了避免浪费时间,您设置最低有效位和两个最高有效位:大的偶数不是质数,设置前两位保证N不会太小。

检查数字x是否为质数通常使用米勒-拉宾测试²完成,这是一种概率算法,您选择一个"基数"并用它在x上运行一些计算。它要么最终证明x是合数(即不是质数),要么未能证明。弄清楚需要运行多少次米勒-拉宾测试出人意料地困难:最初您会了解到测试对合数失败的概率是1/4,这表明您需要40轮才能达到2⁻⁸⁰;然后您了解到这只是x最坏情况值的上限³,而随机值的失败几率要低得多;最终您还意识到这并不那么重要,因为您只在质数上运行所有迭代,而大多数合数在第一次迭代中就被拒绝。无论如何,BoringSSL有一个表格,对于1024位质数,我们需要5次带有随机基数的米勒-拉宾测试。

然而,米勒-拉宾有点慢,而且大多数数字都有小除数,因此通常更有效的方法是快速拒绝这些数字,通过进行"试除"或与前几个质数进行GCD。前几十个质数通常是一个重大胜利,但使用越来越多的质数收益递减。

有一百万零一件事可能出错,但有趣的是,您必须特意才能出错:如果完全随机生成大候选数,所有这些情况的发生几率在密码学上可以忽略不计。

总结一下,要生成RSA密钥,您需要生成两个质数。要生成质数,您选择随机数,尝试通过试除排除它们,然后对它们进行几次米勒-拉宾测试。

基准测试

现在,我们应该如何对其进行基准测试?运气会严重影响运行时间:您基本上是在对彩票进行基准测试。在调试性能回归时,Russ Cox运行了数百次测量,仍然得到了一些嘈杂且在有些地方可疑的结果。它也不够快,无法运行数百万次测量并让事情平均出来。

有人可能想通过将运行时间除以测试的候选数来标准化测量,但这不均匀地稀释了所有最终计算,并且仍然受到试除捕获的候选数以及进行米勒-拉宾测试的候选数的干扰。类似地,单独对米勒-拉宾进行基准测试忽略了最终计算,并且没有测量试除的影响。

我们可以做的是使用数学来找出平均代表性的候选序列是什么样的,并对其进行基准测试。由于密钥生成过程是可重复的⁴,我们可以预生成一个黄金候选序列,甚至在不同实现之间共享它以进行同类比较。

生成平均序列

首先,我们需要找出在每个质数之前平均应该期望有多少个合数。质数计数函数近似告诉我们小于x的质数有Li(x)个,这计算出⁵每354个1024位的奇数中有一个质数。

然后,我们对合数的小除数进行标准化。一个随机数有1/p的几率可被p整除,基于此,我们可以计算在遇到质数之前,期望遇到前n个质数整除的合数数量。例如,我们期望33%的数字可被3整除,46%可被3或5整除,69%的数字可被前10个质数之一整除,80%可被前50个质数之一整除,依此类推。反过来,我们使353个合数中的118个可被3整除,47个可被5整除但不能被3整除,27个可被7整除但不能被3或5整除,依此类推。这将使成功试除的次数具有代表性,甚至允许我们在不同试除阈值之间进行对比基准测试,而无需重新生成输入。

除了像密钥生成那样设置最高和最低位之外,我们还取消设置每个候选数的第二最低有效位并设置第三最低有效位,以标准化米勒-拉宾内循环的迭代次数,这取决于x-1的尾随零的数量。

我们不需要担心合数未能通过米勒-拉宾测试:如果5次测试足以达到2⁻¹¹²,那么一次测试失败的最大几率为2⁻²²,这在密码学上不可忽略,但不会在基准测试中出现。类似地,我们不需要担心e在模φ(N)下不可逆:我们使用65537作为e,它是质数,因此只有1/65537的数字不与其互质。

脚本、向量和结果

结果非常稳定,应该在绝对运行时间和不同函数消耗的CPU时间方面都具有代表性,允许进行有意义的性能分析。生成20个随机平均轨迹并对它们进行基准测试产生的方差小于1%。

您可以在Go标准库代码审查中看到它的使用。生成轨迹的脚本以及十个现成的轨迹可在CCTV中获得,欢迎您使用它们来对您的实现进行基准测试!

如果您读到这里,您可能还想在Bluesky上关注我@filippo.abyssdomain.expert或在Mastodon上关注我@filippo@abyssdomain.expert。


或者,如果您想让自己的生活更艰难,代码更复杂而没有实际好处,可以使用λ(N)而不是φ(N),但这是另一个话题。:right_arrow_curving_left:

还有卢卡斯测试,进行一轮基数为2的米勒-拉宾测试和一次卢卡斯测试被称为Baillie-PSW测试。没有已知的合数通过Baillie-PSW测试,这听起来很棒,但卢卡斯测试实现起来非常麻烦。:right_arrow_curving_left:

在对抗性环境中,您还需要担心攻击者强制或适应您选择的基数。名为《Prime and Prejudice: Primality Testing Under Adversarial Conditions》由Albrecht等人完成的论文展示了一些有趣的技巧,但主要技巧归结为观察:如果您硬编码基数或从x生成它们,它们就不是随机的。:right_arrow_curving_left:

严格来说它不是确定性的,因为测试是随机的,但得出不同结论的几率在密码学上可以忽略,甚至运行时间出现重大偏差的几率也非常小,正如我们将看到的。:right_arrow_curving_left:

我进行了一个快速的蒙特卡洛模拟来检查这是否正确,看到数值摆动并收敛到期望值真的很有趣。数学!:right_arrow_curving_left:
更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)
对网络安全、黑客技术感兴趣的朋友可以关注我的安全公众号(网络安全技术点滴分享)

公众号二维码

公众号二维码

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

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

相关文章

MaxKB 在不同场景下 RAG 引擎与向量存储的应用案例分析

一、MaxKB 概述 MaxKB 是一款基于大语言模型和 RAG 技术的开源知识库问答系统,在企业内部知识管理、客户服务、学术研究与教育等领域都有广泛应用。作为专注于知识库问答场景的软件产品,它能够为企业智能化进程注入新…

C#数组

一维数组 using System;namespace HelloWorld {class Program{static void Func(int[] param_ints){for (int i = 0; i < param_ints.Length; i++){param_ints[i] = 9;}}static void Main(string[] args){/*** 1. 数…

ZOJ 1004. Anagrams by Stack 解题报告

ZOJ 1004. Anagrams by Stack 解题报告给定两个单词 w1 和 w2,假设有一个字符栈(stack),通过对字符的栈操作(i 为 push 入栈操作,o 为 pop 出栈操作),可能把 w1 转变为 w2,那么这一系列的栈操作(由字母 i 和…

Windows Update - Part 4: SUS WSUS

WSUS: no longer actively developed.https://techcommunity.microsoft.com/blog/windows-itpro-blog/windows-server-update-services-wsus-deprecation/4250436 - Sep 21, 2024Microsoft has announced deprecation …

[LeetCode] 2273. Find Resultant Array After Removing Anagrams

You are given a 0-indexed string array words, where words[i] consists of lowercase English letters. In one operation, select any index i such that 0 < i < words.length and words[i - 1] and words[…

251013

2023 ICPC Macau ICPC Macau 感觉是一套非常困难的题 A 可以发现选择一个 +1 与去除一个 -1 对行列的效果是一样的,所以我们可以先把所有的 -1 选上。之后改变某个数的选择状态都是对对应的行列和加一。接下来就可以贪…

简谈误差与不确定度

唉学物理的怎么都这么坏弄得公式都没搞明白就拿来用了(晚自习闲着没事写的,内容比较 Trivial,大家图一乐就行。 我们主要谈论其中的一些数学直觉上的理解。 1. 随机误差统计规律 由统计规律可知,概率密度函数 \(f(…

可怕!我的Nodejs系统因为日志打印了Error 对象就崩溃了 Node.js System Crashed Because of Logging an Error

@目录报错信息报错截图错误分析场景复现小秘密大揭秘!🔍console.log虽好,但请勿用它来记录PROD错误!日志库的"小烦恼"什么是循环引用?🌀怎样才能让我们的日志系统乖乖听话呢?✨1. 只记录我们需要的…

实践

ans多取合法方案的max/min结果肯定不劣。对于操作“change x y:把a[x]修改为y”,无论是提前continue掉还是循环末尾,一定要记得令a[x]=y!!!模数MOD特殊一定要注意!遇见小模数MOD,可能复杂度与MOD相关。 有可能…

数据结构字符串和图

1.字符串的存储 1.1.字符数组和STLstring char s[N]strlen(s+i):\(O(n)\)。返回从 s[0+i] 开始直到 \0 的字符数。 strcmp(s1,s2):\(O(\min(n_1,n_2))\)。若 s1 字典序更小返回负值,两者一样返回 0,s1 字典序更大返…

字典dict

2025.10.14 1.字典的键值必须是不可变的,也就是说元祖,形如下面的初始化是可以的dict1 = {(1, 2): 1} dict1 = {a: 1} dict1 = {}

结婚证识别技术:融合计算机视觉、深度学习与自然语言处理的综合性AI能力的体现

在数字化浪潮席卷各行各业的今天,如何高效、准确地处理海量纸质证件信息,成为提升政务服务与金融业务效率的关键。结婚证作为证明婚姻关系的核心法律文件,因而,结婚证识别技术应运而生。它不仅是光学字符识别技术的…

上下文丢失

2025.10.14 位置编码外推失效是Transformer模型在长文本推理中出现上下文丢失的最常见架构限制,因为训练时使用的固定位置编码(如正弦编码)无法有效外推至超出训练长度的序列位置,导致位置信息丢失。 残差连接梯度…

数据结构序列

不要从数据结构维护信息的角度来思考问题,而是从问题本身思考需要哪些信息,数据结构只是维护信息的工具!!! 可减信息,如区间和、区间异或和 直接用前缀和实现,复杂度 O(n)+O(1)+O(n)。 可重复贡献信息,如区间最…

上下文学习(In-context Learning, ICL)

2025.10.14 上下文学习(In-context Learning, ICL)的核心机制是在推理阶段不更新模型参数,利用提示中的少量示例引导模型生成适应新任务的输出。也就是在不更新参数的情况下,利用提示中的示例让模型在内部条件化地…

混淆矩阵

2025.10.14 混淆矩阵可以显示模型的所有预测结果,包括真正例、假正例、真负例和假负例,从而帮助分析模型的性能 混淆矩阵不仅仅显示准确率,还提供更详细的分类结果 混淆矩阵与训练损失无关 混淆矩阵不涉及超参数设置…

提示词工程实践指南:从调参到对话的范式转变

写在前面 作为一名长期与代码打交道的工程师,我们习惯了编译器的严格和确定性——相同的输入永远产生相同的输出。但当我们开始使用生成式AI时,会发现这是一个完全不同的世界。最近在系统学习Google的AI课程时,我整理…

泛化能力

2025.10.14 在大型语言模型的工程实践中,提高泛化能力的最常见策略是使用更大的预训练数据集,因为更多数据可以帮助模型学习更泛化的表示,例如GPT-3和BERT等模型都强调大规模数据集的应用。

JVM引入

虚拟机与 JVM 虚拟机(Virtual Machine),就是一台虚拟的计算机。它是一款软件,用来执行一系列的虚拟计算机指令。 虚拟机可以分为系统虚拟机和程序虚拟机:Visual Box、VMware 就属于系统虚拟机,它们完全是对物理计…

shiro 架构

一、subject(当前用户信息) 二、SecurityManager(所有用户管理) 三、Realm(数据连接)