Last active
March 13, 2018 22:49
-
-
Save josiahholmes/b273a758a53e94fe4ae8e313ec26ee81 to your computer and use it in GitHub Desktop.
Repeating-key XOR Decryption Script
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/python | |
def bestDecryption(ciphertext): | |
bestKey = -1 | |
maxScore = -1 | |
bestPlaintext = '' | |
for val in range(256): | |
plaintext = xorDecrypt(ciphertext,val) | |
score = englishScore(plaintext) | |
if score > maxScore: | |
maxScore, bestKey, bestPlaintext = score, val, plaintext | |
return (bestKey, maxScore, bestPlaintext) | |
def xorDecrypt(ciphertext,val): | |
cipherBlocks = [ciphertext[i:i+2] for i in range(0,len(ciphertext),2)] | |
phrase = '' | |
for b in cipherBlocks: | |
phrase += chr(int(b,16) ^ val) | |
return phrase | |
def englishScore(plaintext): | |
score = 0 | |
for letter in plaintext: | |
if letter in ' ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz': | |
score += 1 | |
return float(score)/len(plaintext) | |
def main(): | |
ciphertext = '1b37373331363f78151b7f2b783431333d78397828372d363c78373e783a393b3736' | |
key, score, plaintext = bestDecryption(ciphertext) | |
print("Ciphertext =", ciphertext) | |
print("Challenge 3 Answer:") | |
print("Key =", key, "Score =", score) | |
print("Plaintext =", plaintext) | |
if __name__ == "__main__": | |
main() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
''' | |
Challenge 6 Set 1 - Break Repeating-key XOR | |
Source: http://cryptopals.com/sets/1/challenges/6 | |
''' | |
#!/usr/bin/python | |
import challenge03 | |
from binascii import b2a_hex, a2b_hex | |
from base64 import b64encode, b64decode | |
def getHamDist(string1,string2): | |
assert len(string1) == len(string2) | |
string1 = ' '.join(bin(letter)[2:].zfill(8) for letter in string1) | |
string2 = ' '.join(bin(letter)[2:].zfill(8) for letter in string2) | |
return sum(ch1 != ch2 for ch1, ch2 in zip(string1,string2)) | |
def getKeySize(ciphertext): | |
bestKey = 9999 | |
bestScore = 9999 | |
for keysize in range(2,41): | |
str1 = ciphertext[0:14*keysize] | |
str2 = ciphertext[14*keysize:2*14*keysize] | |
hamdist = getHamDist(str1,str2) | |
score = (float(hamdist) / (14*keysize)) | |
if(score < bestScore): | |
bestKey, bestScore = keysize, score | |
print("The probable keysize is", bestKey, "with a hamming distance of", bestScore) | |
return bestKey | |
def findRepeatingKey(ciphertext,keysize): | |
j = 0 | |
key = '' | |
testcipher = '' | |
transposed = [] | |
transHexLen = int((keysize/2) + 1) | |
ciphertext = [ciphertext[i:i+keysize*2] for i in range(0,len(ciphertext),keysize)] | |
for ctblock in ciphertext: | |
ctblock = [ctblock[i:i+2] for i in range(0,len(ctblock),2)] | |
transposed.append(ctblock) | |
for ctblock in transposed: | |
if len(ctblock) != transHexLen: | |
del transposed[-1] | |
for j in range(keysize): | |
for ctblock in transposed: | |
testcipher += str(ctblock[j]).strip('b').strip('\'') | |
keyChar, score, plaintext = challenge3.bestDecryption(testcipher) | |
if len(key) < keysize: | |
key += chr(keyChar) | |
testcipher = '' | |
if len(key) == keysize: | |
print("Key found! Key is:", key) | |
return key | |
def repeatingKeyXOR(ciphertext,key): | |
k, result = list(key), '' | |
ciphertext = [ciphertext[i:i+2] for i in range(0,len(ciphertext),2)] | |
for i in range(len(ciphertext)): | |
plaintext = chr(int(ciphertext[i],16) ^ ord(k[i%len(k)])) | |
result += plaintext | |
print("The plaintext is:") | |
print(result) | |
def main(): | |
with open('file06.txt') as f: | |
ciphertext = (b2a_hex(b64decode(f.read()))) | |
keysize = getKeySize(ciphertext) | |
key = findRepeatingKey(ciphertext,keysize) | |
repeatingKeyXOR(ciphertext,key) | |
if __name__ == "__main__": | |
main() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
HUIfTQsPAh9PE048GmllH0kcDk4TAQsHThsBFkU2AB4BSWQgVB0dQzNTTmVS | |
BgBHVBwNRU0HBAxTEjwMHghJGgkRTxRMIRpHKwAFHUdZEQQJAGQmB1MANxYG | |
DBoXQR0BUlQwXwAgEwoFR08SSAhFTmU+Fgk4RQYFCBpGB08fWXh+amI2DB0P | |
QQ1IBlUaGwAdQnQEHgFJGgkRAlJ6f0kASDoAGhNJGk9FSA8dDVMEOgFSGQEL | |
QRMGAEwxX1NiFQYHCQdUCxdBFBZJeTM1CxsBBQ9GB08dTnhOSCdSBAcMRVhI | |
CEEATyBUCHQLHRlJAgAOFlwAUjBpZR9JAgJUAAELB04CEFMBJhAVTQIHAh9P | |
G054MGk2UgoBCVQGBwlTTgIQUwg7EAYFSQ8PEE87ADpfRyscSWQzT1QCEFMa | |
TwUWEXQMBk0PAg4DQ1JMPU4ALwtJDQhOFw0VVB1PDhxFXigLTRkBEgcKVVN4 | |
Tk9iBgELR1MdDAAAFwoFHww6Ql5NLgFBIg4cSTRWQWI1Bk9HKn47CE8BGwFT | |
QjcEBx4MThUcDgYHKxpUKhdJGQZZVCFFVwcDBVMHMUV4LAcKQR0JUlk3TwAm | |
HQdJEwATARNFTg5JFwQ5C15NHQYEGk94dzBDADsdHE4UVBUaDE5JTwgHRTkA | |
Umc6AUETCgYAN1xGYlUKDxJTEUgsAA0ABwcXOwlSGQELQQcbE0c9GioWGgwc | |
AgcHSAtPTgsAABY9C1VNCAINGxgXRHgwaWUfSQcJABkRRU8ZAUkDDTUWF01j | |
OgkRTxVJKlZJJwFJHQYADUgRSAsWSR8KIgBSAAxOABoLUlQwW1RiGxpOCEtU | |
YiROCk8gUwY1C1IJCAACEU8QRSxORTBSHQYGTlQJC1lOBAAXRTpCUh0FDxhU | |
ZXhzLFtHJ1JbTkoNVDEAQU4bARZFOwsXTRAPRlQYE042WwAuGxoaAk5UHAoA | |
ZCYdVBZ0ChQLSQMYVAcXQTwaUy1SBQsTAAAAAAAMCggHRSQJExRJGgkGAAdH | |
MBoqER1JJ0dDFQZFRhsBAlMMIEUHHUkPDxBPH0EzXwArBkkdCFUaDEVHAQAN | |
U29lSEBAWk44G09fDXhxTi0RAk4ITlQbCk0LTx4cCjBFeCsGHEETAB1EeFZV | |
IRlFTi4AGAEORU4CEFMXPBwfCBpOAAAdHUMxVVUxUmM9ElARGgZBAg4PAQQz | |
DB4EGhoIFwoKUDFbTCsWBg0OTwEbRSonSARTBDpFFwsPCwIATxNOPBpUKhMd | |
Th5PAUgGQQBPCxYRdG87TQoPD1QbE0s9GkFiFAUXR0cdGgkADwENUwg1DhdN | |
AQsTVBgXVHYaKkg7TgNHTB0DAAA9DgQACjpFX0BJPQAZHB1OeE5PYjYMAg5M | |
FQBFKjoHDAEAcxZSAwZOBREBC0k2HQxiKwYbR0MVBkVUHBZJBwp0DRMDDk5r | |
NhoGACFVVWUeBU4MRREYRVQcFgAdQnQRHU0OCxVUAgsAK05ZLhdJZChWERpF | |
QQALSRwTMRdeTRkcABcbG0M9Gk0jGQwdR1ARGgNFDRtJeSchEVIDBhpBHQlS | |
WTdPBzAXSQ9HTBsJA0UcQUl5bw0KB0oFAkETCgYANlVXKhcbC0sAGgdFUAIO | |
ChZJdAsdTR0HDBFDUk43GkcrAAUdRyonBwpOTkJEUyo8RR8USSkOEENSSDdX | |
RSAdDRdLAA0HEAAeHQYRBDYJC00MDxVUZSFQOV1IJwYdB0dXHRwNAA9PGgMK | |
OwtTTSoBDBFPHU54W04mUhoPHgAdHEQAZGU/OjV6RSQMBwcNGA5SaTtfADsX | |
GUJHWREYSQAnSARTBjsIGwNOTgkVHRYANFNLJ1IIThVIHQYKAGQmBwcKLAwR | |
DB0HDxNPAU94Q083UhoaBkcTDRcAAgYCFkU1RQUEBwFBfjwdAChPTikBSR0T | |
TwRIEVIXBgcURTULFk0OBxMYTwFUN0oAIQAQBwkHVGIzQQAGBR8EdCwRCEkH | |
ElQcF0w0U05lUggAAwANBxAAHgoGAwkxRRMfDE4DARYbTn8aKmUxCBsURVQf | |
DVlOGwEWRTIXFwwCHUEVHRcAMlVDKRsHSUdMHQMAAC0dCAkcdCIeGAxOazkA | |
BEk2HQAjHA1OAFIbBxNJAEhJBxctDBwKSRoOVBwbTj8aQS4dBwlHKjUECQAa | |
BxscEDMNUhkBC0ETBxdULFUAJQAGARFJGk9FVAYGGlMNMRcXTRoBDxNPeG43 | |
TQA7HRxJFUVUCQhBFAoNUwctRQYFDE43PT9SUDdJUydcSWRtcwANFVAHAU5T | |
FjtFGgwbCkEYBhlFeFsABRcbAwZOVCYEWgdPYyARNRcGAQwKQRYWUlQwXwAg | |
ExoLFAAcARFUBwFOUwImCgcDDU5rIAcXUj0dU2IcBk4TUh0YFUkASEkcC3QI | |
GwMMQkE9SB8AMk9TNlIOCxNUHQZCAAoAHh1FXjYCDBsFABkOBkk7FgALVQRO | |
D0EaDwxOSU8dGgI8EVIBAAUEVA5SRjlUQTYbCk5teRsdRVQcDhkDADBFHwhJ | |
AQ8XClJBNl4AC1IdBghVEwARABoHCAdFXjwdGEkDCBMHBgAwW1YnUgAaRyon | |
B0VTGgoZUwE7EhxNCAAFVAMXTjwaTSdSEAESUlQNBFJOZU5LXHQMHE0EF0EA | |
Bh9FeRp5LQdFTkAZREgMU04CEFMcMQQAQ0lkay0ABwcqXwA1FwgFAk4dBkIA | |
CA4aB0l0PD1MSQ8PEE87ADtbTmIGDAILAB0cRSo3ABwBRTYKFhROHUETCgZU | |
MVQHYhoGGksABwdJAB0ASTpFNwQcTRoDBBgDUkksGioRHUkKCE5THEVCC08E | |
EgF0BBwJSQoOGkgGADpfADETDU5tBzcJEFMLTx0bAHQJCx8ADRJUDRdMN1RH | |
YgYGTi5jMURFeQEaSRAEOkURDAUCQRkKUmQ5XgBIKwYbQFIRSBVJGgwBGgtz | |
RRNNDwcVWE8BT3hJVCcCSQwGQx9IBE4KTwwdASEXF01jIgQATwZIPRpXKwYK | |
BkdEGwsRTxxDSToGMUlSCQZOFRwKUkQ5VEMnUh0BR0MBGgAAZDwGUwY7CBdN | |
HB5BFwMdUz0aQSwWSQoITlMcRUILTxoCEDUXF01jNw4BTwVBNlRBYhAIGhNM | |
EUgIRU5CRFMkOhwGBAQLTVQOHFkvUkUwF0lkbXkbHUVUBgAcFA0gRQYFCBpB | |
PU8FQSsaVycTAkJHYhsRSQAXABxUFzFFFggICkEDHR1OPxoqER1JDQhNEUgK | |
TkJPDAUAJhwQAg0XQRUBFgArU04lUh0GDlNUGwpOCU9jeTY1HFJARE4xGA4L | |
ACxSQTZSDxsJSw1ICFUdBgpTNjUcXk0OAUEDBxtUPRpCLQtFTgBPVB8NSRoK | |
SREKLUUVAklkERgOCwAsUkE2Ug8bCUsNSAhVHQYKUyI7RQUFABoEVA0dWXQa | |
Ry1SHgYOVBFIB08XQ0kUCnRvPgwQTgUbGBwAOVREYhAGAQBJEUgETgpPGR8E | |
LUUGBQgaQRIaHEshGk03AQANR1QdBAkAFwAcUwE9AFxNY2QxGA4LACxSQTZS | |
DxsJSw1ICFUdBgpTJjsIF00GAE1ULB1NPRpPLF5JAgJUVAUAAAYKCAFFXjUe | |
DBBOFRwOBgA+T04pC0kDElMdC0VXBgYdFkU2CgtNEAEUVBwTWXhTVG5SGg8e | |
AB0cRSo+AwgKRSANExlJCBQaBAsANU9TKxFJL0dMHRwRTAtPBRwQMAAATQcB | |
FlRlIkw5QwA2GggaR0YBBg5ZTgIcAAw3SVIaAQcVEU8QTyEaYy0fDE4ITlhI | |
Jk8DCkkcC3hFMQIEC0EbAVIqCFZBO1IdBgZUVA4QTgUWSR4QJwwRTWM= |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment