某次面试
三面报告
简单尝试
1 | c=2857831458617919915448348973202449428172975402344447845149753833225 |
看着识字感觉有点熟悉,类似与RSA的低加密指数分解攻击,试一下
1 | import gmpy2 |
在思考一下,和RSA的低加密指数分解攻击有点类似的Rabin算法(是一种基于模平方和模平方根的非对称加密算法)。尝试用yafu,factordb分解n,失败。在验证一下n是不是素数。
1 | print(isPrime(n)) |
那就说明不是Rabin加密。
看提示要探索x背后的秘密,回想之前数论学习里面的二次同余式的知识,试一下。
二次剩余
一个数 a,如果不是p 的倍数且模 p同余于某个数的平方,则称 a为模p 的 二次剩余 。而一个不是 p的倍数的数 b,不同余于任何数的平方,则b称 为模 p的 非二次剩余 。
是否有解
引入勒让德符号
通过勒让德符号可以判断一个数 是否为二次剩余,具体判断 是否为 的二次剩余,需要通过欧拉判别准则来实现
欧拉判别准则
证明:
Cipolla算法
Cipolla算法是解决二次剩余强有力的工具,一个脑洞大开的算法
证明
代码实现
1 | c = 2857831458617919915448348973202449428172975402344447845149753833225 |
非预期解
1 | if (n % 4 == 3): |