Rabin算法
中国剩余定理
如果已知n
的素因子,那么就能够利用中国剩余定理求解方程组。用现代数学的语言来说明就是,中国剩余定理给出了以下的一元线性同余方程组有解的判定条件:
一般而言,如果n
的素因子可以分解为:
\[
n=p_1 * p_2 * ... * p_t
\]
那么方程组:
\[
(x \quad mod \quad p_i)=a_i \quad (i=1,2,...t)
\]
有唯一解,这里x<n
,就是说一个数被他的余数模这些素数唯一确定
例如,去两个素数2和5,与一个数字9,那么9 mod 2=1
,9 mod 5=4
,则小于2*5=10且满足上式的只有9
所以能够得到如果对已任意的a<p,b<q
(p,q都是素数),那么,当x<p*q
的时候,存在一个唯一的x
使得:
\[
x \equiv a(mod \quad p)\quad 且\quad x\equiv b(mod \quad q)
\]
如何计算x
?
首先通过欧几里得算法找到u
,使得:
\[
u * q \equiv 1(mod \quad p)
\]
然后计算:
\[
x=(((a-b) * u) mod \quad p)*q+b
\]
推论:
如果p
和q
都是素数,且 p<q
,那么存在一个唯一的x<p*q
,使得
\[
a \equiv x(mod \quad p)且b \equiv x(mod \quad q)
\]
如果\(a \ge b\quad mod \quad p\),那么:
\[
x = (((a-(b \quad mod \quad p)) * u)mod \quad p) * q + b
\]
如果\(a < b\quad mod \quad p\),那么:
\[
x = (((a+p-(b \quad mod \quad p)) * u)mod \quad p) * q + b
\]
二次剩余
如果p
是素数,且a<p
,如果
\[
x^2 \equiv a(mod \quad p) \quad 对某些x成立
\]
那么称a
是对模p
的二次剩余
而如果a
是对模n
的一个二次剩余,那么它必定是对模n
的所有因子的二次剩余,例如
如果p=7
,那么二次剩余是1、2、4
每一个二次剩余都在上面出现了两次
而对于下面的的方程:
不存在一个x
的值能够满足任意一个,所以对模7的非二次剩余就是3、5、6
费马小定理
如果m
是一个素数,且a
不是m
的倍数,那么根据费马小定理,有:
\[
a^{m-1} \equiv 1(mod \quad m)
\]
欧拉函数
也称之为\(\varphi\)函数,写作\(\varphi(n)\),\(\varphi(n)\)表示与n
互素的小于n
的正整数的数目
如果n是素数,那么\(\varphi(n)=n-1\),如果\(n=pq\),(p、q为素数)那么\(\varphi(n)=(p-1)(q-1)\)
根据费马小定理的欧拉推广,如果`gcd(a,n)=1,那么:
\[
a^{\varphi(n)}\quad mod\quad n=1
\]
Rabin算法
破解RSA的关键即在于大整数的分解,只要n
被成功分解,就能够破译。而Rabin密码体制是对RSA的一种修正。
- Rabin密码体制对于同一密文,可能有两个以上对应的明文
- 破译该密码体制同样等价于对大整数的分解,RSA中选取的公钥
e
满足\(1<e<\varphi(n)\),而Rabin中则选取e=2
密钥的产生
随机选择两个大素数
p
,q
,通常选取p
,q
\(\equiv 3(mod \quad4)\)密钥为
p
,q
公钥
n=p*q
明文:
m
,密文:c
加密:\(c \equiv m^2 \quad mod \quad n\)
解密过程如下:
\(m_p=c^{\frac{p+1}{4}}mod \quad p\)
\(m_q=c^{\frac{q+1}{4}}mod \quad q\)
使用扩展欧几里得算法得到\(y_p和y_q\),使得\(y_p·p+y_q·q=1\)
利用中国剩余定理得到
\(x_1=(y_p·p·m_q+y_q·q·m_p) mod \quad n\)
\(x_2=n-x_1\)
\(x_3=(y_p·p·m_q-y_q·q·m_p) mod \quad n\)
\(x_4=n-x_3\)
举例
a. 假定计算:\(p=7,q=11,n=77,m=20\)
b. 那么:\(c=m^2 \quad mod \quad n=400 \quad mod \quad 77=15\)
c. 所以:
\(m_p=c^{\frac{p+1}{4}}mod \quad p=15^2 \quad mod \quad 7=1\)
\(m_q=c^{\frac{q+1}{4}}mod \quad q=15^2 \quad mod \quad 11=9\)
d. 利用扩展欧几里得算法计算\(y_p·p+y_q·q=1;y_p=-3,y_q=2\)
e. 最终得到:
\(x_1=(y_p·p·m_q+y_q·q·m_p) mod \quad n=(-3·7·9+2·11·1)mod 77=64\)
\(x_2=n-x_1=77-64=13\)
\(x_3=(y_p·p·m_q-y_q·q·m_p) mod \quad n=(-3·7·9-2·11·1)mod 77=20\)
\(x_4=n-x_3=77-20=57\)
参考
《应用密码学》(协议、算法与C源程序):https://item.jd.com/11362600.html
维基百科:https://en.wikipedia.org/wiki/Rabin_cryptosystem
Rabin算法的更多相关文章
- Miller Rabin算法详解
何为Miller Rabin算法 首先看一下度娘的解释(如果你懒得读直接跳过就可以反正也没啥乱用:joy:) Miller-Rabin算法是目前主流的基于概率的素数测试算法,在构建密码安全体系中占有重 ...
- Pollard rho算法+Miller Rabin算法 BZOJ 3668 Rabin-Miller算法
BZOJ 3667: Rabin-Miller算法 Time Limit: 60 Sec Memory Limit: 512 MBSubmit: 1044 Solved: 322[Submit][ ...
- Miller Rabin 算法简介
0.1 一些闲话 最近一次更新是在2019年11月12日.之前的文章有很多问题:当我把我的代码交到LOJ上,发现只有60多分.我调了一个晚上,尝试用{2, 3, 5, 7, 11, 13, 17, 1 ...
- Miller Rabin算法学习笔记
定义: Miller Rabin算法是一个随机化素数测试算法,作用是判断一个数是否是素数,且只要你脸不黑以及常数不要巨大一般来讲都比\(O(\sqrt n)\)的朴素做法更快. 定理: Miller ...
- 【数论基础】素数判定和Miller Rabin算法
判断正整数p是否是素数 方法一 朴素的判定
- (Miller Rabin算法)判断一个数是否为素数
1.约定 x%y为x取模y,即x除以y所得的余数,当x<y时,x%y=x,所有取模的运算对象都为整数. x^y表示x的y次方.乘方运算的优先级高于乘除和取模,加减的优先级最低. 见到x^y/z这 ...
- 素数测试算法(基于Miller-Rabin的MC算法) // Fermat素数测试法
在以往判断一个数n是不是素数时,我们都是采用i从2到sqrt(n)能否整除n.如果能整除,则n是合数;否则是素数.但是该算法的时间复杂度为O(sqrt(n)),当n较大时,时间性能很差,特别是在网络安 ...
- Miller-Rabin算法 codevs 1702 素数判定 2
转载自:http://www.dxmtb.com/blog/miller-rabbin/ 普通的素数测试我们有O(√ n)的试除算法.事实上,我们有O(slog³n)的算法. 定理一:假如p是质数,且 ...
- 【Java-加密算法】对称加密、非对称加密、单向散列(转)
一提到加密,就会联想到数字签名,这两个经常被混淆的概念到底是什么呢? 加密:加密是一种以密码方式发送信息的方法.只有拥有正确密钥的人才能解开这个信息的密码.对于其他人来说,这个信息看起来就像是一系列随 ...
随机推荐
- 测开之路八十一:参数定义之*args和**kwargs
# *,不定长参数,*args# 定义函数参数def avg(score, *scores): return (score + sum(scores)) / (len(scores) + 1) ...
- go tour - Go 入门实验教程
在线实验地址 - 官网 在线实验地址 - 国内 可以将官方教程作为独立程序在本地安装使用,这样无需访问互联网就能运行,且速度更快,因为是在你的机器上构建并运行代码示例. 本地运行此教程的中文版的步骤如 ...
- JQuery 字符串转时间格式
//字符串转时间格式 function getDate(strDate) { var date = eval('new Date(' + strDate.replace(/\d+(?=-[^-]+$) ...
- Python笔记(二十一)_内置函数、内置方法
内置函数 issubclass(class1,class2) 判断class1类是否为class2类的子类,返回True和False 注意1:类会被认为是自身的子类 >>>issub ...
- 【ABAP系列】SAP ABAP模块-ABAP动态指针写法的精髓部分
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP模块-ABAP动 ...
- Git008--远程仓库
Git--远程仓库 本文来自于:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/ ...
- 20190825 On Java8 第十二章 集合
第十二章 集合 java.util 库提供了一套相当完整的集合类(collection classes)来解决这个问题,其中基本的类型有 List . Set . Queue 和 Map. 不要在新代 ...
- JSP基础--会话跟踪技术、cookie、session
会话跟踪技术 1 什么是会话跟踪技术 我们需要先了解一下什么是会话!可以把会话理解为客户端与服务器之间的一次会晤,在一次会晤中可能会包含多次请求和响应.例如你给10086打个电话,你就是客户端,而10 ...
- vue构造器注册UI组件
import ConfirmComponent from '../../components/confirm/index' import { mergeOptions } from '../plugi ...
- [BZOJ1901][luogu2617]Dynamic Rankings(树状数组+主席树)
题面 单点修改,区间求第k大 分析 首先,这道题卡权值线段树套treap的做法,所以只能用主席树做 对于静态的查询,root[i]对应的主席树的区间[l,r]保存的是a[1]~a[i]有多少个值落在区 ...