1.算法简介
A5/1加密算法用于GSM中的数据机密性加密。该算法使用三个线性反馈位移寄存器,记为为X、Y和Z。其中X(x0, x1, …, x18)寄存器有19位,Y寄存器22位,Z寄存器23位。以下不讲原理,只讲密钥流生成算法。
- 定义X操作:
temp = x13 ^ x16 ^ x17 ^ x18
xi = xi-1 for i = 18, 17, 16, …, 1
x0 = temp;(简单的说就是左移一位,然后第一位用没左移之前的x13 ^ x16 ^ x17 ^ x18填充,以下类似)
定义Y操作:
temp = y20 ^ y21
yi = yi-1 for i = 21, 20, 19, …, 1
y0 = temp;
定义Z操作:
temp = z7 ^ z20 ^ z21 ^ z22
zi = zi-1 for i = 22, 21, 20, …, 1
z0 = temp; - 定义多数投票函数maj(x, y , z):若x、y、z中0的个数比较多,返回0;否则返回1。
- 令m = maj(x8, y10, z10),若x8 = m,则执行X操作;若y10 = m,则执行Y操作;若z10 = m,则执行Z操作。
- 密钥流位s = x18 ^ y21 ^ z22。
- 重复上述步骤生成密钥流。
2.简单实现
一下用C++简单实现了一下,比较简单就不多讲了。
#include <cstdio>
#include <iostream>
#include <cstdlib>
#define _for(i,a,b) for(int i=(a); i<(b); ++i)
#define setbit(x,y) x|=(1<<y)
#define clrbit(x,y) x&=~(1<<y)
#define reversebit(x,y) x^=(1<<y)
#define getbit(x,y) (x&=(1<<y))
using namespace std;
typedef unsigned char uc;
bool x[19] = {
1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1};
bool y[22] = {
1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1}