我正在尝试同时学习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
所以我想再次解密,除了在解密之前修改了密文("编码")。
谢谢。
我能想到的在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)
上面的函数改编自这个堆栈溢出答案。