【问题标题】:Python - VERY basic 'encryptor'Python - 非常基本的“加密器”
【发布时间】:2013-06-28 16:12:20
【问题描述】:

我和一个正在工作的人决定尝试制作一个基本的 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)

这行得通吗?我在其他地方看到过 iteritems() 的负面报道??

【问题讨论】:

  • 你从哪里读到关于iteritems()的坏消息?没关系。另外,我不太了解您的问题-您没有尝试过您的代码吗?为什么不知道它是否有效?
  • 查看string.translate
  • 假设情况:您的加密器将 A 替换为 B,将 B 替换为 C。然后“ABBA”转换为“CCCC”,而“BABA”转换为“CCCC” .您的解密器将无法区分两者!
  • @PauloScardine 实际上 所有 的字母都必须移动才能成为凯撒密码
  • 这称为substitution cipher,根据字母频率很容易破解。

标签: python string replace


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢!我是编程新手,所以这是一个很大的帮助。它的加密方面不一定重要。它刚开始是基于“我们可以通过工作相互发送电子邮件而 IT 人员不会监视我们吗”的对话。一个半心半意的建议变成了一个坚实的周五下午的胡闹!我也编辑了代码,应该是 x 而不是 my_text
  • 答案已更新。有许多可用于 python 的简单易用的加密库。我已经包含了一个链接,它会为您省去很多麻烦。
  • 如果你想稍微弄乱 IT 人员的头脑,只需向后发送随机字符串数据。
  • @dansalmo:他不想惹他们,他想进行半安全的通信。不过,就您而言,在实际消息中发送随机噪声消息肯定会提高安全性。
  • 如果 IT 人员甚至正在阅读您的消息,那么他们很有可能能够解密您的消息(替代密码对于六岁的孩子来说并不安全)。但是现在您知道这一点,而 IT 人员不知道您知道这一点,因此您仍然有一个很好的方法来惹他们。
【解决方案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】:

    请打鼓……

    >>> 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”后缀的可能混淆增强了安全性。

    【讨论】:

      【解决方案4】:

      为什么不使用 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)
      

      【讨论】:

      • 抱歉,有点匆忙。不幸的是,我仍在工作,所以所有内容都记在了纸上和记事本上。凯文对不起,他们只是一个例子,我有一组“正确”键:值的设置蒂姆:我早些时候在论坛上看到了一些东西,有人希望它会从未来的版本中删除(我认为评论是旧的)
      • 将转换转换为大写
      • 就在这种情况下......关键是你可以使用你想要的任何映射与翻译
      • 但它必须翻译回原文。 1) 打乱一个字符串 & 2) 解开这个字符串。
      【解决方案5】:

      这是一个完整的解决方案,您可以从中学习。您可以使用它对消息进行编码和解码。只需指定您想要做什么,然后输入您的消息。空白行表示您已完成消息和信号,以进行请求的转换。

      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 版本。

      【讨论】:

        【解决方案6】:

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

        移位密码

        移位密码有一个整数环(例如,字母表中的字母 A-Z,编号通常为 0-25,我们通常称之为 Z26)和一个整数密钥,我们称之为 k。为了构建这个环,我们将使用modular arithmetic,这基本上意味着如果我们的模数(我们称之为n)是26,我们的数字只会在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
        

        替换密码

        替换密码比移位密码更难破解,但使用英语语言的许多特征仍然很容易破解。如果您愿意,请在 Google 上搜索 - 但我得说,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 互质,因此它具有模乘逆。要加密,请将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
        

        这些只是一些小例子......代码较少,喋喋不休。

        【讨论】:

        • 谢谢!这些幻灯片也很有趣。一开始只是一个半心半意的办公室笑话,现在变成了一种痴迷
        猜你喜欢
        • 1970-01-01
        • 2014-04-13
        • 2017-08-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多