多码加密 vigenere算法 python 实现

来源:互联网 发布:怎样查看淘宝销售数据 编辑:程序博客网 时间:2024/04/28 23:14

转自:http://blog.csdn.net/woshiaotian/article/details/18038391

基于我自己对 vigenere 的理解,另外vigenere 属于非常弱的一种加密,用于生产环境不是非常安全请注意

[python] view plaincopy在CODE上查看代码片派生到我的代码片
  1. # -*- coding:utf-8 -*-  
  2. ##################################  
  3. # Vigenere 是一种多码加密法  
  4. # author vearne  
  5. # ***注意***:  
  6. # 1) 字母表中必须要包含明文中出现的字母  
  7. # 2) 密钥不能为空  
  8.   
  9. ##################################  
  10. class Vigenere(object):  
  11.     def __init__(self, table='0123456789', key='apple'):  
  12.         # 字母表  
  13.         self.table = table  
  14.         # 密钥  
  15.         self.key = key  
  16.           
  17.     def genNum(self, curr):  
  18.         if curr + 1 >= len(self.key):  
  19.             return 0  
  20.         else:  
  21.             return curr + 1  
  22.               
  23.     def dict(self, chr, move):  
  24.         index = self.table.index(chr)  
  25.         return self.table[(index + move) % len(self.table)]  
  26.        
  27.     def encrypt(self, cleartext):  
  28.         # i 指向明文, j 指向密钥  
  29.         j = 0  
  30.         ll = []  
  31.         for i in range(len(cleartext)):  
  32.             move = ord(self.key[j]) % len(self.table)  
  33. #            print 'move', move  
  34.             new_chr = self.dict(cleartext[i], move)  
  35.             ll.append(new_chr)  
  36.             j = self.genNum(j)  
  37.         return ''.join(ll)  
  38.               
  39.     def decrypt(self, ciphertext):  
  40.         # i 指向密文, j 指向密钥  
  41.         j = 0  
  42.         ll = []  
  43.         for i in range(len(ciphertext)):  
  44.             move = ord(self.key[j]) % len(self.table)  
  45.             move = move * (-1)  
  46. #            print 'move', move  
  47.             new_chr = self.dict(ciphertext[i], move)  
  48.             ll.append(new_chr)  
  49.             j = self.genNum(j)  
  50.         return ''.join(ll)  
  51.           
  52. if __name__ == '__main__':  
  53.     v = Vigenere(key='apple077226')  
  54.     cleartext = '000000668'  
  55.     print cleartext  
  56.     ciphertext = v.encrypt(cleartext)  
  57.     print ciphertext  
  58.     print '----------------------------------'  
  59.     cleartext = v.decrypt(ciphertext)  
  60.     print cleartext  


如果字母表中的字母出现不重复,则可以保证明文跟密文的一一映射,如果出现重复,则会出现明文跟密文的多对一映射。

打乱字母表中字母的顺序,可以使密文更具有欺骗性。


0 0
原创粉丝点击