欧拉函数 html
公式python
相关概念算法
对于公式的解释安全
取模运算函数
模指数运算工具
python中处理函数测试
欧几里得拓展算法加密
证实:假设 a>b一、显然当 b=0,gcd(a,b)=a,此时 x=1,y=0;二、ab!=0 时,设 ax1+by1=gcd(a,b);bx2+(a mod b)y2=gcd(b,a mod b);根据朴素的欧几里德原理有 gcd(a,b)=gcd(b,a mod b);则:ax1+by1=bx2+(a mod b)y2;即:ax1+by1=bx2+(a-(a/b)*b)y2=ay2+bx2-(a/b)*by2;根据恒等定理得:x1=y2; y1=x2-(a/b)*y2;这样咱们就获得了求解 x1,y1 的方法:x1,y1 的值基于 x2,y2.
RSA涉及的元素spa
N:大整数N,咱们称之为模数(modulus)
p 和 q :大整数N的两个因子(factor)
e 和 d:互为模反数的两个指数(exponent)
c 和 m:分别是密文和明文,这里通常指的是一个十进制的数还有一个就是n的欧拉函数值,在求解d的时候经常使用
加密过程命令行
选择两个不相等的大素数p和q,这里选61和53(实际应用中,越大越难破解) 计算出模数 n = p * q = 61 * 53 =3233 计算 φ(n) = (p−1) * (q−1) 即 n 的欧拉函数,φ(n) = 60 * 52 = 3120 随机选择一个 e 知足 (1<e<φ(n)),且 e 和 φ(n) 互质,在 1 到 3120 之间选择,选择了 17(实际应用中经常选择 65537 ) 取 e 对于 φ(n) 的模反数 d,计算方法: e * d ≡ 1 (mod φ(n)) 即:e*x+φ(n)*y = 1 17x+3120y=1,解得一组整数解为(x,y) = (2753,-15),即 d = -15 将 n 和 e 封装为公钥(3233,17),n 和 d 封装为私钥(3233,2753) 对明文A进行加密:B≡A^e (mod n) 或 B = pow(A,e,n),获得的B即为密文
对密文B进行解密,A≡B^d( mod n) 或 A = pow(B,d,n),获得的A即为明文
RSA工具
RSA-tools2使用
P 第一个大素数Q 第二个大素数 (P、Q长度不能相差太大)E 公钥(随机数,必须知足:gcd(E,(p-1)*(q-1))==1) 即 E 与 (p-1)*(q-1) 互质N 共用模数,由 P 和 Q 生成:N=P*QD 私钥:D=E^(-1) mod ((p-1)*(q-1))
使用步骤
一、单击“Start”按钮,而后随意移动鼠标直到提示信息框出现,以获取一个随机数种子二、在“KeySize(Bits)”编辑框中输入 32 ;三、单击“Generate”按钮生成;四、复制“1st Prime(P)”编辑框中的内容到“Public Exponent(E)[HEX]”编辑框;五、再次重复第 1 步;六、在“KeySize(Bits)”编辑框中输入您所但愿的密钥位数,从32到4096,位数越多安全性也高,但运算速度越慢,通常选择1024位足够了;七、单击“Generate”按钮生成;八、单击“Test”按钮测试,在“Message to encrypt”编辑框中随意输入一段文本,而后单击“Encrypt”按钮加密,再单击“Decrypt”按钮解密,看解密后的结果是否和所输入的一致,若是一致表示所生成的RSA密钥可用,不然须要从新生成;九、到今生成完成。其中:“Private Exponent(D)”编辑框中的内容为私钥;E8D85AA7“Public Exponent(E)[HEX]”编辑框中的内容为公钥;15E03“Modulus (N)”编辑框中的内容为公共模数。19F834DB9请将上述三段十六进制文本保存起来便可。
大整数分解
yafu-x64.exe
factor(须要分解的整数)
msieve.exe
msieve.exe 0xA41006DEFD378B7395B4E2EB1EC9BF56A61CD9C3B5A0A73528521EEB2FB817A7 -v
msieve.exe –help 查看帮助-v 意思打印具体分解的状况-q 仅仅打印能找到的因子
openssl
-in 选项指定待解密的数据文件msg.bin.enc-out 选项指定解密后的输出文件msg.bin.dec-inkey 选项指定用于解密的私钥Key.pem,因为输入是私钥,因此再也不须要使用选项-pubin-decrypt 选项代表这里是进行解密操做-pkcs 选项指定解密处理过程当中数据的填充方式,对于填充,可选项有:-pkcs, -oaep, -ssl, -raw,默认是-pkcs,即按照PKCS#1 v1.5规范进行填充
openssl genrsa -out key.pem -f4 2048 生成私钥,并导出公钥生成2048 bit的PEM格式的RSA Key:Key.pem openssl rsa -in key.pem -pubout -out key_public.pem 从私钥导出公钥:Key_public.pem echo "hello rsa" > msg.txt 为了简便起见,这里将字符串”hello rsa”存放到文件msg.txt做为测试数据 openssl rsautl -in msg.txt -out msg.txt.enc -inkey key_public.pem -pubin -encrypt -pkcs 使用公钥key_public.pem对测试数据msg.txt进行加密生成msg.txt.enc openssl rsautl -in msg.txt.enc -out msg.txt.dec -inkey key.pem -decrypt -pkcs 使用私钥key.pem对加密后的数据msg.txt.enc进行解密,并将结果存放到msg.txt.dec文件中
例子
实验吧 RSA
openssl rsa -pubin -text -modulus -in public.pem
分析公钥获得 N 、EExponent(E)= 65537 (0x10001)Modulus(N)= A41006DEFD378B7395B4E2EB1EC9BF56A61CD9C3B5A0A73528521EEB2FB817A7
msieve.exe 0xA41006DEFD378B7395B4E2EB1EC9BF56A61CD9C3B5A0A73528521EEB2FB817A7 -v
p39 factor: 258631601377848992211685134376492365269p39 factor: 286924040788547268861394901519826758027
使用 python 脚本解密 rsa.py,用到的库 win10 上没装好,在 kali 里能够,用 kali 运行 python2 rsa.py 获得私钥 private.pem
import math import sys from Crypto.PublicKey import RSA keypair = RSA.generate(1024) keypair.p=258631601377848992211685134376492365269 keypair.q=286924040788547268861394901519826758027 keypair.e=65537 keypair.n=keypair.p * keypair.q Qn = long((keypair.p-1) * (keypair.q-1)) i =1
while(True): x=(Qn * i) + 1
if(x%keypair.e==0): keypair.d=x/keypair.e break i+=1 private=open('private.pem','w') private.write(keypair.exportKey()) private.close()
openssl rsautl -decrypt -in flag.enc -inkey private.pem -out flag.txt
参考