Advertisement
Guest User

Untitled

a guest
Aug 25th, 2019
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.57 KB | None | 0 0
  1. import collections
  2. from Crypto.PublicKey import RSA
  3. from Crypto.Util import number
  4. from math import gcd
  5.  
  6. class Data:
  7. def __init__(self, idx):
  8. self.idx = idx
  9. self.public_key = None
  10. self.private_key = None
  11. self.ciphertext = None
  12. self.plaintext = None
  13.  
  14. def get_data(idx):
  15. data = Data(idx)
  16. with open('{}.pem'.format(idx), 'rb') as pem:
  17. data.public_key = RSA.importKey(pem.read())
  18. with open('{}.bin'.format(idx), 'rb') as bin:
  19. data.ciphertext = bin.read()
  20. return data
  21.  
  22. datas = [get_data(idx) for idx in range(1, 101)]
  23.  
  24. def make_private_key(p, q, e=65537):
  25. n = p * q
  26. phi = (p - 1) * (q - 1)
  27. d = number.inverse(e, phi)
  28. return RSA.construct((n, e, d))
  29.  
  30. primes = {}
  31. for data1 in datas:
  32. for data2 in datas:
  33. if data1 == data2: continue
  34.  
  35. div = gcd(data1.public_key.n, data2.public_key.n)
  36. if div == 1: continue
  37.  
  38. p1 = data1.public_key.n // div
  39. p2 = data2.public_key.n // div
  40.  
  41. if data1.private_key is None:
  42. data1.private_key = make_private_key(div, p1)
  43. if data2.private_key is None:
  44. data2.private_key = make_private_key(div, p2)
  45.  
  46. for data in datas:
  47. if data.private_key is not None:
  48. # data.ciphertext = data.public_key.encrypt(b'hello world', 0)
  49. data.plaintext = data.private_key.decrypt(data.ciphertext)
  50.  
  51. with open('out/{}.pem'.format(data.idx), 'wb') as out:
  52. out.write(data.private_key.exportKey(format='PEM'))
  53. with open('out/{}.dec'.format(data.idx), 'wb') as out:
  54. print('{}.dec: {}'.format(data.idx, data.plaintext))
  55. out.write(data.plaintext)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement