parent
93330c59fb
commit
8af42b5f08
@ -0,0 +1,75 @@
|
||||
import requests
|
||||
from binascii import unhexlify
|
||||
|
||||
|
||||
# convert that to int, since we're gonna be xoring it
|
||||
def hexToIntConversion(hexString):
|
||||
'''use like "hexToIntConversion(given)"
|
||||
'''
|
||||
converedBytes = unhexlify(hexString)
|
||||
return converedBytes
|
||||
|
||||
|
||||
# xor new int with all possible ascii codes
|
||||
def xorIntAgainstAllAsciiCodes(convertedBytes):
|
||||
'''use like "print(xorIntAgainstAllAsciiCodes(hexToIntConversion(given)))"
|
||||
'''
|
||||
possibleAnswers = {}
|
||||
for possibleKey in range(256):
|
||||
possibleAnswers[possibleKey] = ''.join(chr(byte ^ possibleKey) for byte in convertedBytes)
|
||||
|
||||
return possibleAnswers
|
||||
|
||||
# ok great, you have the data you need, now you have to *weigh* the data you have
|
||||
def weighPossibleAnswers(possibleAnswers):
|
||||
freqs = {
|
||||
'a': 0.0651738, 'b': 0.0124248,'c': 0.0217339,
|
||||
'd': 0.0349835,'e': 0.1041442,'f': 0.0197881,
|
||||
'g': 0.0158610,'h': 0.0492888,'i': 0.0558094,
|
||||
'j': 0.0009033,'k': 0.0050529,'l': 0.0331490,
|
||||
'm': 0.0202124,'n': 0.0564513,'o': 0.0596302,
|
||||
'p': 0.0137645,'q': 0.0008606,'r': 0.0497563,
|
||||
's': 0.0515760,'t': 0.0729357,'u': 0.0225134,
|
||||
'v': 0.0082903,'w': 0.0171272,'x': 0.0013692,
|
||||
'y': 0.0145984,'z': 0.0007836,' ': 0.1918182
|
||||
}
|
||||
|
||||
scoredAnswers = {}
|
||||
|
||||
for answer in possibleAnswers.values():
|
||||
scoredAnswers[answer] = 0
|
||||
for letter in answer:
|
||||
if letter in freqs.keys():
|
||||
scoredAnswers[answer] += freqs[letter]
|
||||
|
||||
return scoredAnswers
|
||||
|
||||
def rateWeighedAnswers(scoredAnswers):
|
||||
mostLikelyAnswer = max(scoredAnswers.values())
|
||||
ratedAndWeighedAnswers = {}
|
||||
|
||||
for key,value in scoredAnswers.items():
|
||||
if value == mostLikelyAnswer:
|
||||
ratedAndWeighedAnswers[key] = value
|
||||
|
||||
return ratedAndWeighedAnswers
|
||||
|
||||
|
||||
def main():
|
||||
# what do we start with?
|
||||
# get the list of strings (each string is 60 characters)
|
||||
request = requests.get('https://cryptopals.com/static/challenge-data/4.txt')
|
||||
requestArray = request.text.splitlines()
|
||||
|
||||
ratedDataTable = {}
|
||||
for eachRequest in requestArray:
|
||||
byteConversion = hexToIntConversion(eachRequest)
|
||||
xoredData = xorIntAgainstAllAsciiCodes(byteConversion)
|
||||
ratedData = rateWeighedAnswers(weighPossibleAnswers(xoredData))
|
||||
|
||||
for data in ratedData:
|
||||
ratedDataTable
|
||||
print(sorted(ratedData))
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
Loading…
Reference in new issue