蓝桥杯一个填空题是rsa,python也没跑出来,回来又学了学rsa
这个讲的很清楚,证明啥的都很清晰,(证明中,m与n不互质时,ed两次带入,似乎没必要。)
链接:https://blog.csdn.net/u014044812/article/details/80866759
其中附加的辗转相除法,手算ax+by=1这种式子也会了。
举个百度的例子:
已知不定方程为
,利用辗转相除法求出一组整数解
![](https://gss2.bdstatic.com/-fo3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D106/sign=8940d1bea7345982c18ae1923af6310b/f11f3a292df5e0fe87b8cccb566034a85fdf7253.jpg)
![](https://gss2.bdstatic.com/9fo3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D23/sign=5af323b9f1f2b211e02e824dc880c6f5/9e3df8dcd100baa187da02714d10b912c9fc2e01.jpg)
解:求
的算式为:
![](https://gss1.bdstatic.com/9vo3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D61/sign=894b4bd327f5e0feea188a005d60327e/a50f4bfbfbedab647a1b090afd36afc378311e8a.jpg)
![](https://gss2.bdstatic.com/-fo3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D121/sign=84587d09ddca7bcb797bc32d8f086b3f/5882b2b7d0a20cf4c7fbba157c094b36adaf9995.jpg)
![](https://gss2.bdstatic.com/9fo3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D120/sign=d29437d903f79052eb1f433c3cf2d738/902397dda144ad34abb2c34ddaa20cf430ad85ef.jpg)
![](https://gss2.bdstatic.com/9fo3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D102/sign=442b4780d0b44aed5d4ebae4811d876a/21a4462309f790525a1103f406f3d7ca7acbd5ea.jpg)
![](https://gss2.bdstatic.com/-fo3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D103/sign=fb3fa132ad86c9170c035639fa3f70c6/9f510fb30f2442a7b7c6b86fdb43ad4bd013022b.jpg)
![](https://gss3.bdstatic.com/7Po3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D94/sign=3e594200888ba61edbeec42b4034191b/a8773912b31bb0517775f7e23c7adab44bede0a3.jpg)
![](https://gss0.bdstatic.com/-4o3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D93/sign=1d79dcb1db1373f0f13f639ca50f5c66/f31fbe096b63f624a75a7dc98d44ebf81b4ca3f1.jpg)
![](https://gss2.bdstatic.com/-fo3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D85/sign=632ea0e979f0820229929c3a4afb5b11/6a63f6246b600c3349219a02104c510fd8f9a1a4.jpg)
![](https://gss3.bdstatic.com/-Po3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D85/sign=a2bb7bafb919ebc4c4787b9c8326ae3b/2934349b033b5bb5126064343cd3d539b700bc41.jpg)
![](https://gss1.bdstatic.com/-vo3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D85/sign=5c5e48fb2b3fb80e08d16cd234d12ce7/1ad5ad6eddc451dadc7c4821bcfd5266d1163275.jpg)
所以
![](https://gss1.bdstatic.com/-vo3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D157/sign=c79da0f3b9de9c82a265fd8a5b8380d2/9345d688d43f8794f1070ce4d81b0ef41ad53a7b.jpg)
![](https://gss2.bdstatic.com/-fo3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D246/sign=b3e82878b8b7d0a27fc90399fded760d/3b292df5e0fe9925a2ed2d9a3ea85edf8cb17112.jpg)
![](https://gss2.bdstatic.com/-fo3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D331/sign=32aff2f013d8bc3ec20800c9b38aa6c8/dcc451da81cb39dbe8d3209cda160924aa1830ec.jpg)
![](https://gss1.bdstatic.com/-vo3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D142/sign=966b7ec98d44ebf86971603bebf8d736/adaf2edda3cc7cd9701b73133301213fb90e91c2.jpg)
![](https://gss2.bdstatic.com/-fo3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D175/sign=dce4a2ec0324ab18e416e53000fbe69a/a8773912b31bb051769bf4e23c7adab44bede0b9.jpg)
所以
![](https://gss2.bdstatic.com/-fo3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D176/sign=b3c2c00149166d223c77119370220945/342ac65c103853431dcbc0eb9913b07ecb8088f0.jpg)
所以
是不定方程
的一组解。
![](https://gss1.bdstatic.com/-vo3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D107/sign=8bb3a84e40ed2e73f8e9822cb003a16d/b3fb43166d224f4a9d6d34d903f790529922d100.jpg)
![](https://gss2.bdstatic.com/-fo3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D106/sign=8940d1bea7345982c18ae1923af6310b/f11f3a292df5e0fe87b8cccb566034a85fdf7253.jpg)
蓝桥杯中的题意是已知n,d,c求m,e是未知。
加密:
m^e≡c(modn)
解密:
c^d≡m(modn)
好像用公式一套就出来了??!
反正oj上第一个flag是得到了
import rsa,sys from rsa import common #(pub_key,pri_key) = rsa.newkeys(256) #m = b'hello' #crpto = rsa.encrypt(m,pub_key) #print(len(crpto),common.byte_size(pub_key.n)) #print(pri_key) #print(sys.argv[0]) pri_k = open('rsa_private_key.pem','r').read() #print(pri_k,'1') #print("--------------------------------------------------") pri_key = rsa.PrivateKey.load_pkcs1(pri_k) #print(pri_key) c = open('flag.encrypt','rb').read() m = rsa.decrypt(c,pri_key) print(m)
第二个:
找到了一个知乎的解法,然后n,e,d,p,q都一样,解密失败。。。
我就是解密失败。。无语
然后找到了一个博客上面是自己实现解密方法,然后调用。
我又试了试,自己写了个。
因为rsa解密在得到了私钥后,其实就是带mod的快速幂
然后解成功了,但是解码显示没出来,python3 str没有decode方法。
于是想到了之前bytes2int()会不会有反向的,因为bytes有decode
然后发现真有,就很愉悦了。
转为bytes后decode就出来了。
至于如何得到的n,e,p,q,d参考我之前写的随笔:https://www.cnblogs.com/zhibin123/p/10590743.html
# -*- coding:utf-8 -*- import gmpy2 import rsa from rsa import transform,core def fastMod(c,d,n): t = c res = 1 while d: if d & 1: res = (res * t)%n t = ( t * t ) % n d>>=1 return res def decrytption(c,d,n): return fastMod(c,d,n) q = 319576316814478949870590164193048041239 p = 275127860351348928173285174381581152299 n = 87924348264132406875276140514499937145050893665602592992418171647042491658461 e = 65537 d = int(gmpy2.invert(e,(p-1) * (q-1))) pri_key = rsa.PrivateKey(n,e,d,p,q) c = open('flag.encrypt','rb').read() print(c) c = transform.bytes2int(c) print(c) m = decrytption(c,d,n) print(m,type(m)) flag = transform.int2bytes(m).decode() print(flag)