首页 > 其他分享 >序列密码实验

序列密码实验

时间:2023-06-02 11:44:45浏览次数:80  
标签:初始化 code register 验证码 实验 print 256 序列密码

实验目的及要求

(1)实现LFSR,寄存器位数n=10,反馈函数、初试值都自己定;

(2)实现RC4,数组长度=8,密钥自己定;

(3)基于实现的LFSR或RC4实现一个动态验证码生成器,每次生成6个伪随机十进制数,自己测下多少个输出后开始循环。

========================================================================================================================================================

(1)

def LFSR(register):
    output = register[0]        # 输出最低有效位
    feedback = register[0] ^ register[1]  # 第一位和第二位异或
    for i in range(len(register)-1):
        register[i] = register[i+1]     # 左移寄存器的值
    register[-1] = feedback               # 拼接反馈位
    return output, register

# 初始化寄存器和反馈位tap
origin=[1,0,0,0,1,1,0,1,1,1]
register = [1,0,0,0,1,1,0,1,1,1]
flag=0
while True:
    output, register = LFSR(register)
    print("输出:"+str(output)+" "+"左移后状态:"+str(register))
    if register == origin:
        break
    else:
        flag+=1

print("周期是:"+str(flag))

  以下是运行结果

 

 输入的初始值不同,运行结果也不一样,有些会一直循环下去

========================================================================================================================================================

(2)

key = "helloworld"   # 密钥
S = [0, 1, 2, 3, 4, 5, 6, 7]   # 初始S盒
T = []  # 初始化T盒为空
j = 0   # j变量初始化为0

# 初始化S盒
for i in range(8):   # 循环8次,与密钥长度相同
    j = (j + S[i] + ord(key[i])) % 8   # j加S[i]值与密钥字符的ASCII值,取模8
    S[i], S[j] = S[j], S[i]   # 交换S[i]和S[j]的值

i=0   # i变量初始化为0
j = 0   # j变量重新初始化为0
# PRGA生成伪随机数
for _ in range(8):   # 循环8次,与明文长度相同
    i=(i+1)%8   # i加1,取模8
    j = (j + S[i]) % 8   # j加S[i]值,取模8
    S[i],S[j]=S[j],S[i]   # 交换S[i]和S[j]的值
    t=(S[i]+S[j])%8   # t取S[i]和S[j]之和的模8
    T.append(S[t])   # 将S[t]的值添加到T盒

plaintext='woaimimadsa'  # 明文
cypher=[]   # 初始化密文为空
for i in range(8):   # 遍历T盒的值
    cypher.append(chr(ord(plaintext[i])^T[i]))   # 明文的第i个字符与T[i]作异或,得密文的第i个字符

print("明文是:"+plaintext)
print("密钥是:"+key)
print("密文是:"+''.join(cypher))  # 输出密文

以下是运行结果

 

 ========================================================================================================================================================

(3)

key = 'helloworld'  # 密钥
S = list(range(256))  # 初始S盒,值从0到255
j = 0   # j变量初始化为0

# 初始化S盒
for i in range(256):  # 从0到255循环
    j = (j + S[i] + ord(key[i % len(key)])) % 256  # j加S[i]值与密钥字符的ASCII值,取模256
    S[i], S[j] = S[j], S[i]  # 交换S[i]和S[j]的值

# 生成6位数验证码
def get_code():
    code = []  # 初始化验证码为空列表
    i, j = 0, 0  # i和j变量初始化为0
    for _ in range(6):      # 循环6次
        i = (i + 1) % 256   # i加1,取模256
        j = (j + S[i]) % 256  # j加S[i]值,取模256
        S[i], S[j] = S[j], S[i]   # 交换S[i]和S[j]的值
        code.append(str(S[(S[i] + S[j]) % 256] % 10))  # 将S[i]和S[j]之和模256且模10的结果添加到验证码中
    return ''.join(code)   # 返回生成的6位数验证码

