首页 > 编程语言 >A5-1密码算法C语言实现

A5-1密码算法C语言实现

时间:2024-12-24 23:31:23浏览次数:3  
标签:LFSR C语言 X2 算法 bool x3 x2 A5 x1

#include <iostream>

using namespace std;

bool x1[19]={0};                                 //用于LFSR_1的向量
bool x2[22]={0};                                 //用于LFSR_2的向量
bool x3[23]={0};                                 //用于LFSR_3的向量
bool key[64]={0};                                //64比特会话密钥
bool zhen[22]={0};                               //22比特帧序号
bool y1=x1[0],y2=x2[0],y3=x3[0];                 //各线性移存器的反馈量
bool *X1=&x1[0];
bool *Y1=&y1;
bool *X2=&x2[0];
bool *Y2=&y2;
bool *X3=&x3[0];
bool *Y3=&y3;
bool *k=&key[0];
bool *z=&zhen[0];
bool LFSR_1(bool *X1,bool *Y1)                  //LFSR_1左移
{
    y1=x1[18]^x1[17]^x1[16]^x1[13];
    for(int i=18;i>0;i--)
        x1[i]=x1[i-1];
    x1[0]=y1;
}
bool LFSR_2(bool *X2,bool *Y2)                  //LFSR_2左移
{
    y2=x2[21]^x2[20];
    for(int i=21;i>0;i--)
        x2[i]=x2[i-1];
    x2[0]=y2;
}
bool LFSR_3(bool *X3,bool *Y3)                  //LFSR_3左移
{
    y3=x3[22]^x3[21]^x3[20]^x3[7];
    for(int i=23;i>0;i--)
        x3[i]=x3[i-1];
    x3[0]=y3;
}
bool LFSR_1k(bool *X1,bool *Y1,bool *k)         //LFSR_1在密钥或帧序号参与下的规则动作
{
    y1=x1[18]^x1[17]^x1[16]^x1[13]^*k;
    for(int i=18;i>0;i--)
        x1[i]=x1[i-1];
    x1[0]=y1;
}
bool LFSR_2k(bool *X2,bool *Y2,bool *k)         //LFSR_2在密钥或帧序号参与下的规则动作
{
    y2=x2[21]^x2[20]^*k;
    for(int i=21;i>0;i--)
        x2[i]=x2[i-1];
    x2[0]=y2;
}
bool LFSR_3k(bool *X3,bool *Y3,bool *k)         //LFSR_3在密钥或帧序号参与下的规则动作
{
    y3=x3[22]^x3[21]^x3[20]^x3[7]^*k;
    for(int i=22;i>0;i--)
        x3[i]=x3[i-1];
    x3[0]=y3;
}
void zk(bool *X1,bool *X2,bool *X3,bool *Y1,bool *Y2,bool *Y3)  //钟控动作规律
{
   int a=x1[8]*100+x2[10]*10+x3[10];
        switch(a)
        {
        case 0:
            LFSR_1(X1,Y1);
            LFSR_2(X2,Y2);
            LFSR_3(X3,Y3);
            break;
        case 1:
            LFSR_1(X1,Y1);
            LFSR_2(X2,Y2);
            break;
        case 10:
            LFSR_1(X1,Y1);
            LFSR_3(X3,Y3);
            break;
        case 11:
            LFSR_2(X2,Y2);
            LFSR_3(X3,Y3);
            break;
        case 100:
            LFSR_2(X2,Y2);
            LFSR_3(X3,Y3);
            break;
        case 101:
            LFSR_1(X1,Y1);
            LFSR_3(X3,Y3);
            break;
        case 110:
            LFSR_1(X1,Y1);
            LFSR_2(X2,Y2);
            break;
        case 111:
            LFSR_1(X1,Y1);
            LFSR_2(X2,Y2);
            LFSR_3(X3,Y3);
            break;
        }
}
int main()
{
    int i=0;
    bool y;
    z[0]=1;                         //定义帧序号为1
    for(i=0;i<64;i++)               //密钥参与的规则动作64次
    {
        LFSR_1k(X1,Y1,k);
        LFSR_2k(X2,Y2,k);
        LFSR_3k(X3,Y3,k);
        k++;
    }
    //k=&key[0];
    for(i=0;i<22;i++)               //帧序号参与的规则动作22次
    {
        LFSR_1k(X1,Y1,z);
        LFSR_2k(X2,Y2,z);
        LFSR_3k(X3,Y3,z);
        z++;
    }
    //z=&zhen[0];
    for(i=0;i<100;i++)              //钟控方式连续动作100次,但不输出乱数
    {
       zk(X1,X2,X3,Y1,Y2,Y3);
    }
    for(i=0;i<114;i++)              //钟控方式来纳许动作114次,三个移存器最高级寄存器的值模2加后输出,作为乱数
    {
        zk(X1,X2,X3,Y1,Y2,Y3);
        y=x1[18]^x2[21]^x3[22];
        cout<<y;                    //输出乱数,用于对用户手机到基站传送的114比特数据的加密
    }
    system("pause");
    for(i=0;i<100;i++)
    {
        zk(X1,X2,X3,Y1,Y2,Y3);
    }
    for(i=0;i<114;i++)
    {
        zk(X1,X2,X3,Y1,Y2,Y3);
        y=x1[18]^x2[21]^x3[22];
        cout<<y;                    //输出乱数,用于对基站到用户手机传送的114比特数据的加密
    }
    return 0;
}


