python实现维吉尼亚算法
本文实例为大家分享了python实现维吉尼亚算法的具体代码,供大家参考,具体内容如下
1 Virginia加密算法、解密算法
Vigenenre密码是最著名的多表代换密码,是法国著名密码学家Vigenenre发明的。Vigenenre密码使用一个词组作为密钥,密钥中每一个字母用来确定一个代换表,每一个密钥字母被用来加密一个明文字母,第一个密钥字母加密第一个明文字母,第二个密钥字母加密第二个明文字母,等所有密钥字母使用完后,密钥再次循环使用,于是加解密前需先将明密文按照密钥长度进行分组。
密码算法可表示如下:。
设明文串为:
M=m1m2…mn,mi∈charset, n是明文长度
秘钥为:
K=k1k2…kd,ki∈charset, d是秘钥长度
密文为:
C=c1c2…cn,ci∈charset, n是密文长度
加密算法:
cj+td=(mj+td+kj ) mod 26
j=1…d, t=0…ceiling(n/d)-1
其中ceiling(x)函数表示不小于x最小整数
解密算法:
mj+td=(cj+td -kj ) mod 26
j=1…d, t=0…ceiling(n/d)-1
其中ceiling(x)函数表示不小于x最小整数
加解密代码如下
def VigenereEncrypto(message, key): msLen = len(message) keyLen = len(key) message = message.upper() key = key.upper() raw = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"# 明文空间 # 定义加密后的字符串 ciphertext = "" # 开始加密 for i in range(0, msLen): # 轮询key的字符 j = i % keyLen # 判断字符是否为英文字符,不是则直接向后面追加且继续 if message[i] not in raw: ciphertext += message[i] continue encodechr = chr((ord(message[i]) - ord("A") + ord(key[j]) - ord("A")) % 26 + ord("A")) # 追加字符 ciphertext += encodechr # 返回加密后的字符串 return ciphertext if __name__ == "__main__": message = "Hello, World!" key = "key" text = VigenereEncrypto(message, key) print(text) def VigenereDecrypto(ciphertext, key): msLen = len(ciphertext) keyLen = len(key) key = key.upper() raw = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"# 密文空间 plaintext = "" for i in range(0, msLen):# 开始解密 # 轮询key的字符 j = i % keyLen # 判断字符是否为英文字符,不是则直接向后面追加且继续 if ciphertext[i] not in raw: plaintext += ciphertext[i] continue decodechr = chr((ord(ciphertext[i]) - ord("A") - ord(key[j]) - ord("A")) % 26 + ord("A")) # 追加字符 plaintext += decodechr # 返回加密后的字符串 return plaintext if __name__=="__main__": ciphertext = "RIJVS, AMBPB!" key = "key" text = VigenereDecrypto(ciphertext, key) print(text) import VigenereDecrypto import VigenereEncrypto def main(): info = '''==========********=========='''# 开始加密 print(info, "\n------维吉尼亚加密算法------") print(info) # 读取测试文本文档 message = open("test.txt","r+").read() print("读取测试文本文档:test.txt") print("开始加密!") # 输入key key = input("请输入密钥:") # 进入加密算法 CipherText = VigenereEncrypto.VigenereEncrypto(message, key) # 写入密文文本文档 C = open("CipherText.txt", "w+") C.write(CipherText) C.close() print("加密后得到的密文是: \n" + CipherText) # 开始解密 print(info, "\n------维吉尼亚解密算法------") print(info) # 读取加密文本文档 print("读取密文文本文档:CipherText.txt") Ciphertext = open("CipherText.txt", "r+").read() # 进入解密算法 print("开始解密!") Plaintext = VigenereDecrypto.VigenereDecrypto(Ciphertext, key) P = open("PlainText.txt", "w+") # 写入解密文本文档 P.write(Plaintext) P.close() print("解密后得到的明文是 : \n" + Plaintext) if __name__=="__main__": main()
2重合指数法
2.1重合指数
设x=X1X2...Xn是一个含有n个字符的字符串,x的重合指数记为Ic(x),定义为x中两个随机元素相同的概率。
设y是一个长度为n密文,即y=y1y2...ym,其中y是密文字母,同样来求从中抽到两个相同字母的概率是多少。为此,设NA为字母A在这份密文中的频数,设Nb为字母B在这份密文中的频数,依此类推
从n个密文字母中抽取两个字母的方式有