题目给了n e c 还有not_phi=(p+2)(q+2)=p*q+2p+2q+4 要算出私钥d就要算出n的欧拉函数 n的欧拉函数是(p-1)(q-1)=p*q-p-q+1
n = p*q 所以这是初中生就能解决的因式问题
n的欧拉函数 = (not_phi-n-4)//2
得到欧拉函数就可以用模逆元算d
有c d n就有明文
exp如下
1 2 3 4 5 6 7 8 9 10 11
import libnum from sympy import mod\_inverse e=65537 c=37077223015399348092851894372646658604740267343644217689655405286963638119001805842457783136228509659145024536105346167019011411567936952592106648947994192469223516127472421779354488529147931251709280386948262922098480060585438392212246591935850115718989480740299246709231437138646467532794139869741318202945 not\_phi = 96557532552764825748472768984579682122986562613246880628804186193992067825769559200526147636851266716823209928173635593695093547063827866240583007222790384900615665394180812810697286554008262030049280213663390855887077502992804805794388166197820395507600028816810471093163466639673142482751115353389655533205 n = 96557532552764825748472768984579682122986562613246880628804186193992067825769559200526147636851266716823209928173635593695093547063827866240583007222790344897976690691139671461342896437428086142262969360560293350630096355947291129943172939923835317907954465556018515239228081131167407674558849860647237317421 pplusq=(not\_phi-n-4)//2 phi=n+1-pplusq d = mod\_inverse(e, phi) m=pow(c,d,n) print(libnum.n2s(m))
[Week1] babypack
加密脚本的过程大概是
把flag转换为2进制
创建一个随机数列表a,可以观察到每个随机数必然是后一个的两倍多一点
然后看flag的2进制中的每一位是不是1,如果是则将随机数列表里对应数加到变量c上
我们有的是a和c 那么就可以让a[i]和c比大小,判断第i+1位是不是1
总之exp如下
1 2 3 4 5 6 7 8 9 10
# a = ··· # c = ··· for i in a: if c>i: c-=i print(1,end='') else: print(0,end='') flag=0b10000100110000101110011011001010100001101010100010001100111101100110010011000110011010001100010001100000110001100110001001101010010110100110011011000100110010101100101001011010011010001100101001101000110000100101101011000100110010100110110011001010010110100110000011001100011001000110001011001010011010000110100011000100110010000110100011000110011100101111100 print(libnum.n2s(flag))
[Week1] babyrsa
rsa算法,但是没有p和q,直接取n 我猜n大概率是素数,所以直接算它的欧拉函数
exp如下
1 2 3 4 5 6 7 8 9
import libnum from sympy import mod\_inverse n = 104183228088542215832586853960545770129432455017084922666863784677429101830081296092160577385504119992684465370064078111180392569428724567004127219404823572026223436862745730173139986492602477713885542326870467400963852118869315846751389455454901156056052615838896369328997848311481063843872424140860836988323 e = 65537 c = 82196463059676486575535008370915456813185183463924294571176174789532397479953946434034716719910791511862636560490018194366403813871056990901867869218620209108897605739690399997114809024111921392073218916312505618204406951839504667533298180440796183056408632017397568390899568498216649685642586091862054119832 phi = n-1 d = mod\_inverse(e, phi) m = pow(c,d,n) print(libnum.n2s(m))
[Week1] 十七倍
明文m转秘文c的算式为 m*17%256=c
那么 m=c*17关于256的模逆元%256 可以很容易的知道是241
exp如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
cipher = [ 98, 113, 163, 181, 115, 148, 166, 43, 9, 95, 165, 146, 79, 115, 146, 233, 112, 180, 48, 79, 65, 181, 113, 146, 46, 249, 78, 183, 79, 133, 180, 113, 146, 148, 163, 79, 78, 48, 231, 77 ] for int in cipher: print(chr(int),end='') print() for i in range(len(cipher)): cipher[i] = (cipher[i]\*241) % 256 for int in cipher: print(chr(int),end='') # 或者,如果你不想使用预定义的逆元 # x = solve\_modular\_equation(y, multiplier=17, modulus=256) # print(f"x = {x}") # 同样应该输出 x = 148
[Week1] helloCrypto
很简单的一道 aes是对称加密,即然key给了就能直接解
exp如下
1 2 3 4 5 6 7 8 9 10
from Crypto.Util.number import \* from Crypto.Cipher import AES from Crypto.Util.Padding import pad import random import libnum key = libnum.n2s(208797759953288399620324890930572736628) my\_aes=AES.new(key=key,mode=AES.MODE\_ECB) c = b'U\xcd\xf3\xb1 r\xa1\x8e\x88\x92Sf\x8a`Sk],\xa3(i\xcd\x11\xd0D\x1edd\x16[&\x92@^\xfc\xa9(\xee\xfd\xfb\x07\x7f:\x9b\x88\xfe{\xae' decrypted\_padded = my\_aes.decrypt(c) print(decrypted\_padded)