1

我和一个正在工作的人决定尝试制作一个基本的 Python 程序,该程序将 1) 使字符串混乱 & 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

然后做同样的事情,但从前到后解读....它有效,但它也是 longggggg....

本文中的代码: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)

这行得通吗?我已经看到 ititems() 在其他地方得到了不好的报道??

4

6 回答 6

2

iteritems 从字典中返回一个键值对列表。注意 iteritems 的唯一原因是它在 python 3.0 中被删除,因为 dict.items 现在做同样的事情。

至于代码,它在功能上是正确的(除了 x 应该是 my_text),虽然加密强度不是很高。

有许多算法使用更简单的加密密钥方法(您的 reps 字典)并产生更高质量的加密。如果您在 python 中工作,为什么不使用像https://pypi.python.org/pypi/simple-crypt这样的简单库来获得更高质量的加密/解密?

于 2013-06-28T16:22:40.493 回答
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”后缀的可能混淆增强了安全性。

于 2013-06-28T16:58:51.853 回答
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

于 2013-06-28T17:13:20.873 回答
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 版本。

于 2013-06-28T19:26:53.860 回答
0

这里有一些基本的,非常不安全的密码,可以玩得开心!顺便说一句,我在谷歌上搜索,发现了一些来自东北大学的关于基本密码系统的简洁幻灯片。另外,如果我的字体习惯与 wiki 或其他任何人不同,我深表歉意;我只是按照我的习惯去做。

移位密码

移位密码有一个整数环(例如字母表中的字母 AZ,编号通常为 0-25,我们通常称之为 Z26)和一个整数密钥,我们称之为k。为了构建这个环,我们将使用模算术,基本上意味着如果我们的模数,我们称之为n26,我们的数字将永远在 0 到 25 之间。)对于任何给定的明文字母,我们称之为它m,我们可以编码它通过添加kmn- 和中提琴!我们有我们的密文字母,我们称之为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

替换密码

替换密码比移位密码更难破解,但使用英语语言的许多特征仍然很容易破解。如果您愿意,请在 Google 上搜索 - 但我得说,一个可以帮助您的好程序是freq.c.

替换密码由相同的环组成,具有明文字符到密文字符的映射。比如,A = G, B = Q, C = E, D = T等等。一本字典真的很适合这个:k = {'A' : 'G', 'B' : 'Q', ...}. 如果要解密,可以反转字典

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,因此它具有模乘逆。要加密,乘以ma模数)然后相加b(模数)。选择互质的不是很明显 - 基本上,您需要确保and的a最大公约数是 1。an

数学上: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

这些只是一些小例子……更少的代码,更多的喋喋不休。

于 2013-06-29T01:39:51.917 回答
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 编码(注意这不是加密,但它可能与简单的凯撒密码一样难以破解)

import base64
decoded = "Hello World!!!"
encoded = base64.b64encode(decoded)
print encoded
print base64.b64decode(encoded)
于 2013-06-28T16:16:19.613 回答