Python - 非常基本的'加密器'

时间:2013-06-28 16:12:21

标签: python string replace

我和一个正在工作的人决定尝试制作一个基本的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()在其他地方搞坏了吗?

6 个答案:

答案 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'

http://docs.python.org/2/library/codecs.html

答案 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基础密码系统上发现了一些简洁的幻灯片。另外,如果我的刻字习惯与维基或其他任何人不同,我道歉;我只是习惯了。

Shift Cipher

移位密码有一个整数环(例如字母表中的字母,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

Affine Cipher

此密码为移位密码添加了模块化乘法。密钥现在是一对a, b,其中a必须与n相互作用,因此它具有模数乘法逆。要加密,请将ma(模块化)相乘,然后添加b(模块化)。选择一个互质的a并不是很明显 - 基本上,你需要确保an的最大公约数为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

这些只是一些小例子......对于代码来说更少,对于聊天更多。