# 测试
n = 0   # 循环次数初始化为0
codes = set()   # 初始化代码集合为空
while True:    # 一直接循环
    code = get_code()   # 获取新的验证码
    print(code,end=' ')
    if code in codes:   # 如果验证码已在集合codes中
        print(f'\n开始重复!循环次数:{n},重复验证码为:{code}') # 输出开始重复的循环次数n
        break   # 退出循环
    codes.add(code)    # 将新验证码添加到集合codes中
    n += 1   # 循环次数加1

以下是运行结果

 

标签:初始化,code,register,验证码,实验,print,256,序列密码
From: https://www.cnblogs.com/gaifa-gafin/p/17451304.html

相关文章

  • linux 递归和函数实验
     递归  作用:自己调用自己 1.例子:阶乘    2.遍历目录下所有文件  函数 1.函数能够接受一个参数,参数为用户名;判断一个用户是否存在如果存在,就返回此用户的shell和UID;并返回正常状态值;如果不存在,就说此用户不存在;并返回错误状态值;  2......
  • 【小实验】使用 wrk 的 docker 容器来压测另一个容器
    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢!cnblogs博客zhihuGithub公众号:一本正经的瞎扯想压测容器环境的服务性能,发现两个麻烦:本地使用wrk,由于本地网络和容器服务器很远,压测效果不好;wrk找不到一个独立的二进制版本可以下载;go-wrk完全不可用。然后......
  • 实验六
    任务1//P286例8.17//对教材上的程序作了微调整,把输出学生信息单独编写成一个函数模块//打印不及格学生信息和所有学生信息程分别调用#include<stdio.h>#include<stdlib.h>#include<string.h>#defineN2//运行程序输入测试时,可以把这个数组改小一些输入......
  • 202183300215 刘璎珂 实验六
    实验4#include<stdio.h>#include<stdlib.h>#include<string.h>#defineN100typedefstruct{charnum[10];//学号ints1;//期末成绩ints2;//平时成绩doublesum;//总评charlevel[......
  • 实验6
    实验任务1//P286例8.17//对教材上的程序作了微调整,把输出学生信息单独编写成一个函数模块//打印不及格学生信息和所有学生信息程分别调用#include<stdio.h>#include<string.h>#defineN10//运行程序输入测试时,可以把这个数组改小一些输入测试typedef......
  • 实验6
    task4.c #include"stdafx.h"#include<stdio.h>#include<stdlib.h>#include<string.h>#defineN100typedefstruct{charnum[10];ints1;ints2;doublesum;charlevel[10];}STU;intfun(STUa[],int......
  • 实验6
    task4#include<stdio.h>#include<string.h>#defineN100typedefstruct{charnum[10];ints1;ints2;doublesum;charlevel[10];}STU;intfun(STUa[],intn,STUh[]);intmain(){STUs[N]={{"GA05",85,76},{"G......
  • 《编译原理》实验三:自下而上语法分析(算符优先分析法)
    本实验采用算符优先分析法,对PL/0语言的算术运算进行语法分析。本程序由我个人独立完成,代码为C++98,因此可能较丑陋,且不能保证完全正确,还请见谅 (¯﹃¯)一.设计思想1.文法因实验二中的文法不是算符优先文法,所以本次实验采用了新的文法。(1)EBNF<表达式>::=[+|-]<项>{<加法运算......
  • 实验六
    1//P286例8.17//对教材上的程序作了微调整,把输出学生信息单独编写成一个函数模块//打印不及格学生信息和所有学生信息程分别调用#include<stdio.h>#include<string.h>#defineN3//运行程序输入测试时,可以把这个数组改小一些输入测试typedefstructstudent{int......
  • 实验六
    #include<stdio.h>#include<string.h>#defineN100typedefstruct{charnum[10];//学号ints1;//期末成绩ints2;//平时成绩doublesum;//总评charlevel[10];//等级}STU;intfun......