from pwn import * from gmpy2 import invert from Crypto.Util.number import long_to_bytes p = remote(ip,port) C = n = e = X = 2 X_e = pow(X,e,n) p.sendline(str((X_e*c)%n) Z = int(p.recvline()) result = (Z*long(invert(X,n)))%n print(long_to_bytes(result))
from pwn import * import time,decimal,binascii from Crypto.Util.number import long_to_bytes
p = remote(ip,port)
deforacle(c1): global p p.sendline(str(c1)) res = int(p.recvuntil("\n").strip()) if res == 0: return0 if res == 1: return1 else: assert (0)
defpartial(c, n): global c_of_2 k = n.bit_length() decimal.getcontext().prec = k lower = decimal.Decimal(0) upper = decimal.Decimal(n) for i in range(k): possible_plaintext = (lower + upper) / 2 flag = oracle(c) ifnot flag: upper = possible_plaintext else: lower = possible_plaintext c = (c * c_of_2) % n print(i,flag,int(upper - lower)) return int(upper) e = c = n = c_of_2 = pow(2,e,n) m = partial((c * c_of_2) % n, n) print(long_to_bytes(m))
from pwn import * import time import binascii from Crypto.Cipher import AES from Crypto.Util.number import long_to_bytes from gmpy2 import invert p = remote(ip,port) e = c = n = print("e:",e) print("c:",c) print("n:",n) d = {} for k in range(0,256): d[(-k*n)%256] = k print(d) lb = 0 ub = n for i in range(1,256): m = (c * pow(256,i*e,n)) %n p.sendline(str(m)) b = int(p.recvline()) k = d[b] interval = int((ub-lb)/256) lb = lb + interval * k ub = lb + interval print("ub-lb:",ub-lb) print("lb:",lb) print("ub:",ub) i = lb # 没控制好边界,所以最后暴力一段 while(i<=lb+30000): m = pow(i,e,n) if(m==c): print("result:",i) p.sendline(str(i)) print(p.recvline()) exit(0) i+=1 print("no result")
deffactor_modulus(n, d, e): """ Efficiently recover non-trivial factors of n See: Handbook of Applied Cryptography 8.2.2 Security of RSA -> (i) Relation to factoring (p.287) http://www.cacr.math.uwaterloo.ca/hac/ """ t = (e * d - 1) s = 0
whileTrue: quotient, remainder = divmod(t, 2)
if remainder != 0: break
s += 1 t = quotient
found = False
whilenot found: i = 1 a = random.randint(1,n-1)
while i <= s andnot found: c1 = pow(a, pow(2, i-1, n) * t, n) c2 = pow(a, pow(2, i, n) * t, n)
l = [] n = libnum.xgcd(pn,qn)[2] l.append(n) n = libnum.xgcd(pn,rn)[2] l.append(n) n = libnum.xgcd(pn,sn)[2] l.append(n) n = libnum.xgcd(qn,rn)[2] l.append(n) n = libnum.xgcd(qn,sn)[2] l.append(n) n = libnum.xgcd(rn,sn)[2] l.append(n) n = 0 for _ in l: if(l.count(_)>=3): n = _ if(n==0): print("nope") exit(0) else: print("n:",n)