您的位置:首页 > 脚本大全 > > 正文

python实现七个基本算法(python实现维吉尼亚算法)

更多 时间:2021-11-03 12:38:11 类别:脚本大全 浏览量:234

python实现七个基本算法

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最小整数

加解密代码如下

  • ?
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 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个密文字母中抽取两个字母的方式有

    您可能感兴趣