Пользовательский алгоритм шифрования Python - PullRequest
1 голос
/ 27 февраля 2011

Эй, я работал над этим некоторое время, и я могу вспомнить, как мой брат провел меня по тому же алгоритму.

По сути, он просто добавляет значения ascii как символов ключа, так и фразы.

Я могу зашифровать это с помощью:

def encrypt(key, string):
    encoded = ''
    for i in range(len(string)):
        key_c = ord(key[i % len(key)])
        string_c = ord(string[i % len(string)])
        encoded += chr((key_c + string_c) % 127)
    return encoded

Но я не могу вспомнить, что мы сделали для расшифровки. Трудно изменить мод: P Есть идеи?

Ответы [ 3 ]

10 голосов
/ 27 февраля 2011

Все просто, посмотрим, как это работает. Прежде всего, зашифрованное сообщение получается путем вычитания ключа.

enc = msg + key (mod 127)

Как мы можем получить исходное сообщение? Это просто, вычтите ключ с обеих сторон

enc - key = msg + key - key (mod 127)

И вот мы получаем:

enc - key = msg (mod 127)

Для получения более подробной информации, пожалуйста, обратитесь к Модульная арифметика , я думаю, она должна принадлежать группе / полю / кольцу. Я не специалист по математике, для более глубоких теоретических знаний вы можете найти их в Теория чисел . Вот уточненный код:

def encrypt(key, msg):
    encryped = []
    for i, c in enumerate(msg):
        key_c = ord(key[i % len(key)])
        msg_c = ord(c)
        encryped.append(chr((msg_c + key_c) % 127))
    return ''.join(encryped)

def decrypt(key, encryped):
    msg = []
    for i, c in enumerate(encryped):
        key_c = ord(key[i % len(key)])
        enc_c = ord(c)
        msg.append(chr((enc_c - key_c) % 127))
    return ''.join(msg)

if __name__ == '__main__':
    key = 'This_is_my_awsome_secret_key'
    msg = 'Hello world'
    encrypted = encrypt(key, msg)
    decrypted = decrypt(key, encrypted)

    print 'Message:', repr(msg)
    print 'Key:', repr(key)
    print 'Encrypted:', repr(encrypted)
    print 'Decrypted:', repr(decrypted)

выход

Message: 'Hello world'
Key: 'This_is_my_awsome_secret_key'
Encrypted: '\x1dNV`O\nkO`fD'
Decrypted: 'Hello world'
2 голосов
/ 27 февраля 2011

Расшифровка такая же, за исключением минуса вместо плюса.

0 голосов
/ 27 февраля 2011

Но вам не нужно инвертировать мод, просто + key_c, верно?Так что просто добавьте 128, вычтите key_c и снова выполните по модулю 127, чтобы оставаться в диапазоне.(вместо последней строки все остальные строки такие же, как и при шифровании.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...