def encrypt(file): key = random.randrange(_MODULO) plaintext = load_file(file) cyphered = '' for char in plaintext: cyphered += chr((ord(char) + key) % _MODULO) write_file('cyphered.txt', cyphered)
def decrypt(file, lang=None): cyphered = load_file(file) result = '' if lang is not None: tpl, _, = calculate_offset(cyphered, lang) shift, _ = tpl for char in cyphered: result += chr((ord(char) - shift + modulo) % modulo) else: language_offsets = [] for language in languages: res, frequencies = calculate_offset(cyphered, language) if res is not None: offset, weight = res language_offsets.append(OffsetLang(language, offset, weight, frequencies)) sorted_offsets = sorted(language_offsets, key=itemgetter(OffsetLang._fields.index('weight')), reverse=True) for TING_GOES_SKRRRRA in sorted_offsets: temporary_result = '' shift = TING_GOES_SKRRRRA.offset for char in cyphered: temporary_result += chr((ord(char) - shift + modulo) % modulo) res_found = True for INDEX in range(10): if not list(TING_GOES_SKRRRRA.most_frequent.keys())[INDEX] in temporary_result: res_found = False if not res_found: continue # result += 'Language: {}\n\n'.format(sorted_offsets[current_idx].lang) # result += 'SHIFT {}\n'.format(sorted_offsets[current_idx].offset) result += temporary_result break write_file('result.txt', result)
def decrypt_alphabet_only(input): alphabet_ru = ''.join([chr(c) for c in range(1072, 1104)]) alphabet_en = ''.join([chr(c) for c in range(97, 123)]) cyphered = load_file(input) lang = 'en' if any(c for c in cyphered if c in alphabet_en) else 'ru' result = '' tpl, _ = calculate_offset(cyphered, lang, use_alphabet=True) shift, _ = tpl for char in cyphered: if char.lower() in alphabet_ru + alphabet_en: upper = char.isupper() charset = alphabet_en if char.lower() in alphabet_en else alphabet_ru decrypted_char = charset[(charset.index(char.lower()) - shift + len(charset)) % len(charset)] if upper: decrypted_char = decrypted_char.upper() result += decrypted_char else: result += char write_file('result.txt', result)
def encrypt_using_alphabeet(input, lang): if lang == 'ru': alphabet = ''.join([chr(c) for c in range(1072, 1104)]) elif lang == 'en': alphabet = ''.join([chr(c) for c in range(97, 123)]) else: raise Exception('Wrong language..') key = random.randrange(1, len(alphabet)) plaintext = load_file(input) cyphered = '' for char in plaintext: is_upper = char.isupper() if char.lower() in alphabet: encoded_char = alphabet[(alphabet.index(char.lower()) + key) % len(alphabet)] if is_upper: encoded_char = encoded_char.upper() cyphered += encoded_char else: cyphered += char write_file('cyphered.txt', cyphered)
'https://{}.wikipedia.org/w/api.php'.format(lang), params={ 'action': 'query', 'format': 'json', 'generator': 'random', 'prop': 'extracts', 'exintro': True, 'explaintext': True}).json() page = next(iter(response['query']['pages'].values())) if 'extract' in page.keys(): source = page['extract'] if len(source) > lowest_border: test_text_found = True if not test_text_found: continue helper.write_file('plain.txt', source) expected_result = helper.load_file('plain.txt') encryptor.encrypt('plain.txt') decryptor.decrypt('cyphered.txt') original_result = helper.load_file('result.txt') assert expected_result == original_result except Exception as e: if not lang in failed_languages: failed_languages.append(lang) failed_string = ' '.join(failed_languages) print() print('Border: {}'.format(lowest_border)) print('Successfully passed {:02f}% of tests. Failed for {}'.format( float((len(languages) - len(failed_languages)) / len(languages) * 100), failed_string)) if len(failed_languages) == 0: