c++折线平移算法_RSA笔记-蒙哥马利算法(1)

有些想补充的内容,但不好直接在初始的那一篇里改。因为那里讲得太细致了,是一步步讲得,要想再塞点别的东西进去就杂乱无章或喧宾夺主了。。所以重开一篇,后续有什么问题,都在这里更新。不是说细节我都明白透了(毕竟我也没实际写过RSA,只看过别人写的...看的还不仔细),只是自己懂一点也可以记录一点,顺便和大家分享。

背景就说到这,下面是我自己想补充的内容!

=================================

在第一篇中,从问题的起因,到寻求解决的步骤,是一步步沿着设计者的足迹,得到了算法的实现。每一步都寻求解决一个问题,很自然地到达最终的结果。这样顺水推舟地走,也许比较轻松,但可能走到最后,便忘记了开始,没办法一览顺流而下的整条河的概貌。

这里,我想仅就算法实现,再梳理一下步骤。

前一篇文章中,我粗略描述了蒙哥马利乘的接口(稍微改一下传参,BIGNUM还是不好作为返回值...得作为参数传进去再输出来):

[1] int bn_mont_Mult (BIGNUM Result, BIGNUM A, BIGNUM B, BIGNUM X);
名称:蒙哥马利乘
功能:输出 Result = A * B [* R^(-1) mod X ]

并且在前一篇文章里,实现 A^E mod X 大数模幂运算,写的是如下(半吊子)代码:
(在此仅改了传参规范)

int bn_PowMod_old (BIGNUM Result, BIGNUM A, BIGNUM E, BIGNUM X){ // Result = pow(A^E) mod XBIGNUM A0, Ret;int K, L;int *a = NULL, *e = NULL;K = bn_Expand(A, 2, a);bn_LShift(A0, A, K);	     // A0 = A*R, *R 实现为移位运算Ret = A0;L = bn_Expand(E, 2, e);for(int i = L; i >= 0; i--){ // 利用了简化幂运算的“平方-乘算法”,从高位开始bn_mont_Mult(Ret, Ret, Ret, X);if(e[i]==1){bn_mont_Mult(Ret, Ret, A0, X);}}bn_RShift(Ret, Ret, K);	    // Ret = Ret*R', 移回来return Ret;
}

这段代码里,有几个问题:

  1. 我写了一个 bn_LShift 和 bn_RShift 用来表示“蒙哥马利变换”和“蒙哥马利逆变换”,实际上不会那么处理。。大数都是切割成一块块的,移位咋移啊。。
  2. 可以看到,bn_mont_Mult 里的 R 的长度(或值),实际上是依赖于入参 A 的长度的,也就是说并不是一个写死的值,所以实际上需要传入 A 的长度。
  3. 其实还有一个问题。。这个之前没有知友看出来。那就是 Ret 没有赋初值 = =。。。好严重的错误有木有....我的锅

那么我们试着改一下,首先不妨(暂时)假设我们相应地修改好了接口,并且方便起见,将bn_mont_Mult 相同两个大数相乘的情况封装为 bn_mont_Square 平方接口,即:

[2.a] int bn_mont_Mult (BIGNUM Result, BIGNUM A, BIGNUM B, uint32_t alen, BIGNUM X);
名称:蒙哥马利乘
功能:输出 Result = A * B [* R^(-1) mod X ], R = 2^(-alen)
备注:在此假设 alen 是 A 的比特长度[3.b] int bn_set_mont(BIGNUM R, uint32_t alen, BIGNUM X)
名称:获取蒙哥马利参数 R
功能:输出大数 R = 10000...(alen 个 0) mod X[2.c] int bn_mont_trans(BIGNUM Result, BIGNUM A, uint32_t alen, BIGNUM X)
名称:蒙哥马利变换
功能:输出 Result = A [* R mod X ][2.d] int bn_mont_inv(BIGNUM Result, BIGNUM A, uint32_t alen, BIGNUM X)
名称:蒙哥马利逆变换
功能:输出 Result = A [* R^(-1) mod X ][2.e] int bn_mont_Square (BIGNUM Result, BIGNUM A, uint32_t alen, BIGNUM X);
名称:蒙哥马利平方
功能:输出 Result = A * A [* R^(-1) mod X ], R = 2^(-alen)
实现:
int bn_mont_Square (BIGNUM Result, BIGNUM A, uint32_t alen, BIGNUM X) {return bn_mont_Mult(Result, A, A, alen, X);
}

Ret 的初值应该是什么呢?感觉应该是1...但考虑到我们用的是蒙哥马利乘,也就意味着我们乘任何两个数,进了 bn_mont_Mult 接口都会先除以一个 R;至于普通乘法里乘1,意味着被乘数的值不变,那么作为输入蒙哥马利域的数,怎样的数才满足:任意一个数和它做 bn_mont_Mult 后值不变呢?显然,R是(唯一)一个这样的角色;想起来也很自然,因为蒙哥马利乘相当于我们把做乘法的位数“向右平移”了 R 嘛...那1可不是得“向左平移”个R,来把它抵消掉。。废话不多说了,模幂的代码相应可修改为:
(A0 改成 AR 吧...代表A*R)

int bn_PowMod (BIGNUM Result, BIGNUM A, BIGNUM E, BIGNUM X){ // Result = pow(A^E) mod XBIGNUM AR, Ret;int K, L;int *a = NULL, *e = NULL;K = bn_Expand(A, 2, a);bn_mont_trans(AR, A, K, X);  // AR = A*R mod X, 变换至蒙哥马利域bn_set_mont(Ret, K, X);      // Ret = R = 10000...(K个0) mod XL = bn_Expand(E, 2, e);for(int i = L; i >= 0; i--){ // 利用了简化幂运算的“平方-乘算法”,从高位开始bn_mont_Square(Ret, Ret, X);if(e[i]==1){bn_MultMod(Ret, Ret, AR, X);}}bn_mont_inv(Ret, Ret, K);     // Ret = Ret*R^(-1) mod X, 由蒙哥马利域变回return Ret;
}

这样好一些了,至少完整了。。但实际上还可以精简。事实上 bn_mont_trans 这个大数乘法可以也用蒙哥马利乘代替,好比说,我们实现了如下3.几的一组接口,而不是2.几的:

[3.a] int bn_mont_Mult (BIGNUM Result, BIGNUM A, BIGNUM B, uint32_t alen, BIGNUM X);
名称:蒙哥马利乘;双因数
功能:输出 Result = A * B [* R^(-1) mod X ], R = 2^(-alen)
备注:在此假设 alen 是 A 的比特长度[3.b] int bn_set_mont(BIGNUM R, uint32_t alen, BIGNUM X)
名称:获取蒙哥马利参数 R
功能:输出大数 R = 10000...(alen 个 0) mod X[3.c] int bn_mont_inv(BIGNUM Result, BIGNUM A, uint32_t alen, BIGNUM X)
名称:蒙哥马利逆变换;单因数,相当于 B = 1
功能:输出 Result = A [* R^(-1) mod X ]
实现:
int bn_mont_inv(BIGNUM Result, BIGNUM A, uint32_t alen, BIGNUM X) {BIGNUM one = 1; // 反正就是个赋值...领会就好return bn_mont_Mult(Result, A, one, alen, X);
}[3.d] int bn_mont_Square (BIGNUM Result, BIGNUM A, uint32_t alen, BIGNUM X);
名称:蒙哥马利平方
功能:输出 Result = A * A [* R^(-1) mod X ], R = 2^(-alen)
实现:
int bn_mont_Square (BIGNUM Result, BIGNUM A, uint32_t alen, BIGNUM X) {return bn_mont_Mult(Result, A, A, alen, X);
}

正如前文所述,若调用蒙哥马利乘来实现使 A 赋值变到蒙哥马利域上,也就是使 AR = A*R mod X,则除 A 之外的另一个因数需为 R^2,即:
bn_mont_Mult (AR, A, R^2, alen, X)
才能使得:
AR = A*R^2 [*R^(-1) mod X]

于是代码修改为:

int bn_PowMod (BIGNUM Result, BIGNUM A, BIGNUM E, BIGNUM X){ // Result = pow(A^E) mod XBIGNUM AR, Ret, R2;int K, L;int *a = NULL, *e = NULL;K = bn_Expand(A, 2, a);bn_set_mont(R2, 2*K, X);        // R2 = 10000...(2*K个0) mod Xbn_MultMod(AR, A, R2, alen, X); // A0 = A*R^2 [*R^(-1) mod X] = A*R mod Xbn_mont_inv(Ret, R2, K);     // Ret = R = R2*R^(-1) mod XL = bn_Expand(E, 2, e);for(int i = L; i >= 0; i--){ // 利用了简化幂运算的“平方-乘算法”,从高位开始bn_mont_Square(Ret, Ret, X);if(e[i]==1){bn_MultMod(Ret, Ret, AR, X);}}bn_mont_inv(Ret, Ret, K);     // Ret = Ret*R^(-1) mod X, 由蒙哥马利域变回return Ret;
}

这样应该就比较接近真实的 RSA 蒙哥马利模幂的接口实现了。。至少看那些开源代码应该能明白哪一步大体在干啥了。

至于剩下的细节,比如说,如何保证模乘的因数比模数小,具体在哪一步取模,等这些细节问题日后有机会再谈吧(其实目前我也搞不清...主要没有需求让我写 RSA ...国际上那么多优秀的人优化了那么多年,怎么也轮不着自己实现(哈哈哈...)不过确实还是挺有意思的算法,不是吗?

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

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

相关文章

高中计算机教学设计案例分析,高一年级信息技术教学设计(案例)

《高一年级信息技术教学设计(案例)》由会员分享,可在线阅读,更多相关《高一年级信息技术教学设计(案例)(6页珍藏版)》请在人人文库网上搜索。1、高一 年级信息技术教学设计(案例)学校名称:思南县第八中学 姓名:卢娜 时间&#xff…

软件研发效能度量团体标准获得立项

在数字化转型浪潮下,软件研发团队持续、高效、高质交付的能力,已成为企业竞争力的关键要素。研发效能应当如何定义?透明、客观、全面的效能度量指标体系应当如何建立?效能度量应当如何应用,才能让这些数据真正成为研发…

我对技术架构的理解与架构师角色的思考

简介: 架构师一定要有技术的广度。大家一定要学会积累,积累到一定的程度以后,你会做到无师自通。 先自我介绍一下,我叫道延, 2014年进入阿里,在阿里通信呆了接近两年。2016年底到了业务平台,当时…

0到1:闲鱼高复杂度高性能社区圈子开发实录

简介: 鱼乐圈上线啦~ 闲鱼会玩社区的重要阵地:会玩圈子今年年初已经上线啦~ 作为一款承载着「基于兴趣聚集同好人群」的社区型产品,相较于常规导购型产品来说,在业务复杂度、交互复杂度、性能体验稳定性要求上都要高出…

2018年计算机CPU纳米制程,联发科疯狂堆核计划曝光:7纳米制程,12核CPU

【PConline 资讯】联发科疯狂堆核的脚步并未停歇,在商用量产10纳米十核处理器——Helio X30之后,联发科瞄准了更先进的制程、更密集的CPU核心。据台湾电子时报(DIGITIMES)消息,联发科将首次集成12核CPU,预计第二季度由台积电的7纳…

佳能hdr_烧设备无止境不代表随时败家,佳能EOS 5D4“闲鱼”翻身取代200D

2019年最后一天马上翻篇,想过去看今朝我此起彼伏。待到明年赏花浪漫时,我希望我会笑得更开心一点。今天跟大伙说说刚从闲鱼入手的5D4。烧设备可以,烧相机要出人命,看大佬们三天两头往家里败镜头,我的荷包可撑不住。第一…

浅谈数据中台安全体系构建思路

作者:王振东来源:绿盟科技 战略规划部 摘要数据中台是大数据业务体系数据规约化建设的核心场景,数据中台既搭建大量数据归集的相关设施,又针对数据开展大量治理、运维、分析、加工、共享、开放等交互事务,数据暴露面、…

MaxCompute Tunnel 技术原理及开发实战

简介: MaxCompute(原名ODPS)是一种快速、完全托管的EB级数据仓库解决方案, 致力于批量结构化数据的存储和计算,为用户提供数据仓库的解决方案及分析建模服务。Tunnel是MaxCompute提供的数据传输服务,提供高并发的离线数…

js实现一键复制到剪切板上_js实现各种复制到剪贴板的方法

一、实现点击按钮,复制文本框中的的内容function copyUrl2(){var Url2document.getElementById("biao1");Url2.select(); // 选择对象document.execCommand("Copy"); // 执行浏览器复制命令alert("已复制好,可贴粘。");}用…

滴滴 Flink-1.10 升级之路

简介: 滴滴实时计算引擎从 Flink-1.4 无缝升级到 Flink-1.10 版本,做到了完全对用户透明。并且在新版本的指标、调度、SQL 引擎等进行了一些优化,在性能和易用性上相较旧版本都有很大提升。 一、 背景 在本次升级之前,我们使用的…

戴尔服务器一直显示配置内存,dell服务器内存故障解决及排查

如果系统可以运行,请运行相应的诊断检测程序。有关可用的诊断测试,请参阅使用系统诊断程序。如果诊断程序指示出现故障,请按照诊断程序提供的更正措施进行操作。如果系统无法运行,请关闭系统和连接的外围设备,并断开系…

苹果新算法已混进 iOS 14.3!CSAM 检测技术再遭网友争议

整理 | 禾木木出品 | CSDN云计算(ID:CSDNcloud)苹果宣布即将推出 CSAM 检测系统时,遭到了 4000 多个组织及个人的公开反对,他们质疑苹果会破坏用户隐私和端到端加密机制。一位 Reddit 用户发现 CSAM 算法竟已被悄悄地隐…

数字化时代,阿里云云效如何构建下一代研发协作工具平台?

简介: 本次分享主要由四部分组成: 1、企业在成长过程中遇到的研发效能困境; 2、研发管理从信息化走向数字化的路径,以及背后的逻辑; 3、云原生和 AI 两项新技术在研发平台上的落地; 4、结合阿里巴巴自身案例…

axiosa安装_axios安装及使用

axios 安装npm install axios --saveaxios 使用1. axios 的引入在main.js文件中引入(在main.js引入即为全局引入)// axios需要使用prototype将axios挂载到原型上 ,$后面是自己另起的名称,以后就可以使用该名称Vue.prototype.$axios Axios2.在组件中直接…

珠海小学计算机比赛,欢聚一堂 共叙佳话 —— 参加珠海市中小学信息技术工作年会纪要...

欢聚一堂 共叙佳话——参加珠海市中小学信息技术工作年会纪要2012年12月22日,香洲区中小学信息技术工作室一行8人赴金湾一小,参加了珠海市教育学会中小学信息技术教学专业委员会组织的第三届年会,会议分为四项议程。一、近两年工作总结上午&a…

安谋科技发布新业务品牌“核芯动力”,先手布局智能计算产业

安谋科技(中国)有限公司(“安谋科技”)举行“创芯生,赋未来” 新业务品牌战略发布会,重磅发布“双轮驱动”战略以及新业务品牌“核芯动力”。新业务品牌的发布代表安谋科技引领智能计算产业发展趋势、推动计…

技术方案设计的方法论及案例分享

简介: 怎么去体现技术方案设计的深度是大家普遍关心的一个问题,这个问题不是个例问题,因此本文主要分享下作者个人的一些观点和看法。 怎么去体现技术方案设计的深度是大家普遍关心的一个问题,这个问题不是个例问题,因…

hp服务器硬盘ultra320,惠普/hp 300GB 1.5万转 3.5寸 SAS服务器硬盘 P/N:431944-B21

IBM 90P1307 90P1311 26K5260 71P7485 300G 10K U320 SCSI 硬盘sun 四口千兆网卡 X444** 501-6738SUN N240,N440硬盘XRA-SC1NB-146G15K/540-6607SUN网卡 X4447A-Z 501-7606 PCI-esun v480 电源 300-1486 3001486sun 501-0409 光纤卡Sun 硬盘 XRB-SS2CF-146G10K 540-7868 146GB …

qtextedit 默认文案_QTextEdit的paste

背景QTextEdit中粘贴一大段文字时,EasyDraft中粘贴进去的文字们的格式就乱了,处于无格式。还有在EasyDraft中选中一些文字进行拖放动作时,格式也会混乱。解决这两种都牵涉到QTextEdit粘贴行为,我们可以截获剪切板(clipboard)的内容…

第四范式:现代存储架构下的系统优化实践

8月21日,白玉兰开源联合示说网主办的“开源大数据技术线上meetup”特邀约大数据领域的前沿技术专家,就大数据存储的关键技术、挑战和当前应用展开交流讨论,阵容强大、内容全面。第四范式体系架构科学家,高性能计算Team leader卢冕…