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

时间:2016-07-20 07:12:26

标签: python python-3.x caesar-cipher

我已经编写了近2天的编码,但是无法得到它。我试图找到两个不同的位。

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

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

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

4 个答案:

答案 0 :(得分:0)

只需使用dictionary

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

在循环中:

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

答案 1 :(得分:0)

您在此尝试实现的目标称为" caesar encryption"。

例如,您可以说:A = 1,a = 2,B = 3,B = 4等......

那么你会有一个"键"哪个"转移"这些信。让我们说关键是" 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等......

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

现在,对于您的程序/脚本,您需要定义此密钥。如果密钥应该是可变的,则需要将其保存在某处(将其写下来)。把你的单词放在一个字符串中,检查并转换每个字母并将其写入一个新的字符串。

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

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;
}

希望我能帮到你。

编辑:

你也可以使用字典(就像其他答案所说的那样),但这是一种非常静态(但很容易)的方式。

另外,也许可以观看有关编程的一些指南/教程。你似乎没有经验。此外,谷歌&#34;凯撒加密&#34;更好地理解这个主题(非常有趣)。

EDIT2:

好的,基本上是这样的:

你有一个变量,名为&#34; key&#34;在这个变量中,你存储你的密钥(你理解我上面写的密钥和东西?)

然后你有一个字符串变量,名为&#34; old&#34;。还有一个名叫&#34; new&#34;。

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

然后你做一个&#34; for循环&#34;,这就像&#34; .length&#34;你老了&#34;串。 (这意味着如果你的句子有15个字母,那么循环将经历15次,并且总是计算小的&#34; i&#34;变量(来自for循环)。

然后你需要尝试从#34; old&#34; (并将其保存在另一个可用的中,例如char temp = "")。

在此之后,您需要比较当前的字母并决定如何移动它。 如果这样做,只需将转换后的字母添加到&#34; new&#34;串。

这是一些更精确的伪代码(它不是python代码,我不熟悉python),btw char代表&#34;字符&#34; (字母):

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

答案 2 :(得分:0)

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

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/

答案 3 :(得分:0)

以下是几个例子。我的方法涉及将字符映射到用零填充的整数的字符串表示,因此使用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!'