CRYPTO代码记录

给出字符替代后的p,q,n,求解初始p,q:

from itertools import combinations
from Crypto.Util.number import inverse, long_to_bytes, getPrime, bytes_to_long
p= '0xd270df408983bd5fb1ee363ba4f6722aeb850a304bc1bce19a3946b495b73889c5f49a6275c1bb750f0d3bc2b82b83eb45eec8993d701c3f1aa197c9a5d73bfcf627dcfa0272771c5886d7fdf0440e8c00b0a6a2037ebd5ea0084a5d7aebdf00320f1a8e3d51998cbe9e78daca8c66a077bfbb0fe27eb3860bbf59ccd3cb8159'
q= 0xcc6486952cb6a3dcecb01f49499340e366cfe9b0962e5306267d655748881ccba7e0edb2480f0b67a54bad54c18ef26a547899625b9e92e16f5c1c82c4b8823d526e3237676994f61259984cbafd48dc6efc1ca27ceb9d365eb83872de337f40f0047829c825a830a18f2de33dcc27a75783984bba5fb482cef230b7517667af
n= 0xa803f02773cdea3f8b580dff45dc7354096f30e9fc1332632482791d9912045867d2d4615175aad2977d00a63d224efa62150ac33ce7254c4e36a387c1e2a39680f0751b61354a3bdbb2cd58bf49eab527ccfe796bd1a85ad0d05cf3c395be41e5fe52c8b00a19696566bd1028c82bacb379e4280c708269d7e163ef4994ec2c7fd1f417aa9393a0f9683413a1e2dae078ff4035b5249b72b9a693ea678641d10ad1518a4024076bdeb3da1d7c59c5304daf4884198113fe9735eb1ca88e824069e9581879d5a6ec7a3c93b5a682c59fb1b12eeef43397d9fff387fc9f617e014b14918234746b48d24c3f6d5fed8bfe74e21dde435771c2ab38f695712e3ad7
e = 65537
c= 0x4904980f483cf726e1d69bc7be4f11f0da0689aeacd967b99557bedf61508848c43a788df6c33bf5b22eac6624f3bef55e3095e426767bb7b06de82b9101a349f32f1ca2125a5cdcd7e0b2b6965e489468be73cd1ccb4059a2f5c953c98dbf2aa26f49cbf19bb12a2c97f2c621702fadf6e9d9ef7c02be9df60eac95f848f3f8c6bbbd155939bbd92c37bf68fc44c9b1e070450458903d1d411658a2bad39637bb677d90d7476fb60e9751c8510c3397a7edab31bab2ab9cbd98d05e00d8722505b2ace50cd73343b52ec8c4c85166c705bae5d1beb59e700fcdbcbe328f340ea8cc91989ba946e09b4604ff9255c5e81dbb73c36f7da368e297ffb51fc7e7d

def subsets(s):
    for candinality in range(len(s)+1):
        yield from combinations(s,candinality)
#ch1为替换后的字符,ch2为原始的字符
def replace(p,ch1,ch2):
    fp = [str(i) for i in range(len(p)) if p[i:i + 2] == ch1]
    #print(fp)
    for sub in subsets(fp):
        #print(sub)
        x=p
        for i in sub:
            #print(i)
            x = x[:int(i)] + ch2 + x[int(i) + 2:]
        #print(x)
        p_result.append(x)

possible_p=[p]
p_result = []
for i in possible_p:
    replace(i,'df','11')
    possible_p=p_result
p_result = []
for i in possible_p:
    replace(i,'a3','c4')
    possible_p = p_result

p_result = []
for i in possible_p:
    replace(i,'1c','ab')
    possible_p = p_result
print(len(possible_p))
for i in possible_p:
    p=int(i,16)
    npq=p*q
    if(n==npq):
        print(hex(p))
p=0xd27011408983bd5fb1ee363ba4f6722aeb850a304bc1bce19c4946b495b73889c5f49a6275c1bb750f0d3bc2b82b83eb45eec8993d701c3f1aa197c9a5d73bfcf627dcfa027277ab5886d7f110440e8c00b0a6a2037ebd5ea0084a5d7aeb1100320f1a8e3d51998cbe9e78daca8c66a077bfbb0fe27eb3860bbf59ccd3cb8159
phi=(p-1)*(q-1)
d=inverse(65537,phi)
flag=long_to_bytes(pow(c,d,n))
print(flag)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值