简述
通俗讲,序列密码就是利用初始密钥(种子密钥),产生密钥流,再利用密钥流,对明文逐比特进行加密(异或运算),解密相同,将密文与密钥进行逐比特异或运算。
由于密钥流的周期性会导致加密的不安全,但是非周期(随机)又存在协商难题,因此序列密码在产生密钥流时采用的是伪随机数(周期很大的周期序列)
采用伪随机数近乎完美地解决了以上两个难题,也实现了一次一密的加密方案。
序列密码又分为同步序列密码与自同步序列密码
1)同步序列:密文只与明文和密钥有关,密文不参与加密。
2)自同步序列:密文参与加密,密文不仅与明文和密钥有关,还与之前的密文有关。
加解密
序列密码加解密采用同样的流程:密钥与消息进行逐比特异或运算。
流程图:
代码实现
#!/usr/bin/python3.7
# -*- coding: utf-8 -*-
# @Time : 2019/12/18 15:25
# @Author : SystemDefenser
# @Email : mrwx1116@163.com
# @Software: PyCharm
from re import search
# 密钥流生成密钥
def createKey(parameter, initialKey, keyLength):
tmpKeyList = [] # 临时密钥序列(所有组合)
cycleKeyList = [] # 周期密钥序列(末尾元素)
resultKeyList = [] # 最终密钥序列(指定长度)
parameterList = list(map(lambda x: int(x) - 1, list(parameter.split(" ")))) # 用于异或操作的位置
tmpKeyList.append(list(map(lambda x: int(x), initialKey)))
count = 0
while True:
# 存储每一轮的结果
tmpList = [0 for i in range(len(initialKey))]
tmpList[0] = tmpKeyList[count][int(parameterList[0])]
# 依次异或
for i in range(1, len(parameterList)):
tmpList[0] ^= tmpKeyList[count][int(parameterList[i])]
for i in range(1, len(initialKey)):
tmpList[i] = tmpKeyList[count][i - 1]
tmpKeyList.append(tmpList)
count += 1
if tmpKeyList[count] == tmpKeyList[0]:
break
print("=" * 50)
print("周期:", len(tmpKeyList) - 1)
for item in tmpKeyList:
print(tmpKeyList.index(item) + 1, item)
for item in tmpKeyList[:-1]:
cycleKeyList.append(item[-1])
print("周期密钥:", cycleKeyList)
print("周期:", len(cycleKeyList))
for i in range(keyLength):
resultKeyList.append(cycleKeyList[i % len(cycleKeyList)])
print("加密密钥:", resultKeyList)
print("长度:", len(resultKeyList))
print("=" * 50)
return resultKeyList
# 字符串转二进制
def strToBin(massage):
resultStr = ""
for i in massage:
tmp = bin(ord(i)).replace("0b", "")
while len(tmp) < 8:
tmp = "0" + tmp
resultStr += tmp
return resultStr
# 二进制转字符串
def binToStr(massage):
resultStr = ""
for i in range(0, len(massage), 8):
tmp = int(massage[i:i + 8], 2)
resultStr += chr(tmp)
return resultStr
# 加解密
def encrypt_decrypt(massage, keyList):
resultStr = ""
binStr = strToBin(massage)
for i in range(len(binStr)):
resultStr += str(int(list(binStr)[i]) ^ int(keyList[i % len(keyList)]))
return resultStr
# 输入信息
def inputMassage():
massage = input("输入Massage:")
while True:
initialKey = input("输入初始密钥(01串):")
if not search(r"[^0-1]", initialKey):
break
while True:
parameter = input("输入反馈参数(空格隔开):")
parameterList = list