rsa算法php,简化版(小素数版)RSA算法的PHP实现
0x00 前言
我们这学期的课程《信息安全与保密》要求期末作业实现一个密码算法及对应的加解密系统,其中做RSA的要求实现加解密、数字签名。考虑到我因为太菜,当初遇到了不少问题,莆田搜索RSA算法实现想参考一下的时候找不到PHP版本的,所以我完成作业后打算自己整一篇以供有需要的后来者参考
考虑到我们期末作业主要任务是“实现RSA加解密、数字签名”,故没有采用大整数运算,受PHP的数据精度限制,素数范围在2的32到48次方(4.29E9~2.81E14),标题中的“简化版”即此意
由于在学校的时候事情比较多,所以一直拖到了放假才开始写,时间有点久了,有些细节记得不大清楚,而且受限于自己的水平,应该会有不少错漏;当时时间比较紧迫,函数封装等也不甚合理
文中内容主要摘自段云所、卫仕民、唐礼勇、陈钟所编《信息安全概论》(高等教育出版社,2003.9)及我上课记的笔记(特别注明之处除外),我的笔记可能也会有错漏之处,烦请海涵并指正 */建立一个RSA密码体制的过程如下: 选择两个大素数p和q
计算乘积n=pq和fai(n)=(p-1)(q-1)
选择大于1小于fai(n)的随机整数e,使得gcd(e, fai(n))=1
计算d使得de与1mod fai(n)同余
对每一个密钥k=(n,p,q,d,e),定义加密变换为Ek(x)=x^e mod n,解密变换为Dk(x)=y^d mod n,这里x,y属于整数
以{e,n}为公开密钥,{p,q,d}为私有密钥
//其中的fai(n)即欧拉函数,意为“和n互素的数的数量”
0x01 Miller-Rabin算法(素性检测)
密钥中的p和q须为素数,而素数选取需要用到素性检测,Miller-Rabin算法可以实现素性检测。由William Stallings所著的《密码编码学与网络安全——原理与实践(第七版)》可知Miller-Rabin算法如下:过程TEST输入整数n,若n不是素数,则返回“合数”,若n可能是素数,也可能不是素数时,返回“不确定”
TEST(n) 找出整数k, q,其中k>0, q是奇数,使(n-1=(2^k)*q)
随机选取整数a, 1
if a^q mod n=1, then 返回“不确定”
for j=0 to k-1 do
if a^((2^j)*q) mod n=n-1 then 返回“不确定”
返回“合数”
而对合数n=13*17=221应用上述测试,若选取a=5,则算法返回“合数”;假设我们选取a=21,则21^55mod221=200, (21^55)^2mod221=220,则测试算法返回“不确定”,意即221可能是素数
故我们需要重复使用Miller-Rabin算法:对随机选取的a重复调用TEST(n),如果某时刻TEST返回“合数”,则n一定不是素数;若TEST连续t次返回“不确定”,当t足够大时,我们可以相信n是素数
实现如下:function millerRabinAlgorithmV2($n) //参照William Stallings所著的《密码编码学与网络安全——原理与实践(第七版)》实现的Miller-Rabin算法,素性检测
{
$k = 1;
$q = ($n - 1) / 2;
while (pow(2, $k) < $n - 1) { //1.找 n-1 = 2^k *q 中的k和q
$q = ($n - 1) / 2;
while (pow(2, $k) * $q < $n - 1) {
if (pow(2, $k) * $q == $n - 1) { //若满足条件,说明找到了对应的k和q,终止循环,否则q减小,继续寻找对应的q
break;
}
$q -= 2;
}
if (pow(2, $k) * $q == $n - 1) { //若满足条件,说明上面的内部循环找到了对应的k和q,则终止外部循环,否则说明没有找到对应的q,故k增大,继续寻找满足条件的k和q
break;
}
$k++;
}
$flags = []; //用数组存储重复调用Miller-Rabin算法产生的结果
while (true) {
$flags = [];
for ($times = 0; $times < 10; $times++) { //设t为10,重复调用10次
$flag = false; //6. 若下面的条件都不满足,$flag没有置true,则不是素数
$a = mt_rand(2, $n - 2); //2. 随机选取整数a, 1
rsa算法php,简化版(小素数版)RSA算法的PHP实现相关推荐
- 银行家算法实验报告c语言版,银行家算法实验报告C语言版.doc
<操作系统>课程综合性实验报告 姓名: 学号: 2016 年 11 月 20 日 实验题目进程调度算法程序设计一.实验目的 通过对安全性算法和银行家算法的模拟,进一步理解资源分配的基本概念 ...
- rsa加解密算法报告c语言,RSA加密解密算法c语言程序Word版
<RSA加密解密算法c语言程序Word版>由会员分享,可在线阅读,更多相关<RSA加密解密算法c语言程序Word版(5页珍藏版)>请在人人文库网上搜索. 1.传播优秀Word版 ...
- 计算机网络rsa算法,计算机网络安全实验新报告--非对称密码算法RSA.doc
计算机网络安全实验新报告--非对称密码算法RSA 网络安全实验报告 学院 网络工程专业 班 学号 姓名 成绩评定_______ 教师签名 实验 2 题目 非对称密码算法RSA 课程名称 网络安全 PA ...
- java判断对称素数_SM2非对称算法的原理及实现 Java SM2的代码案例 | 一生孤注掷温柔 | 小奋斗...
SM2椭圆曲线公钥密码算法:我国自主知识产权的商用密码算法,是ECC(Elliptic Curve Cryptosystem)算法的一种,基于椭圆曲线离散对数问题,计算复杂度是指数级,求解难度较大,同 ...
- java/php/c#版rsa签名以及java验签实现--转
在开放平台领域,需要给isv提供sdk,签名是Sdk中需要提供的功能之一.由于isv使用的开发语言不是单一的,因此sdk需要提供多种语言的版本.譬如java.php.c#.另外,在电子商务尤其是支付领 ...
- uniapp 小程序实现 RSA 加密
uniapp 小程序实现 RSA 加密 引言 创建并使用 jsencrypt 进行 RSA 加密 创建 rsa 文件 在需要的地方引用 注意 引言 前端开发时,有时候不可避免会使用到加密,本人在这次的 ...
- 基于Montgomery算法的高速、可配置 RSA密码IP核硬件设计系列(五)——模幂模块(抵抗侧信道攻击)模块的设计实现方案
基于Montgomery算法的高速.可配置RSA密码IP核硬件设计系列(五) 2.2 模幂模块设计(抵抗测信道攻击模块) 2.2.1 模幂模块及内部模块的功能 2.2.3 模幂各模块的实现方案 2.2 ...
- 在非对称加密算法RSA中,假设“大”素数p=5,q=11,试给出计算过程。
文章目录 1. 题目在非对称加密算法RSA中,假设"大"素数p=5,q=11,试给出计算过程. 2. 分析步骤 3. 抄作业简单粗暴看这里 4. 参考 1. 题目在非对称加密算法R ...
- 小浩漫画算法目录汇总(20200301版)
哈喽,大家好.又到月初了,如果你每天跟着小浩刷题,目前应该已经完成了50余题.基本上各类型的题目,也都已有所了解,那我将十分欣慰.这里我对1-2月的原创题解进行了汇总,按照我认为比较理想的学习顺序进行 ...
最新文章
- JavaWeb--MVC案例1-------(4)删除
- UI基础视图----UIImageView总结
- CodeForces - 1207F Remainder Problem(分块)
- [react] 在React项目中你用过哪些动画的包?
- WPF 虚拟化 VirtualizingWrapPanel 和 VirtualLizingTilePanel
- 《成为顶级JAVA架构师的必备书籍》
- 开源一周岁,MindSpore新特性巨量来袭
- Vue.js 循环语句
- 万无一失,网站的高可用架构
- 人工智能 一种现代方法 第3章 用搜索树对问题求解
- ct扫描方式有哪些_日联科技x-ray:工业CT是怎么进行X射线的断层扫描的
- 嵌入式单片机基础篇(三十五)之SPI通信以及51单片机程序
- Http 417错误
- Yuga Labs 收购 CryptoPunks 的始末
- php框架tp6自学笔记——pdf文件下载
- 微星显卡拷机测试软件,微星显卡拷机软件(MSI Kombustor)
- MAC OS 10个技巧让你秒变MAC达人
- 自定义一个虚拟机+将自定义的虚拟机创建成模板机+快速创建虚拟机
- 7-7 超级玛丽 (10 分)
- 关于CRNN文本识别算法的理解