基于LFSR的流密钥生成器

利用2个LFSR,输出30位流密码

#include <stdio.h>
#include<stdlib.h>
/*两个寄存器的位数 */
#define R1MASK  0x1F /* 5 bits, numbered 0..4 */
#define R2MASK  0x0F /* 4 bits, numbered 0..3 *//* 每个寄存器的中间比特 */
#define R1MID   0x02 /* bit 2 */
#define R2MID   0x02 /* bit 2 *//* 回归标志,用于钟控轮转寄存器*//* 特征多项式*//*f(x)=x^5+x^4+1;f(x)=x^4+x^3+1. */
#define R1TAPS  0x18 /* bits 4,3 */
#define R2TAPS  0x0C /* bits 3,2 *//* 输出标记,用于生成输出 */
#define R1OUT   0x10 /* bit 4 (the high bit) */
#define R2OUT   0x08 /* bit 3 (the high bit) */typedef unsigned char byte;
typedef unsigned int word;
typedef word bit;/* 计算移位后填入值 */
bit parity(word x) {x ^= x >> 8;x ^= x >> 4;x ^= x >> 2;x ^= x >> 1;return x & 1;
}/* 钟控单个寄存器 */
word clockone(word reg, word mask, word taps) {word t = reg & taps;reg = (reg << 1) & mask;reg |= parity(t);return reg;
}/* 两个钟控寄存器 */
word R1, R2;byte m[8] = { 0X01,0x02,0x04,0x08,0x10,0x20,0x40,0x80 };/* 根据钟控规则进行钟控*/
void clock() {bit maj = (((R1 & R1MID) >> 1)* ((R2 & R2MID) >> 1)) << 1;if ((R1 & R1MID)  == maj)R1 = clockone(R1, R1MASK, R1TAPS);if ((R2 & R2MID) == maj)R2 = clockone(R2, R2MASK, R2TAPS);}/* 对两个都进行钟控,当且仅当用于设置密钥 */
void clockallthree() {R1 = clockone(R1, R1MASK, R1TAPS);R2 = clockone(R2, R2MASK, R2TAPS);
}/* 生成输出值 */
bit getbit() {return parity(R1 & R1OUT) ^ parity(R2 & R2OUT);
}/* 进行A5/1密钥设置,这步骤需要64bit密钥和22bit帧数*/
void keysetup(byte key[2], word frame) {int i;bit keybit, framebit;/*对移位寄存器置零. */R1 = R2 = 0;/* 将密钥加载入寄存器,* 优先将每个密钥串的第一个bit作为最低有效位,*对于每个载入的密钥钟控每个寄存器一次 */for (i = 0; i < 16; i++) {clockallthree(); /* always clock */keybit = (key[i / 8] >> (i & 7)) & 1; /* The i-th bit of the
key */R1 ^= keybit; R2 ^= keybit;}/* 将帧数载入移位寄存器,优先最低有效位,对每个载入的bit钟控寄存器一次 */for (i = 0; i < 4; i++) {clockallthree(); /* always clock */framebit = (frame >> i) & 1; /* The i-th bit of the frame #
*/R1 ^= framebit; R2 ^= framebit;;}/*进行不产生输出的20次钟控来融合密钥要素与帧数*/for (i = 0; i < 20; i++) {clock();}/* 现在密钥已经完全设置完成. */
}/* 生成30bit的密钥流输出*/
void run(byte S[]) {int i;/* 将输出缓存置零. */for (i = 0; i <= 30 / 8; i++)S[i] = 0;/* 生成30bit密钥流用于*/for (i = 0; i < 30; i++) {clock();S[i / 8] |= getbit() << (7 - (i & 7));}
}
void EnCrypt(byte *p,byte * s,int len)
{int i = 0, j = 0;while (p[i] != '\0'){j = i * 8 % len; //该块开头对应的密钥bit位for (int k = j; k < j + 8; k++){p[i] ^= s[k % (len / 8 + 1)] ^ m[(k % len) % 8];}i++;}
}void test() {byte key[2] = { 0x01, 0x9C };word frame = 0x34;byte S[4] = {0};int i, failed = 0,j;keysetup(key, frame);run(S);printf("密钥为: 0x");for (i = 0; i < 2; i++)printf("%02X", key[i]);printf("\n");printf("frame number: 0x%06X\n", (unsigned int)frame);printf("\n");printf("observed output:\n");printf(" 密钥流为: 0x");for (i = 0; i < 4; i++)printf("%02X", S[i]);printf("\n\n\n");byte p[7] = "朱靖宇";i = j = 0;printf("明文为 :%s\n", p);while (p[i] != '\0'){printf("%0x ", p[i++]);}printf("\n\n");i = 0;printf(">>>>开始加密<<<<\n");EnCrypt(p, S, 30);printf("密文为: 0X");while (p[i] != '\0'){printf(" %02X", p[i]);i++;}printf("\n\n\n");i = 0;printf(">>>>开始解密<<<<\n");EnCrypt(p, S, 30);printf("明文为: ");while (p[i] != '\0'){if (i % 2)printf("%c%c", p[i - 1], p[i]);i++;}printf("\n");
}int main(void) {test();return 0;
}

利用LFSR结构设计的流密钥生成器C++实现相关推荐

  1. 利用LFSR实现模2除法的原理

    对于利用LFSR实现模2除法的原理,不解,找了很多资料,没有一个讲明白的,下面的一个算是有那么一点靠谱的,先记下来,以后有时间了沿着这个思路慢慢推导吧! 转自:http://www.elecfans. ...

  2. 利用blink CEP实现流计算中的超时统计问题

    案例与解决方案汇总页: 阿里云实时计算产品案例&解决方案汇总 一. 背景介绍 如<利用blink+MQ实现流计算中的延时统计问题>一文中所描述的场景,我们将其简化为以下案例: 实时 ...

  3. C#利用WCF改进文件流传输的三种方式

    摘要:本文介绍C#利用WCF改进文件流传输的三种方式:MTOM模型.基于同步传输的异步回调模型.基于异步传输的异步模型,并提供相应的实现代码供参考. - WCF在跨域传输使用了两种模型的方法调用:一种 ...

  4. 2021-05-29当微商怎么引流?微商如何利用闲鱼引流?

    当微商怎么引流?微商如何利用闲鱼引流? 做微商的人都知道,流量,对于每个微商来说,都是生意的根本.拥有了足够的流量,你就拥有了粉丝变现的基础.今天,就给你聊聊.如何利用闲鱼引流,你不仅可以利用闲鱼引流 ...

  5. 支付宝RAS密钥生成器SHAwithRSA1024_V1.0打开后窗口一闪而过迅速关闭的解决办法

    RSA私钥及公钥生成时,需要使用到支付宝RAS密钥生成器,但是下载安装后,发现窗口闪一下就消失了.这是因为文件在中文目录下造成的. 解决办法是,将文件拷贝到C或D盘的根目录下,父目录不要有中文,就可以 ...

  6. android html5 rtmp,利用H5实现RTMP流的WEB移动端直播

    利用H5实现RTMP流的WEB移动端直播 主要实现方式:使用H5的video 元素结合H5的网络频播放器(video.js)实现rtmp流的直播播放 video.js 介绍 Video.js 是一个通 ...

  7. 淘宝运营 淘金币的定义 怎样利用淘金币引流 怎样推广

    今天就跟大家介绍一种淘宝引流的方式,淘金币. 一.定义 淘金币是淘宝网的虚拟积分.在淘金币平台上,买家能够兑换.竞拍到全网品牌折扣商品.也可以兑换.抽奖得到免费的商品或者现金红包.并可以进行线上线下商 ...

  8. 如何利用免费小说引流?小说平台怎么免费推广引流?

    如今在网上看小说的人越来越多,和影视人群一样,漫画动画相对或许少一点.但是小说通常都是需要付费才能看完整的,可是很多人是不想付费的,所以就会到网上搜一些免费的小说,这就是我们引流的要点.下面聪少就来说 ...

  9. 抖音怎么引流卖童装?淘宝童装卖家利用抖音引流

    抖音怎么引流卖童装?淘宝童装卖家利用抖音引流 童装虽然穿在孩子身上,不过决定买衣服的还家长.所以内容给家长们看的.我们要分析家长的心理特点以及喜好.拍出家长感兴趣,能触动到家长的视频.一半童装是10岁 ...

最新文章

  1. 编程实现路由算法 实验报告_lt;中国通信专刊gt; EARS:用于软件定义网络中自动路由的智能驱动体验网络架构...
  2. 笔试题:写一个ArrayList 的动态代理类
  3. c# 对COM+对象反射调用时地址参数处理 c# 对COM+对象反射调用时地址参数处理
  4. php聊天室技术,PHP聊天室技术
  5. ImportError: DLL load failed: %1 不是有效的 Win32 应用程序
  6. Spring Boot入门篇-@RequestParam/@RequestBody配置
  7. ORACLE 常用操作命令
  8. 怎么把PDF转换成Word格式?
  9. 计算机启动时默认输入法设置,每次开机都需要重设,教你电脑输入法怎么设置默认模式...
  10. 如何把一张图片做成一个好看的电脑图标
  11. 信息系统项目管理师(2022年) —— 第 11 章 项目风险管理
  12. 决策树---使用三种方法对数据建立决策树
  13. 最简单的让IjkPlayer自动旋转带有rotation视频的方法
  14. 微信定位真的泄露了你的精确位置
  15. 【思维进阶】《高效能人士的七个工作习惯》读书笔记
  16. 在setTimeout或者ajax等异步方法中回调函数的写法与调用
  17. 最新中国大陆TOP100网站排名
  18. 如何快速将pdf表格转换成excel
  19. 记一次小米2S的刷机过程
  20. 【shell】if常用判断|if目录是否为空|判断字符串包含关系|与或

热门文章

  1. ☆读代码学ahk 之二 —— 简单挂机锁
  2. 网上看见的一个骑行兄弟的装备,说不定哪天我也出发了
  3. c语言数据类型问题的总结
  4. PHP 安全:过滤、验证和转义
  5. 记录一次mysql数据库文件损坏导致数据库崩溃
  6. Dr16DT7的使用方法
  7. dede标签:定义文件夹
  8. linux图片相似度检测软件下载,文档相似性检测工具
  9. c语言中两个文件一起编译,keil中怎么把两个c程序怎么同时同时编译生成一个hex文件...
  10. ArcGIS的工作空间