Advertisement
Guest User

Untitled

a guest
Oct 17th, 2019
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.44 KB | None | 0 0
  1. import numpy as np
  2. from typing import Dict, List, Iterable
  3. from collections import Counter
  4. from itertools import *
  5. from collections import namedtuple
  6. from Crypto.Cipher import ARC4
  7. import math
  8.  
  9. def entropy(data: bytes) -> float:
  10. count = [0] * 256
  11. dataSize = len(data)
  12. for b in data:
  13. count[b] = count[b] + 1
  14. entropy = 0
  15. for b in range(256):
  16. if count[b] / dataSize > 0:
  17. entropy = entropy + (count[b] / dataSize) * math.log(count[b] / dataSize, 2)
  18. return -entropy
  19.  
  20.  
  21. def codesToStr(codes: Iterable[int]) -> str:
  22. return ''.join((chr(c) for c in codes))
  23.  
  24.  
  25. def bruteforceARC4(cryptogram: bytes, maxKeyLength: int = 5, keyAlphabet=range(256)) -> None:
  26. entropyThreshold = 6
  27.  
  28. for length in range(1, maxKeyLength + 1):
  29. possibleKeys = product(keyAlphabet, repeat=length)
  30. for k in possibleKeys:
  31. k = codesToStr(k)
  32. cipher = ARC4.new(k)
  33. recovered = cipher.decrypt(cryptogram)
  34. e = entropy(recovered)
  35.  
  36. if e < entropyThreshold:
  37. print('\nFound solution!\n')
  38. print(f'Key: {k}')
  39. print(f'Notification: {recovered}')
  40. break
  41.  
  42. print(f'No solution for key length {length}')
  43. print(e)
  44.  
  45. with open('crypto.rc4', 'rb') as file:
  46. data = file.read()
  47.  
  48. keyAlphabet = range(ord('a'), ord('z') + 1)
  49. bruteforceARC4(data, 3, keyAlphabet)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement