Cryptosystem on lucas
Lucas sequence
高中的时候有接触过这个数列,但似乎并没有仔细研究过性质,刚开始学密码学的时候我有思考过能否用数列作为公钥体制的载体呢?只可惜当时只是想着把明文m放在递推次数上,似乎并没有什么效果,后面居然能在比赛中见到真是件神奇的事情
其实不止是lucas序列所有的二阶递推都可以同样的方式构造陷门,但是lucas的系数选取使得其在模p下拥有一些奇妙的性质
introduction
an+1=ran-san-1,a0=2,a1=r
我们考虑数列{an}的特征方程x2-rx+s=0
得两根x0=\(\frac{r+\sqrt{r^2-4s}}{2}\);x1=\(\frac{r-\sqrt{r^2-4s}}{2}\)
不考虑Δ<0的情况(化为复数也能处理与想引出的lucas加密无关,就不展开写了)
∴an=λ1\((\frac{r+\sqrt{r^2-4s}}{2})^n\)+λ2\((\frac{r-\sqrt{r^2-4s}}{2})^n\)
带入n=0,1的情况可以发现λ1=λ2=1,这就是lucas参数的特殊之处了
所以我们得到lucas的通项公式
an=\((\frac{r+\sqrt{r^2-4s}}{2})^n\)+\((\frac{r-\sqrt{r^2-4s}}{2})^n\)
property in GF(p)
令D=r2-4s,在利用lucas数列进行加密的体制中选择s=1,此条件证明周期时会使用到
下面证明数列的最小循环节Π(r)|p-(\(\frac{D}{p}\))
1)若\((\frac{D}{p})=1\)即存在t使得t2=D
=>an=\((\frac{r+t}{2})^n\)+\((\frac{r-t}{2})^n\)
考虑在GF(p)下,不考虑p|rt
ap=\((\frac{r+t}{2})^p\)+\((\frac{r-t}{2})^p\)
由费马小定理易知
=>\(a_p=\frac{r+t}{2}+\frac{r-t}{2}=r=a_1\)
ap-1=\((\frac{r+t}{2})^{p-1}+(\frac{r-t}{2})^{p-1}=2=a_0\)
由于是二阶递推可知此时数列必循环
2)若\((\frac{D}{p})=-1\)即不存在t使得t2=D
根据欧拉准则\(D^{\frac{p-1}{2}}=-1(modp)\)
考虑ap=\((\frac{r+\sqrt{D}}{2})^p+(\frac{r-\sqrt{D}}{2})^p=\frac{(r+\sqrt{D})^p}{2}+\frac{(r-\sqrt{D})^p}{2}\)
考虑到对于\((\frac{r+\sqrt{D}}{2})^p\)中t的奇数次项会与的\((\frac{r-\sqrt{D}}{2})^p\)奇数次项抵消,即在这里我们注意到一个事实,数列的每一项必为整数故无理数的系数相加必为0,所以对于无理数v我们默认kv=(kmodp)v,因为无理数最后必然消除我们增加此条件并不影响结论
熟知p|\(p \choose i\)对i=1,2,...,p-1
所以(a+b)p=\(\sum_{i=0}^p\)\(p\choose i\)aibp-i
故当i=1~p-1时的项可消去
=>\(a_p=(\frac{r+\sqrt{D}^p}{2})+(\frac{r-\sqrt{D}^p}{2})\)
∵\(\sqrt{D}^p=\sqrt{D}*(\sqrt{D}^2)^{\frac{p-1}{2}}=\sqrt{D}*(D^{\frac{p-1}{2}})=-\sqrt{D}\)
=>\(a_p=(\frac{r-\sqrt{D}}{2})+(\frac{r+\sqrt{D}}{2})\)=r
\(a_{p+1}=\)\((\frac{r+\sqrt{D}}{2})^{p+1}+(\frac{r-\sqrt{D}}{2})^{p+1}\)
=\((\frac{r+\sqrt{D}}{2})^p*(\frac{r+\sqrt{D}}{2})+(\frac{r-\sqrt{D}}{2})^p*(\frac{r-\sqrt{D}}{2})\)
=>\(a_{p+1}=(\frac{r-\sqrt{D}}{2})*(\frac{r+\sqrt{D}}{2})+(\frac{r+\sqrt{D}}{2})*(\frac{r-\sqrt{D}}{2})=2*s\)
由于s=1=>ap+1=2
故ap+2=rap+1-ap=r
同上可知此时数列必循环
综上我们可知最小循环节Π(r)|p-(\(\frac{D}{p}\))
ps:对于周期性的证明之前一直局限于证明由矩阵\(\left[\begin{matrix}x&-1\\1\end{matrix}\right]\)
生成的乘法循环群G的阶#G|p-(\(\frac{D}{p}\))发现并不是很好证明,并且对于二次剩余的引入最后必落在数域上,所以最终还是考虑直接利用特征方程解决此问题
cryptosystem
这是一个zima师傅找到的一篇paper
论文对密码体制这部分其实讲的挺清楚的,但是对性质没有证明,而且我不是很习惯他这种表示方式就自己证了一遍
下面阐述一下LUC-RSA加密
类似于RSA的定义我们引入卡米歇尔函数的类似定义
对于N=pq
S(N)=lcm(p-(\(\frac{D}{p}\)),q-(\(\frac{D}{q}\))),这里S(N)是数列的一个循环节但不一定是最小循环节
其中D即证明周期性时所定义的r2-4
process
encrypt
选择N=pq,e满足(e,(p2-1)(q2-1))=1
对于明文m考虑lucas数列中r=m的情况
计算C=ae作为加密结果,(N,e)作为公钥
decrypt
引理1:am+n=aman-am-n
根据通项an=\((\frac{r+\sqrt{r^2-4s}}{2})^n\)+\((\frac{r-\sqrt{r^2-4s}}{2})^n\),s=1
易推出引理成立
引理2:akn可以看作以an为r的lucas数列的第k个项
由引理1推出akn=a(k-1)nan-a(k-2)n
考虑映射f: akn|->bk;=>bk=b1bk-1-bk-2
回到我们加密所用到的lucas的定义an+1=ran-an-1,a0=2,a1=r
对比可知引理2成立
解密过程
S(N)=lcm(p-(\(\frac{D}{p}\)),q-(\(\frac{D}{q}\)))
计算d=e-1mod(S(N))
计算以C=ae为r的lucas数列的第d项即为aed
∵ed=1mod(S(N))=>ed=kS(N)+1
考虑到{an}的周期性,=>aed=a1=m
majorization
考虑到为了保障安全性,迭代次数e和d都不会太小,而如果直接用函数迭代去求取结果的话速度和空间上似乎并不理想,如何优化lucas数列的迭代过程,下面给出几个方案
1.矩阵快速幂
将递推过程看作线性变换对应的矩阵,由此我们只要解决矩阵幂次的速度问题即可,采用矩阵快速幂即可满足需求
2.矩阵相似对角化优化
将幂乘矩阵相似到对角阵,我们则可将其幂次看作数域上的幂乘,最后还原即可,这个方法能一定程度减少矩阵运算次数,毕竟矩阵运算的开销要比数字的运算开销要更大
3.William's p+1算法优化
这个算法是个神奇的玩意,以前一直看不大明白p+1光滑是如何操作的,在整明白lucas递推后,William's p+1算法的流程与pollard-p-1算法思想上是一致的
pollard-p-1算法利用的是模p乘法群上的阶整除p-1
而在p-1光滑的情况下我们可以塞一堆小数乘积S当幂次,有较大几率是被p-1整除的,则有aS=1mod(p),求gcd(aS-1,N)有一定几率是能够将N分解的
那么我们回到William's p+1算法
当(\(\frac{D}{p}\))=-1时模p下的阶是p+1
考虑到p+1光滑,我们可以塞一堆小数乘积S当迭代次数,有较大几率是被p+1整除的
即aS=a0=2mod(p),求gcd(as-2,N)有一定几率将N分解
我们只需在模N下计算出as即可
优化算法如下
def LUC(c, d, N):
x = c
y = (c**2 - 2) % N
for bit in bin(d)[3:]:
if bit == '1':
x = (x*y - c) % N
y = (y**2 - 2) % N
else:
y = (x*y - c) % N
x = (x**2 - 2) % N
return x