序列密码

简述

通俗讲,序列密码就是利用初始密钥(种子密钥),产生密钥流,再利用密钥流,对明文逐比特进行加密(异或运算),解密相同,将密文与密钥进行逐比特异或运算。

由于密钥流的周期性会导致加密的不安全,但是非周期(随机)又存在协商难题,因此序列密码在产生密钥流时采用的是伪随机数(周期很大的周期序列)

采用伪随机数近乎完美地解决了以上两个难题,也实现了一次一密的加密方案。

序列密码又分为同步序列密码自同步序列密码
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
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值