n = p4 = #已知P的高位,最后面8位二进制,也就是两位十六进制要参与爆破,所以要用00补充 e = pbits = #P原本的位数
for i in range(0,256):# 要爆破的8位二进制数,为2**8==256,表示0~255 p4 = p4 = p4 + int(hex(i),16) kbits=pbits - p4.nbits() p4 = p4 << kbits PR.<x> = PolynomialRing(Zmod(n)) f = x + p4 roots = f.small_roots(X=2^kbits,beta=0.4) # 经过以上一些函数处理后,n和p已经被转化为10进制 if roots: p= p4 + int(roots([0])) print ("n",n) print ("p",p) print ("q",n/p)
#已知m高位
1 2 3 4 5 6 7 8 9 10 11
def phase2(high_m, n, c): R.<x> = PolynomialRing(Zmod(n), implementation='NTL') m = high_m + x M = m((m^3 - c).small_roots()[0]) print(hex(int(M))[2:])