import hashlib for i inrange(32,127): for j inrange(32,127): for k inrange(32,127): m=hashlib.md5() m.update('TASC'+chr(i)+'O3RJMV'+chr(j)+'WDJKX'+chr(k)+'ZM') des=m.hexdigest() if'e9032'in des and'da'in des and'911513'in des: print des
修改后的代码
1 2 3 4 5 6 7 8 9 10 11
import hashlib for i inrange(32,127): for j inrange(32,127): for k inrange(32,127): m = hashlib.md5() s = 'TASC' + chr(i) + 'O3RJMV' +chr(j) +'WDJKX' +chr(k) + 'ZM' m.update(s.encode("utf8")) des = m.hexdigest() if'e9032'in des and'da'in des and'911513'in des: print(des) break
2.栅栏密码
特征U2开头需要密钥,一种流加密 把要加密的明文分成N个一组,然后把每组的第一个字连起来,形成一段无规律的话。 不过栅栏密码本身有一个潜规则,就是组成栅栏的字母一般不会太多。 参考 加密原理 举例: n = 7, m = 2 假设明文为:have a good night 加密过程如下: 将其去掉空格:haveagoodnight 分成7组:ha ve ag oo dn ig ht ha ve ag oo dn ig ht 按照竖排来组合,则它的栅栏密码为:hvaodihaegongt 解密过程如下: 先将其分为2组:hvaodih aegongt hvaodih aegongt 然后按照每组按次序取一个进行重新组合:ha ve ag oo dn ig ht 拼起来即可:haveagoodnight 添加上必需的空格即可:have a good night
其中: p 和 q :大整数N的两个因子 N :大整数N,我们称之为模数 e 和 d :互为模反的两个指数 c 和 m :分别是密文和明文,这里一般指的是一个十进制的数
rsa算法原理
欧拉函数φ(n)
欧拉函数φ(n)的定义是小于n的自然数中与n互质的数的个数
任何一个素数p的欧拉函数就是 p-1
欧拉定理
若n,a为正整数,且n,a互质,gcd(n,a)= 1 , 则:a^φ(n)≡1 mod n
费马小定理
模运算 模运算与基本四则运算有些相似,但是除法除外。其规则如下:
(a + b) % p = (a % p + b % p) % p (a - b) % p = (a % p - b % p) % p (a * b) % p = (a % p * b % p) % p a ^ b % p = ((a % p) ^ b) % p 结合律 ((a + b) % p + c) = (a + (b + c) % p) % p ((a * b) % p * c) = (a * (b * c) % p) % p 交换律 (a + b) % p = (b + a) % p (a * b) % p = (b * a) % p 分配律 (a + b) % p = (a % p + b % p) % p ((a + b) % p * c) % p = ((a * c) % p + (b * c) % p 重要定理 若 a ≡ b (mod p),则对于任意的 c,都有(a + c) ≡ (b + c) (mod p) 若 a ≡ b (mod p),则对于任意的 c,都有(a * c) ≡ (b * c) (mod p) 若 a ≡ b (mod p),c ≡ d (mod p),则 (a + c) ≡ (b + d) (mod p) (a - c) ≡ (b - d) (mod p) (a * c) ≡ (b * d) (mod p) (a / c) ≡ (b / d) (mod p) 逆元 a mod p的逆元便是可以使 a * a’ mod p = 1 的最小a’。
推导过程
式1:c=m^e%N 式2:m=c^d%N
将式1带入式2 得 m = (m ^ e % N ) ^ d % N
需要证明:m == ( m ^ e % N ) ^ d % N
(m^e%N)^d%N
=> (m^e)^d%N #模运算 a ^ b % p = ((a % p) ^ b) % p
m^(e*d)%N #幂的乘方,底数不变,指数相乘 将 e * d ≡ 1 (mod φ(N)) 即 e * d = K * φ(N) + 1,K为任意正整数,代入得:
=> (m^(K*φ(N)+1))%N
=> (m^(K*φ(N)*m^1)%N # 同底数相乘,指数相加
=> (m^(K*φ(N)*m)%N
=> ((m^φ(N)^K%N*m)%N # 幂的乘方,底数不变,指数相乘
=> ((m^φ(N)^K%N*m%N)%N # (a * b) % p = (a % p * b % p) % p
=> ((m^φ(N)%N)^K%N*m%N)%N # a ^ b % p = ((a % p) ^ b) % p
=> (1^K%N*m%N)%N # 根据欧拉定理:a^φ(n)≡1 mod n 即 a^φ(n) mod n = 1
#字符串列表 a=string.printable #随机生成flag for i inrange(10): flag = "" for i inrange(10): flag += a[random.randint(0, 99)] flag = hashlib.md5(flag.encode()).hexdigest() print("flag{" + flag + "}")
e = 65537 n = 248254007851526241177721526698901802985832766176221609612258877371620580060433101538328030305219918697643619814200930679612109885533801335348445023751670478437073055544724280684733298051599167660303645183146161497485358633681492129668802402065797789905550489547645118787266601929429724133167768465309665906113 dp = 905074498052346904643025132879518330691925174573054004621877253318682675055421970943552016695528560364834446303196939207056642927148093290374440210503657
c = 140423670976252696807533673586209400575664282100684119784203527124521188996403826597436883766041879067494280957410201958935737360380801845453829293997433414188838725751796261702622028587211560353362847191060306578510511380965162133472698713063592621028959167072781482562673683090590521214218071160287665180751
for i inrange(1,e): #在范围(1,e)之间进行遍历 if(dp*e-1)%i == 0: if n%(((dp*e-1)//i)+1) == 0: #存在p,使得n能被p整除 p=((dp*e-1)//i)+1 q=n//(((dp*e-1)//i)+1) phi=(q-1)*(p-1) #欧拉定理 d=gp.invert(e,phi) #求模逆 m=pow(c,d,n) #快速求幂取模运算 print(m) #10进制明文 print('------------') print(hex(m)[2:]) #16进制明文 print('------------') print(bytes.fromhex(hex(m)[2:])) #16进制转文本
import libnum from gmpy2 import invert # 欧几里得算法 defegcd(a, b): if a == 0: return (b, 0, 1) else: g, y, x = egcd(b % a, a) return (g, x - (b // a) * y, y)
from gmpy2 import iroot import libnum n = 0x52d483c27cd806550fbe0e37a61af2e7cf5e0efb723dfc81174c918a27627779b21fa3c851e9e94188eaee3d5cd6f752406a43fbecb53e80836ff1e185d3ccd7782ea846c2e91a7b0808986666e0bdadbfb7bdd65670a589a4d2478e9adcafe97c6ee23614bcb2ecc23580f4d2e3cc1ecfec25c50da4bc754dde6c8bfd8d1fc16956c74d8e9196046a01dc9f3024e11461c294f29d7421140732fedacac97b8fe50999117d27943c953f18c4ff4f8c258d839764078d4b6ef6e8591e0ff5563b31a39e6374d0d41c8c46921c25e5904a817ef8e39e5c9b71225a83269693e0b7e3218fc5e5a1e8412ba16e588b3d6ac536dce39fcdfce81eec79979ea6872793
c = 0x10652cdfaa6b63f6d7bd1109da08181e500e5643f5b240a9024bfa84d5f2cac9310562978347bb232d63e7289283871efab83d84ff5a7b64a94a79d34cfbd4ef121723ba1f663e514f83f6f01492b4e13e1bb4296d96ea5a353d3bf2edd2f449c03c4a3e995237985a596908adc741f32365
k = 0 while1: res=iroot(c+k*n,3) //iroot(),该函数的作用是计算一个数的整数平方根 if(res[1]==True): print(libnum.n2s(int(res[0]))) break k=k+1
''' 第二种写法 import gmpy2 from libnum import* n = 0x52d483c27cd806550fbe0e37a61af2e7cf5e0efb723dfc81174c918a27627779b21fa3c851e9e94188eaee3d5cd6f752406a43fbecb53e80836ff1e185d3ccd7782ea846c2e91a7b0808986666e0bdadbfb7bdd65670a589a4d2478e9adcafe97c6ee23614bcb2ecc23580f4d2e3cc1ecfec25c50da4bc754dde6c8bfd8d1fc16956c74d8e9196046a01dc9f3024e11461c294f29d7421140732fedacac97b8fe50999117d27943c953f18c4ff4f8c258d839764078d4b6ef6e8591e0ff5563b31a39e6374d0d41c8c46921c25e5904a817ef8e39e5c9b71225a83269693e0b7e3218fc5e5a1e8412ba16e588b3d6ac536dce39fcdfce81eec79979ea6872793 c = 0x10652cdfaa6b63f6d7bd1109da08181e500e5643f5b240a9024bfa84d5f2cac9310562978347bb232d63e7289283871efab83d84ff5a7b64a94a79d34cfbd4ef121723ba1f663e514f83f6f01492b4e13e1bb4296d96ea5a353d3bf2edd2f449c03c4a3e995237985a596908adc741f32365 i = 0 while 1: if(gmpy2.iroot(c+i*n,3)[1]==1): #开根号 print(gmpy2.iroot(c+i*n,3)) break i=i+1 '''