Fork me on GitHub

版权声明 本站原创文章 由 萌叔 发表
转载请注明 萌叔 | https://vearne.cc

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

# -*- coding:utf-8 -*-  
##################################  
# Vigenere 是一种多码加密法  
# author vearne  
# ***注意***:  
# 1) 字母表中必须要包含明文中出现的字母  
# 2) 密钥不能为空  
#   
##################################  
class Vigenere(object):  
    def __init__(self, table='0123456789', key='apple'):  
        # 字母表  
        self.table = table  
        # 密钥  
        self.key = key  

    def genNum(self, curr):  
        if curr + 1 >= len(self.key):  
            return 0  
        else:  
            return curr + 1  

    def dict(self, chr, move):  
        index = self.table.index(chr)  
        return self.table[(index + move) % len(self.table)]  

    def encrypt(self, cleartext):  
        # i 指向明文, j 指向密钥  
        j = 0  
        ll = []  
        for i in range(len(cleartext)):  
            move = ord(self.key[j]) % len(self.table)  
#            print 'move', move  
            new_chr = self.dict(cleartext[i], move)  
            ll.append(new_chr)  
            j = self.genNum(j)  
        return ''.join(ll)  

    def decrypt(self, ciphertext):  
        # i 指向密文, j 指向密钥  
        j = 0  
        ll = []  
        for i in range(len(ciphertext)):  
            move = ord(self.key[j]) % len(self.table)  
            move = move * (-1)  
#            print 'move', move  
            new_chr = self.dict(ciphertext[i], move)  
            ll.append(new_chr)  
            j = self.genNum(j)  
        return ''.join(ll)  

if __name__ == '__main__':  
    v = Vigenere(key='apple077226')  
    cleartext = '000000668'  
    print cleartext  
    ciphertext = v.encrypt(cleartext)  
    print ciphertext  
    print '----------------------------------'  
    cleartext = v.decrypt(ciphertext)  
    print cleartext 

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

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

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据