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

#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;
}


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值