我正在尝试在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。就是这样。
答案 0 :(得分:3)
更好的方法是将密钥设置为字典,然后通过循环替换纯文本:
key = {}
key['a'] = '4' # here '4' is your replacement
plain = 'hello there'
cryptext = ''.join(key[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
答案 1 :(得分:1)
这应该可以解决问题:
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()
创建了从alphabet
到key
的翻译字符串,tocryptvar.translate(trans_table)
使用翻译表翻译字符串(不在alphabet
中的字符保持不变)。
答案 2 :(得分:0)
您可以简单地遍历字符串的每个字符,并用它们的替换单独替换它们。
答案 3 :(得分: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])