Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import collections
- from Crypto.PublicKey import RSA
- from Crypto.Util import number
- from math import gcd
- class Data:
- def __init__(self, idx):
- self.idx = idx
- self.public_key = None
- self.private_key = None
- self.ciphertext = None
- self.plaintext = None
- def get_data(idx):
- data = Data(idx)
- with open('{}.pem'.format(idx), 'rb') as pem:
- data.public_key = RSA.importKey(pem.read())
- with open('{}.bin'.format(idx), 'rb') as bin:
- data.ciphertext = bin.read()
- return data
- datas = [get_data(idx) for idx in range(1, 101)]
- def make_private_key(p, q, e=65537):
- n = p * q
- phi = (p - 1) * (q - 1)
- d = number.inverse(e, phi)
- return RSA.construct((n, e, d))
- primes = {}
- for data1 in datas:
- for data2 in datas:
- if data1 == data2: continue
- div = gcd(data1.public_key.n, data2.public_key.n)
- if div == 1: continue
- p1 = data1.public_key.n // div
- p2 = data2.public_key.n // div
- if data1.private_key is None:
- data1.private_key = make_private_key(div, p1)
- if data2.private_key is None:
- data2.private_key = make_private_key(div, p2)
- for data in datas:
- if data.private_key is not None:
- # data.ciphertext = data.public_key.encrypt(b'hello world', 0)
- data.plaintext = data.private_key.decrypt(data.ciphertext)
- with open('out/{}.pem'.format(data.idx), 'wb') as out:
- out.write(data.private_key.exportKey(format='PEM'))
- with open('out/{}.dec'.format(data.idx), 'wb') as out:
- print('{}.dec: {}'.format(data.idx, data.plaintext))
- out.write(data.plaintext)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement