如何用数字替换字母并随时重新转换(凯撒密码)?

How to replace letters with numbers and re-convert at anytime (Caesar cipher)?

我已经为此编写了将近 2 天的代码,但无法理解。我编码了两个不同的位试图找到它。

代码#1 所以这个会列出字母但不会将其更改为数字 (a->1, b->2, ect)

import re
text = input('Write Something- ')
word = '{}'.format(text)
for letter in word:
    print(letter)
    #lists down

Outcome-
Write something- test
t
e
s
t

然后我有了将字母转换为数字的代码,但我无法将其转换回字母。 代码 #2

u = input('Write Something')
a = ord(u[-1])
print(a)
#converts to number and prints ^^
enter code here
print('')
print(????)
#need to convert from numbers back to letters.

Outcome:
Write Something- test
116

如何通过 (test) 发送文本并将其转换为设定数字 (a->1, b->2) 或随机数,将其保存到 .txt 文件并能够随时回去看?

只需使用dictionary:

 letters = {'a': 1, 'b': 2, ... }

在循环中:

for letter in word:
    print(letters[letter])

你在这里试图实现的目标是 "caesar encryption"。

例如,您通常会说:A=1、a=2、B=3、B=4 等...

那么你会有一个 "key" 其中 "shifts" 个字母。假设密钥是“3”,那么您会将所有字母向上移动 3 个数字,最终得到:A=4、a=5、B=6、b=7 等...

这当然只是进行凯撒加密的一种方式。这是最基本的例子。你也可以说你的密钥是 "G",这会给你:

A=G、a=g、B=H、b=h 等。或
A=G, a=H, B=I, b=J, 等等...

希望你明白我在说什么。同样,这只是一种非常简单的示例方法。

现在,您需要为您的 program/script 定义此密钥。如果密钥应该是可变的,则需要将其保存在某个地方(写下来)。将你的单词放入一个字符串中,检查并转换每个字母并将其写入一个新的字符串中。

然后你可以说(伪代码!):

var key = READKEYFROMFILE;
string old = READKEYFROMFILE_OR_JUST_A_NORMAL_STRING_:)
string new = "";

for (int i=0, i<old.length, i++){
get the string at i;
compare with your "key";
shift it;
write it in new;
}

希望能帮到你

编辑:

您也可以使用字典(如其他答案所说),但这是一种非常静态(但简单)的方法。

此外,也许可以看一些 guides/tutorials 编程方面的内容。你似乎没有那么有经验。而且,google "Caesar encryption" 可以更好地理解这个主题(非常有趣)。

编辑2:

好的,基本上是这样:

你有一个变量,在这个变量中叫做"key",你存储你的密钥(你明白我上面写的密钥和东西了吗?)

然后您有一个字符串变量,称为 "old"。还有一个叫做 "new"。

在旧版本中,您编写要转换的字符串。 New 现在将是空的。

然后您执行 "for loop",它与 "old" 字符串的“.length”一样长。 (这意味着如果你的句子有 15 个字母,循环将自己进行 15 次并且总是计算小 "i" 变量(从 for 循环)。

然后您需要尝试从 "old" 中获取字母(并将其简短地保存在另一个变量中,例如 char temp = "" )。

在此之后,您需要比较当前的字母并决定如何移动它。 如果完成了,只需将转换后的字母添加到 "new" 字符串中。

这是一些更精确的伪代码(它不是 python 代码,我不太了解 python),顺便说一句,char 代表 "character"(字母):

var key = g;
string old =  "teststring";
string new = "";
char oldchar = "";
char newchar = "";

for (int i=0; i<old.length; i++){
oldchar = old.charAt[i];
newchar = oldchar //shift here!!!
new.addChar(newchar);
}

希望能帮到你 ;)

edit3:

也许也看看这个:

https://inventwithpython.com/chapter14.html

Caesar Cipher Function in Python

https://www.youtube.com/watch?v=WXIHuQU6Vrs

要转换为符号代码并返回字符:

text = input('Write Something')
for t in text:
    d = ord(t)
    n = chr(d)

    print(t,d,n)

写入文件:

f = open("a.txt", "w")
f.write("someline\n")
f.close()

从文件中读取行:

f = open("a.txt", "r")
lines = f.readlines()

for line in lines:
    print(line, end='')  # all lines have newline character at the end

f.close()

请参阅 Python 3 的文档:https://docs.python.org/3/

这里有几个例子。我的方法涉及将字符映射到用零填充的整数的字符串表示形式,因此使用 str.zfill.

长度为 3 个字符

例如0 -> '000', 42 -> '042', 125 -> '125'

这使得将一串数字转换回字符变得更加容易,因为它将包含很多 3

例子

from string import printable
#'0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&\'()*+,-./:;<=>?@[\]^_`{|}~ \t\n\r\x0b\x0c'
from random import sample

# Option 1
char_to_num_dict = {key : str(val).zfill(3) for key, val in zip(printable, sample(range(1000), len(printable))) }

# Option 2
char_to_num_dict = {key : str(val).zfill(3) for key, val in zip(printable, range(len(printable))) }

# Reverse mapping - applies to both options
num_to_char_dict = {char_to_num_dict[key] : key for key in char_to_num_dict }

这里有两组字典,用于将字符映射到数字。第一个选项使用随机数,例如 'a' = '042', 'b' = '756', 'c' = '000' 问题是您可以使用它一次,关闭程序,然后下一次映射肯定不会匹配。如果你想使用随机值,那么你需要将字典保存到一个文件中,这样你就可以打开并获取密钥。

第二个选项创建一个字典,将字符映射到数字并保持顺序。所以它每次都会遵循'a' = '010', 'b' = '011', 'c' = '012'这样的顺序。

现在我已经解释了这里的映射选择是函数之间的转换

def text_to_num(s):
    return ''.join( char_to_num_dict.get(char, '') for char in s )

def num_to_text(s):
    slices = [ s[ i : i + 3 ] for i in range(0, len(s), 3) ]
    return ''.join( num_to_char_dict.get(char, '') for char in slices )

使用示例(带有选项 2 字典)

>>> text_to_num('Hello World!')
'043014021021024094058024027021013062'
>>> num_to_text('043014021021024094058024027021013062')
'Hello World!'

最后,如果你不想使用字典,那么你可以使用 ordchr 仍然保持用零填充数字的方法

def text_to_num2(s):
    return ''.join( str(ord(char)).zfill(3) for char in s )

def num_to_text2(s):
    slices = [ s[ i : i + 3] for i in range(0, len(s), 3) ]
    return ''.join( chr(int(val)) for val in slices )

使用示例

>>> text_to_num2('Hello World!')
'072101108108111032087111114108100033'
>>> num_to_text2('072101108108111032087111114108100033')
'Hello World!'