2016-02-21 2 views
2

Я пытаюсь одновременно изучать питон и криптографию.Как изменить зашифрованный текст в python?

Я пытаюсь изменить текст шифрования немного (или больше), чтобы увидеть эффект, который он мог бы иметь на моем открытом тексте при расшифровке.

Например:

from Crypto.Cipher import AES 
import base64 
import os 

BLOCK_SIZE = 16 
key = os.urandom(BLOCK_SIZE) 

PADDING = '{' 
pad = lambda s: s + (BLOCK_SIZE - len(s) % BLOCK_SIZE) * PADDING 

EncodeAES = lambda c, s: base64.b64encode(c.encrypt(pad(s))) 
DecodeAES = lambda c, e: c.decrypt(base64.b64decode(e)).rstrip(PADDING) 

cipher = AES.new(key) 

# encode a string 
encoded = EncodeAES(cipher, 'This is some text.') 
print 'Encrypted string:', encoded 

# decode the encoded string 
decoded = DecodeAES(cipher, encoded) 
print 'Decrypted string:', decoded 

Так что я снова хочу расшифровывать, за исключением того, модифицировали шифрованный текст («закодированный») перед дешифрования.

Спасибо.

+0

Это уже небезопасно. Он использует генератор случайных чисел ОС, который может быть недостаточно высоким для криптографии. –

+0

@CrazyPython urandom отлично подходит для криптографии (по крайней мере, на Linux). –

+0

@ T.J. Добро пожаловать в переполнение стека! Каков ваш реальный вопрос? Вы просто хотите изменить «закодированный», прежде чем использовать «DecodeAES()», и задаетесь вопросом, какой лучший подход к этому может быть? – mech

ответ

0

Самый простой способ, которым я могу представить введение шума в строку encoded, - это изменить каждый n-й символ в нем. Вы можете играть со строковыми манипуляциями, чтобы ввести более или менее случайный шум (сделать n-й случайным символом, изменить его на каждой итерации и т. Д.).

Добавьте эту функцию и импорта где-то перед кодом:

import string 
import random 

def noise_every_n(input, n, first=0): 
    output = "" 
    for i, c in enumerate(input, -first): 
     if i % n == 0: # using ascii_letters and digits is just what came to mind, there's other ways to get random characters. 
      output += random.choice(string.ascii_letters + string.digits) 
     else: 
      output += c 
    return output 

Затем вызовите следующую между encode и decode:

every_n = random.randint(3, 5) # or just set it to a small integer 
encoded = noise_every_n(encoded, every_n) 

функция выше была заимствована из this Stack Overflow answer.

Смежные вопросы