python实现维吉尼亚算法
本文实例为大家分享了python实现维吉尼亚算法的具体代码,供大家参考,具体内容如下
1Virginia加密算法、解密算法
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)mod26
j=1…d, t=0…ceiling(n/d)-1
其中ceiling(x)函数表示不小于x最小整数
解密算法:
mj+td=(cj+td-kj)mod26
j=1…d,t=0…ceiling(n/d)-1
其中ceiling(x)函数表示不小于x最小整数
加解密代码如下
defVigenereEncrypto(message,key):
msLen=len(message)
keyLen=len(key)
message=message.upper()
key=key.upper()
raw="ABCDEFGHIJKLMNOPQRSTUVWXYZ"#明文空间
#定义加密后的字符串
ciphertext=""
#开始加密
foriinrange(0,msLen):
#轮询key的字符
j=i%keyLen
#判断字符是否为英文字符,不是则直接向后面追加且继续
ifmessage[i]notinraw:
ciphertext+=message[i]
continue
encodechr=chr((ord(message[i])-ord("A")+ord(key[j])-ord("A"))%26+ord("A"))
#追加字符
ciphertext+=encodechr
#返回加密后的字符串
returnciphertext
if__name__=="__main__":
message="Hello,World!"
key="key"
text=VigenereEncrypto(message,key)
print(text)
defVigenereDecrypto(ciphertext,key):
msLen=len(ciphertext)
keyLen=len(key)
key=key.upper()
raw="ABCDEFGHIJKLMNOPQRSTUVWXYZ"#密文空间
plaintext=""
foriinrange(0,msLen):#开始解密
#轮询key的字符
j=i%keyLen
#判断字符是否为英文字符,不是则直接向后面追加且继续
ifciphertext[i]notinraw:
plaintext+=ciphertext[i]
continue
decodechr=chr((ord(ciphertext[i])-ord("A")-ord(key[j])-ord("A"))%26+ord("A"))
#追加字符
plaintext+=decodechr
#返回加密后的字符串
returnplaintext
if__name__=="__main__":
ciphertext="RIJVS,AMBPB!"
key="key"
text=VigenereDecrypto(ciphertext,key)
print(text)
importVigenereDecrypto
importVigenereEncrypto
defmain():
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个密文字母中抽取两个字母的方式有