我和一个正在工作的人决定尝试制作一个基本的python程序,该程序会混乱一个字符串& 2)没有混乱的字符串。我们的想法是,我们可以互相发送绝对的垃圾。
我的第一次尝试(我很害怕):
x = ("This is the text")
x1 = x.replace("a","r")
x2 = x1.replace("b","w")
x3 = x2.replace("c","z") #Do this for the whole alphabet
print(x3) #both upper and lower case
然后做同样的事情,但回到前面解读....它的确有效,但它也很长...... ....
本文的代码:http://gomputor.wordpress.com/2008/09/27/search-replace-multiple-words-or-characters-with-python/建议按如下方式创建方法:
def replace_all(text,dic):
for i,j in dic.iteritems():
text = text.replace(i,j)
return text
reps = {'a':'r','b':'w','c':'z'} #for the whole alphabet again (yawn)
x = ("This is the text")
txt = replace_all(x, reps)
print(txt)
这会有用吗?我见过iteritems()在其他地方搞坏了吗?
答案 0 :(得分:2)
iteritems从字典中返回键值对的列表。注意iteritems的唯一原因是它在python 3.0中删除了,因为dict.items现在做同样的事情。
至于代码,它的功能正确(除了x应该是my_text),虽然加密强度不是很高。
有许多算法使用更简单的加密密钥方法(您的代表字典)并生成更高质量的加密。如果您在python中工作,为什么不使用像https://pypi.python.org/pypi/simple-crypt这样的简单库来获得更高质量的加密/解密?
答案 1 :(得分:2)
请滚筒鼓.....
>>> msg="The quick brown fox jumps over the lazy dog"
>>> cyphertext = ' '.join(w[1:]+'-'+w[0]+'ey' for w in msg.split())
>>> cyphertext
'he-Tey uick-qey rown-bey ox-fey umps-jey ver-oey he-tey azy-ley og-dey'
>>> ' '.join(w[-3] + w[:-4] for w in cyphertext.split())
'The quick brown fox jumps over the lazy dog'
请注意,“the”和“quick”的非标准处理以及“ey”与“ay”后缀可能存在的混淆会增强安全性。
答案 2 :(得分:2)
如果你在Python 2中工作,rot13是一个内置的编解码器:
>>> 'This is the text'.encode('rot13')
'Guvf vf gur grkg'
>>> 'Guvf vf gur grkg'.decode('rot13')
u'This is the text'
答案 3 :(得分:0)
为什么不使用string.translate
import string
tab = string.maketrans(string.ascii_letters,string.ascii_letters[13:]+string.ascii_letters[:13])
message = "hello world!"
encoded = message.translate(tab)
tab_decode = string.maketrans(string.ascii_letters[13:]+string.ascii_letters[:13],string.ascii_letters)
print encoded.translate(tab_decode)
使用string.translate,您可以定义任何您想要的映射
key = "lkj234oiu1563lop|.)(*&^%$#@!" #note key must be as long as your alphabet(in this case 52)
mapping = (string.ascii_letters,key)
tab_encode = string.maketrans(*mapping)
encoded = "hello world".translate(tab_encode)
tab_decode = string.maketrans(*list(reversed(mapping)))
decoded = encoded.translate(tab_decode)
你可以做的另一件事是base64编码(注意这不是加密,但它可能与简单的ceasar密码一样难以破解)
import base64
decoded = "Hello World!!!"
encoded = base64.b64encode(decoded)
print encoded
print base64.b64decode(encoded)
答案 4 :(得分:0)
这是一个完整的解决方案,您可以使用它来学习。您可以使用它来编码和解码消息。只需指定您要执行的操作,然后输入您的消息。一个空行表示您已完成信息并发出请求转换的信号。
import string
PLAIN_TEXT = string.ascii_letters
CIPHER_TEXT = 'kWFUsDYeAxolSLTwChgNJtaMvQIzRZVrPEyfiKXGcdBunbqHjpOm'
CIPHER_TABLE = str.maketrans(PLAIN_TEXT, CIPHER_TEXT)
PLAIN_TABLE = str.maketrans(CIPHER_TEXT, PLAIN_TEXT)
def main():
while True:
choice = input('Encode or Decode? ').lower()
if choice:
if 'encode'.startswith(choice):
process_text(CIPHER_TABLE)
continue
if 'decode'.startswith(choice):
process_text(PLAIN_TABLE)
continue
print('Please try again.')
def process_text(table):
buffer = []
while True:
line = input('> ')
if not line:
break
buffer.append(line.translate(table))
print('\n'.join(buffer))
if __name__ == '__main__':
main()
如果您想要更好的解决方案,请将Wabol Talk添加为书签并使用它来创建消息。你可以查看它的源代码,看看它也是用Python实现的。该程序对消息进行加密,并在" Wabol"中对它们进行编码。语言。如果需要,我还可以提供该程序的GUI版本。
答案 5 :(得分:0)
以下是一些基本的,非常不安全的密码,可以让它们玩得开心!顺便说一下,我在谷歌上搜索,我在Northeastern University基础密码系统上发现了一些简洁的幻灯片。另外,如果我的刻字习惯与维基或其他任何人不同,我道歉;我只是习惯了。
移位密码有一个整数环(例如字母表中的字母,A-Z,通常编号为0-25,我们通常称之为Z26)和一个整数键,我们称之为k
。为了构建这个环,我们将使用modular arithmetic,基本上意味着如果我们的模数,我们称之为n
,我们的数字将只在0到25之间。对于任何给定的明文字母,我们称之为m
,我们可以通过将k
添加到m
,模n
- 和中提琴来对其进行编码!我们有密文字母,我们称之为c
。
以数学方式表达:c ≅ m + k (mod n)
。从逻辑上讲,m ≅ c - k (mod n)
。以编程方式:
def encrypt(m, k, n):
return (m + k) % n
def decrypt(c, k, n):
return (c - k) % n
替换密码比移位密码更难破解,但使用英语的许多特性仍然很容易破解。谷歌如果你愿意 - 但我要说,一个很好的帮助你的计划是freq.c
。
替换密码由相同的环组成,具有明文字符到密文字符的映射。例如,A = G, B = Q, C = E, D = T
等等。字典对此非常好:k = {'A' : 'G', 'B' : 'Q', ...}
。如果您想解密,可以invert the dictionary。
def encrypt(m, k):
return k[m]
def decrypt(c, k):
for key, value in k.items():
if value == c: return key
此密码为移位密码添加了模块化乘法。密钥现在是一对a, b
,其中a
必须与n
相互作用,因此它具有模数乘法逆。要加密,请将m
与a
(模块化)相乘,然后添加b
(模块化)。选择一个互质的a
并不是很明显 - 基本上,你需要确保a
和n
的最大公约数为1。
数学上:c ≅ (am + b) mod n
因此m ≅ a^-1(c - b) mod n
。编程:
def encrypt(m, a, b, n):
return (a*m + b) % 25
而且我不会写一个聪明的解决方案来找到这个模乘法逆...你可以使用扩展的欧几里德算法,但对我来说,当n很小时,它更容易暴力破解。
def getModularMultiplicativeInverse(a, b, n):
for x in range(2, n):
if (a * x) % n == 1:
return x
def decrypt(c, a, b, n):
return (getModularMultiplicativeInverse(a, b, n) * (c - b)) % n
这些只是一些小例子......对于代码来说更少,对于聊天更多。