0

我正在尝试在 python 中创建一个“加密器”,通过“密钥”文件更改字符串中的所有内容。

代码:

alphabet = "abcdefghijklmnopqrstuvwxyz0123456789"
alphabet = list(alphabet)
cryptkey = open("cryptkey", "r")
key = cryptkey.read(36)

text = list(key)
tocrypt = open("tocrypt.txt", "r")    
tocryptvar = tocrypt.read()
tocryptvar = tocryptvar.lower()
################################################    Replacement
tocryptvar = tocryptvar.replace("a", key[0]).replace("b", key[1]).replace("c", key[2]) #etc

关键只是字母表和数字打乱并放在一个文件中。所以,我的问题是,当说 A 被替换为说 B 都很好,但随后它改变 B 说 G,然后 A 变成了 G。就是这样。

4

4 回答 4

3

更好的方法是将您的密钥设置为字典,然后通过循环替换纯文本:

key = {}
key['a'] = '4' # here '4' is your replacement

plain = 'hello there'
cryptext = ''.join(key.get(i, i) for i in plain)

这是测试它的快速方法

import string
import random

letters = list(string.ascii_letters+string.digits)
random.shuffle(letters)

# This creates a random key for each letter, a simple
# substitution
key = {v:letters[i] for i,v in enumerate(string.ascii_letters+string.digits)}

plain_string = 'hello world'
cryptext = ''.join(key.get(i,i) for i in plain_string)

输出类似于'fLXXc ocMXg'

顺便说一句,string.ascii_letters是整个字母表(包括大写字母)并且string.digits是数字 0 到 9

于 2013-08-11T18:43:46.153 回答
2

这应该可以解决问题:

import string as str_module

alphabet = "abcdefghijklmnopqrstuvwxyz0123456789"
key = None
with open("cryptkey", "r") as f:
    key = f.read(36)

tocryptvar = None
with open("tocrypt.txt", "r") as f:
    tocryptvar = f.read().lower()

trans_table = str_module.maketrans(alphabet, key)

tocryptvar = tocryptvar.translate(trans_table)

alphabet是要使用键翻译key的字符串,是对应的字符alphabet将被翻译成的字符串。string.maketrans()创建一个从alphabetto的翻译字符串key,并tocryptvar.translate(trans_table)使用翻译表翻译该字符串(不在其中的字符alphabet保持不变)。

于 2013-08-11T18:46:28.870 回答
0

您可以简单地遍历字符串的每个字符,并用它们的替换单独替换它们。

于 2013-08-11T18:40:47.750 回答
0
alphabet = list("abcdefghijklmnopqrstuvwxyz0123456789")
key = list(open("cryptkey", "r").read(36))
mapping=dict(zip(alphabet,key))

tocryptvar = open("tocrypt.txt", "r").read().lower()
cryptedval=''.join([mapping[k] for k in tocryptvar])
于 2013-08-11T18:55:10.043 回答