A5算法
具体的算法过程就不详细介绍了,这是根据《现代密码学教程》一书所写的。我的程序中没有初始化过程,那个我不是太懂怕弄错了就不写了。刚学的Java,能力有限就只能写成这个样子o(╥﹏╥)o了
package cryptology;
import java.util.Scanner;
public class A5_1 {
public static void main(String []args)
{
System.out.println("*******************************A5/1**********************************");
System.out.println("text输入可以是任何字符");
System.out.println("key只能是十六进制符号,只能是64比特");
System.out.println("*******************************A5/1**********************************");
int stop=0;
while(stop==0)
{
System.out.println("Please select 0加密 or 1解密:");
int select;
Scanner input0=new Scanner(System.in);
select=input0.nextInt();
System.out.println("Please input your text:");
Scanner input=new Scanner(System.in);
String text=input.nextLine();
System.out.println("Please input your key:");
Scanner input1=new Scanner(System.in);
String key=input1.nextLine();
if(select==0)
encrypt(text,key);
else
decode(text,key);
System.out.println("***********press 0 to continue,press 1 to stop************");
Scanner input4=new Scanner(System.in);
stop=input4.nextInt();
}
}
public static void decode(String text,String key)//解密
{
int length=text.length();
int []binarytext=new int[length];
for(int g=0;g<length;g++)
binarytext[g]=text.charAt(g)-48;
int []key19=new int[19];
int []key22=new int[22];
int []key23=new int[23];
LFSRkey(key,key19,key22,key23);
int []sessionkey=new int[114];
int L=(int)Math.ceil(length*1.0/114);
int f=0;
for(int o=0;o<L;o++)
{
sessionKey(sessionkey,key19,key22,key23);
for(int j=0;j<length;j++)
{
binarytext[f]=binarytext[f]^sessionkey[j];
f++;
if(j==113)
break;
}
}
BinstrToChar(binarytext);
}
public static void encrypt(String text,String key)//加密
{
int length=text.length()*16;
int []binarytext=new int[length];
StrtoBinary(text,binarytext);
int []key19=new int[19];
int []key22=new int[22];
int []key23=new int[23];
LFSRkey(key,key19,key22,key23);
int []sessionkey=new int[114];
int L=(int)Math.ceil(length*1.0/114);
int f=0;
for(int o=0;o<L;o++)
{
sessionKey(sessionkey,key19,key22,key23);
for(int j=0;j<length;j++)
{
binarytext[f]=binarytext[f]^sessionkey[j];
f++;
if(j==113)
break;
}
}
System.out.print("二进制:");
for(int s=0;s<length;s++)
System.out.print(binarytext[s]);
System.out.println();
}
public static void sessionKey(int []sessionkey,int []key1,int []key2,int []key3)//会话密钥生成
{
for(int i=0;i<114;i++)
{
int key1rightvalue;
int key2rightvalue;
int key3rightvalue;
int vote=Vote(key1[8],key2[10],key3[10]);
if(key1[8]==vote)
{
int feedback1=key1[13]^key1[16]^key1[17]^key1[18];
key1rightvalue=Toright(feedback1,key1,19);
}
else
key1rightvalue=key1[18];
if(key2[10]==vote)
{
int feedback2=key2[12]^key2[16]^key2[20]^key2[21];
key2rightvalue=Toright(feedback2,key2,22);
}
else
key2rightvalue=key2[21];
if(key3[10]==vote)
{
int feedback3=key3[17]^key3[18]^key3[21]^key3[22];
key3rightvalue=Toright(feedback3,key3,23);
}
else
key3rightvalue=key3[22];
sessionkey[i]=key1rightvalue^key2rightvalue^key3rightvalue;
}
}
public static int Vote(int a,int b,int c)//投票控制LFSR移动否
{
if(a+b+c>=2)
return 1;
else
return 0;
}
public static int Toright(int fb,int []key,int count)//数组右移
{
int rightvalue=key[count-1];
for(int i=count-1;i>1;i--)
key[i]=key[i-1];
key[0]=fb;
return rightvalue;
}
public static void LFSRkey(String key,int []key1,int []key2,int []key3)//3个LFSR生成
{
int []binarykey=new int[64];
hextobin(binarykey,key);
for(int i=0;i<19;i++)
key1[i]=binarykey[i];
for(int j=19;j<41;j++)
key2[j-19]=binarykey[j];
for(int l=41;l<64;l++)
key3[l-41]=binarykey[l];
}
public static void StrtoBinary(String str,int []binary){//字符串->二进制
char[] strChar=str.toCharArray();
for(int i=0;i<strChar.length;i++){
{
String temp= Integer.toBinaryString(strChar[i]);
int count=temp.length();
for(int j=0;j<count;j++)
binary[16*i+j+16-count]=temp.charAt(j)-48;
}
}
}
public static void BinstrToChar(int []binStr){//二进制->字符串
int []temp=binStr;
for(int j=0; j<temp.length/16;j++){
int sum=0;
for(int i=0;i<16;i++){
if(temp[j*16+i]==0)
continue;
for(int l=0;l<16-i;l++)
sum +=temp[16*(j+1)-1-l]<<l;
break;
}
System.out.print((char)sum);
}
System.out.println();
}
public static void hextobin(int []binarys,String test1)//密钥->二进制
{
String part1=test1.substring(0,8);
String part2=test1.substring(8);
long bin11=Long.parseLong(part1,16);
long bin12=Long.parseLong(part2,16);
String Bin=Long.toBinaryString(bin11);
String Bin1=Long.toBinaryString(bin12);
int a=Bin.length();
int b=Bin1.length();
for(int i=0;i<b;i++)
binarys[b-1-i]=Bin1.charAt(i)-48;
for(int i=0;i<a;i++)
binarys[a-1+32-i]=Bin.charAt(i)-48;
}
}