标签:LFSR,C语言,X2,算法,bool,x3,x2,A5,x1
From: https://blog.csdn.net/Yog_Azathoth/article/details/144704951

相关文章

  • 4、数据结构与算法解析(C语言版)--栈
    栈的数据存储遵循“后进先出的规则”,这在计算机里面是非常有用的,比如word等编辑软件的"撤销"功能,就是使用栈进行实现的。1、创建项目 main.h#ifndef_MAIN_H#define_MAIN_H#include<stdio.h>#include<stdlib.h>#include<time.h>#defineTRUE1#defineFALSE0......
  • C++算法第十四天
    学完前面的算法题,相信大家的水平定是有所提升,那么今天我们来点难题开一下刀第一题题目链接188.买卖股票的最佳时机IV-力扣(LeetCode)题目解析代码原理代码编写classSolution{public:  intmaxProfit(intk,vector<int>&prices){    constint......
  • c++算法练习
    c++算法练习904.水果成篮classSolution{public:inttotalFruit(vector<int>&fruits){intl=0,ret=0;unordered_set<int>hs;//哈希表for(intr=0;r<fruits.size();r++){if(hs.find(fruits[r])==hs.end......
  • C语言中常见的数据类型及其处理方式
    1.数据类型整型整型所占字节int4字节unsignedint0~2^32-1signedint-2^31~2^31-1short2字节unsignedshort0~65535signedshort-32768~32767long8字节unsignedlong0~2^32-1signedlong-2^31~2^31-1longlong8字节unsingnedlo......
  • 动态规划算法之子数组系列----最长湍流子数组
    最长湍流子数组 最长湍流子数字问题描述给定一个整数数组 arr ,返回 arr 的 最大湍流子数组的长度 。如果比较符号在子数组中的每个相邻元示例1:输入:arr=[9,4,2,10,7,8,8,1,9]输出:5解释:arr[1]>arr[2]<arr[3]>arr[4]<arr[5]示例2:输入:arr=[4,8,12,16......
  • 动态规划算法之子序列问题----环绕字符串中唯一的子字符串
    环绕字符串中唯一的字符串https://leetcode.cn/problems/unique-substrings-in-wraparound-string/submissions/589070606/题目描述定义字符串 base 为一个 "abcdefghijklmnopqrstuvwxyz" 无限环绕的字符串,所以 base 看起来是这样的:"...zabcdefghijklmnopqrstuvwxyzab......
  • 跟着问题学23番外——反向传播算法理论及pytorch自动求导详解
    前向传播与反向传播在单层神经网络的优化算法里,我们讲到优化算法是为了寻找模型参数使得网络的损失值最小,这里详细介绍一下应用的基础——反向传播算法。在神经网络中,梯度计算是通过反向传播算法来实现的。反向传播算法用于计算损失函数相对于网络参数(如权重和偏置)的梯度,从而......
  • C语言——整型数据在内存中的存储
    整型数组在内存中的存储一、大小端存储1.大端存储(大端字节序存储)2.小端存储(小端字节序存储)>给大家一个题目,设计一个程序判断当前机器的字节序.二、原码、反码和补码1.*补充2.例题1.2.3.4.5.6.一、大小端存储1.大端存储(大端字节序存储)将一个数据的低位字节内容......
  • 【已解决】错误:未添加头文件(C语言经验分享)
    以上程序出现报错[Warning]incompatibleimplicitdeclarationofbuilt-infunction'strcspn'[Warning]incompatibleimplicitdeclarationofbuilt-infunction'strlen'cannotopenoutputfileC:Users#JlDesktoplcl1.1.1.exe:Permissiondenied[Err......
  • 【C语言】[waring]comparison between pointer and integer报错
     原因:在C语言中,指针和整型是不同的数据类型,它们之间不能直接进行比较。 改正:在arr[i]前加&取地址  [waring]comparisonbetweenpointerandinteger改正方法:1.显式类型转换(不推荐)intvalue=10;int*ptr=NULL;if((int)ptr==value){}这里if((int)ptr......