def breakNull(ciphertext): # The program needs to try keys of length 1 (such as '5'), of length 2 (such as '5 5'), and so on up to length MAX_KEY_LENGTH. # This is because the key '1 0' will decrypt differently than '1 0 0'. for trialKeyLength in range(1, MAX_KEY_LENGTH + 1): # We will be using the "list of int values" for of keys. The string form like '4 2 3' that we use in the original encryption program is used just because it makes it easier to type for the user. # We use list replication (multiplying a list value by an int value) to get the starting key. trialKey = [0] * trialKeyLength trialKey = getNextKey(trialKey) while trialKey != [0] * trialKeyLength: decryptedText = nullCipher.decryptMessage(ciphertext, trialKey) percentEnglish = round(transpositionBreaker.getEnglishCount(decryptedText) * 100, 2) if percentEnglish > 0: print('Key %s decrypts to %s%% English.' % (trialKey, percentEnglish)) if percentEnglish >= 25: print() print('Possible encryption break:') print('Key ' + str(trialKey) + ': ' + decryptedText[:100]) print() print('Enter D for done, or just press Enter to continue breaking:') response = input('> ') if response.upper().startswith('D'): return decryptedText trialKey = getNextKey(trialKey) print('No decryptions found. Code breaking has failed.') return None
def hackNull(ciphertext): # The program needs to try keys of length 1 (such as '5'), of length 2 # (such as '5 3'), and so on up to length MAX_KEY_DIGITS. for keyLength in range(1, MAX_KEY_DIGITS + 1): for keyParts in itertools.product(range(MAX_KEY_NUMBER + 1), repeat=keyLength): key = [] for digit in keyParts: key.append(str(digit)) key = ''.join(key) decryptedText = nullCipher.decryptMessage(key, ciphertext) if not SILENT_MODE: print('Key %s: %s' % (key, decryptedText[:40])) if detectEnglish.isEnglish(decryptedText): print() print('Possible encryption hack:') print('Key: %s' % (key)) print('Decrypted message: ' + decryptedText[:200]) print() print('Enter D for done, or just press Enter to continue hacking:') response = input('> ') if response.strip().upper().startswith('D'): return decryptedText return None # failed to hack encryption
def hackNull(ciphertext): # The program needs to try keys of length 1 (such as '5'), of length 2 # (such as '5 3'), and so on up to length MAX_KEY_DIGITS. for keyLength in range(1, MAX_KEY_DIGITS + 1): for keyParts in itertools.product(range(MAX_KEY_NUMBER + 1), repeat=keyLength): key = [] for digit in keyParts: key.append(str(digit)) key = ''.join(key) decryptedText = nullCipher.decryptMessage(key, ciphertext) if not SILENT_MODE: print('Key %s: %s' % (key, decryptedText[:40])) if detectEnglish.isEnglish(decryptedText): print() print('Possible encryption hack:') print('Key: %s' % (key)) print('Decrypted message: ' + decryptedText[:200]) print() print( 'Enter D for done, or just press Enter to continue hacking:' ) response = input('> ') if response.strip().upper().startswith('D'): return decryptedText return None # failed to hack encryption