?? tsttimelasted-ok-sq-ci-al-20050823.cpp~
字號:
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<malloc.h>
#include<time.h>
///////////////////////////////////////////
typedef char BYTE;
////////////////////////////////////////
void ByteToBit(BYTE *Out, BYTE *In, int bits);
void BitToByte(BYTE *Out, BYTE *In, int bits);
void RightRotate(BYTE *bit_key,int length,int *vector,int n);
void StartKey(BYTE *BitKey,BYTE *BitK1,BYTE *BitK2);
void InitLFSR(BYTE *BitK1,BYTE *BitK2,int *vector1,int *vector2);
void GeneratesB(BYTE *BitK1,BYTE *BitK2,BYTE *BitB);
void iterate(BYTE *QuenceB,BYTE *Z,BYTE *BitK2);
void GeneratesY(BYTE *BitB,BYTE *X0,BYTE *BitY);
void GeneratesZ(BYTE *BitY,BYTE *BitZ);
void GeneratesZstar(BYTE *BitY,BYTE *BitZstar);
////////////////////////////////////////
/*ByteToBit
return None;
Out:
*/
void ByteToBit(BYTE *Out, BYTE *In, int bits)
{
for(int i=0; i<bits; ++i)
Out[i] = (In[i>>3]>>(7-(i&7))) & 1;
}
void BitToByte(BYTE *Out, BYTE *In, int bits)//?
{
memset(Out, 0, bits>>3);
for(int i=0; i<bits; ++i)
{
Out[i>>3]|=In[i]<<(7-i&7);
}
}
/*LFSR運轉(zhuǎn)函數(shù)
BitKey:運轉(zhuǎn)前狀態(tài)
length:LFSR的長度
vector:LFSR的特征值
n:運轉(zhuǎn)次數(shù)*/
void RightRotate(BYTE *bit_key,int length,int *vector,int n)
{
BYTE temp=0; //temp存放當(dāng)前狀態(tài)經(jīng)過反饋函數(shù)得到的值
for(int i=0;i<n;i++)
{
//等號右邊為反饋函數(shù)
temp = bit_key[vector[0]] ^ bit_key[vector[1]] ^ bit_key[vector[2]] ^ bit_key[vector[3]] ^ bit_key[4]^1;
//整個64bit右移一位
for(int j=length;j>0;j--)
bit_key[j]=bit_key[j-1];
//用temp填補右移后的空位
bit_key[0]=temp;
}
}
/*
分離出K1和K2
BitKey:原始80bit密鑰
BitK1:32bit子密鑰
BitK2:48bit子密鑰
*/
void StartKey(BYTE *BitKey,BYTE *BitK1,BYTE *BitK2)
{
int i=0;
for(i=0;i<32;i++)
BitK1[i]=BitKey[i];
for(i=0;i<48;i++)
BitK2[i]=BitKey[i+32];
}
/*
初始化LFSR(兩個)
BitK1:子密鑰1
BitK2:子密鑰2
vector1:LFSR1的特征值
vector2:LFSR2的特征值
*/
void InitLFSR(BYTE *BitK1,BYTE *BitK2,int *vector1,int *vector2)
{
BYTE K10,K20;
BitToByte(&K10,BitK1+24,8);
BitToByte(&K20,BitK2+40,8);
RightRotate(BitK1,32,vector1,(int)K10);
RightRotate(BitK2,48,vector2,(int)K20);
}
/*
生成第一步的8bit輸出
BitK1,BitK2:運轉(zhuǎn)后的LFSR值
BitB:存放輸出的8bit*/
void GeneratesB(BYTE *BitK1,BYTE *BitK2,BYTE *BitB)
{
BitB[0]=BitK1[23];
BitB[1]=BitK2[43];
BitB[2]=BitK2[19];
BitB[3]=BitK2[0];
BitB[4]=BitK1[7];
BitB[5]=BitK2[32];
BitB[6]=BitK1[0];
BitB[7]=BitK2[13];
}
/*迭代步驟
QuenceB:存放了一系列的B值輸出(byte)
Z:最后生成的用于加密的8bit字節(jié)
BitK2:用以確定X初值*/
void iterate(BYTE *QuenceB,BYTE *Z,BYTE *BitK2)
{
BYTE *BitY,K20,X0;
BYTE *BitZ,*BitZstar;
int i=0;
BitY=(BYTE *)malloc(16);
memset(BitY,0,16);
BitZ=(BYTE *)malloc(8);
memset(BitZ,0,8);
BitZstar=(BYTE *)malloc(8);
memset(BitZstar,0,8);
BitToByte(&K20,BitK2+40,8);
for(i=0;i<1024*1024*4;i++)
{
if(i==0)
X0=K20;
else
BitToByte(&X0,BitZstar,8);
GeneratesY(QuenceB+i*8,&X0,BitY);
GeneratesZ(BitY,BitZ);
GeneratesZstar(BitY,BitZstar);
BitToByte(Z+i,BitZ,8);
}
}
/*迭代過程的Y生成過程
BitB:8bit
X0:運算所用值
BitY:存放生成的16bitY*/
void GeneratesY(BYTE *BitB,BYTE *X0,BYTE *BitY)
{
BYTE B;
int Y=0;
BitToByte(&B,BitB,8);
Y=((int)(pow((int)(B^(*X0)),2.0)+1))%(int)(pow(2,16));
ByteToBit(BitY,(BYTE *)&Y,16);
}
/*由Y根據(jù)要求生成輸出*/
void GeneratesZ(BYTE *BitY,BYTE *BitZ)
{
BitZ[0]=BitY[15];
BitZ[1]=BitY[13];
BitZ[2]=BitY[12];
BitZ[3]=BitY[9];
BitZ[4]=BitY[7];
BitZ[5]=BitY[4];
BitZ[6]=BitY[3];
BitZ[7]=BitY[2];
}
/*由Y生成,用于確定下一個X0*/
void GeneratesZstar(BYTE *BitY,BYTE *BitZstar)
{
BitZstar[0]=BitY[14];
BitZstar[1]=BitY[11];
BitZstar[2]=BitY[10];
BitZstar[3]=BitY[8];
BitZstar[4]=BitY[6];
BitZstar[5]=BitY[5];
BitZstar[6]=BitY[1];
BitZstar[7]=BitY[0];
}
/*初始化后開始運行*/
void Run(BYTE *BitK1,BYTE *BitK2,BYTE *QuenceB,int *vector1,int *vector2,BYTE *Z)
{
int i;
for(i=0;i<1024*1024*4;i++)
{
RightRotate(BitK1,32,vector1,1);
RightRotate(BitK2,48,vector2,1);
GeneratesB(BitK1,BitK2,QuenceB+i*8);
}
iterate(QuenceB,Z,BitK2);
}
void Crypt(BYTE *Out,BYTE *In,int readbyte,BYTE *Z)
{
int i=0;
for(i=0;i<readbyte;i++)
Out[i]=In[i]^Z[i];
}
void main()
{
BYTE Key[11]="Ceressiaww";
BYTE *BitKey;
BYTE *BitK1,*BitK2;
BYTE *QuenceB;
BYTE *Z;
BYTE *buf;
int vector1[5]={31,6,5,1,0},vector2[5]={47,8,6,3,0};
int i,readbyte=0;
FILE *fpr,*fpw;
clock_t start,end;
double elasped;
BitKey=(BYTE *)malloc(80);
memset(BitKey,0,80);
BitK1=(BYTE *)malloc(32);
memset(BitK1,0,32);
BitK2=(BYTE *)malloc(48);
memset(BitKey,0,48);
QuenceB=(BYTE *)malloc(8*1024*1024*4);
memset(QuenceB,0,8*1024*1024*4);
Z=(BYTE *)malloc(1024*1024*4);
memset(Z,0,1024*1024*4);
buf=(BYTE *)malloc(1024*1024*4);
memset(buf,0,1024*1024*4);
ByteToBit(BitKey,Key,80);
StartKey(BitKey,BitK1,BitK2);
InitLFSR(BitK1,BitK2,vector1,vector2);
for(i=0;i<32;i++)
{
if(i%8==0)
printf("\n");
printf("%d",BitK1[i]);
}
for(i=0;i<48;i++)
{
if(i%8==0)
printf("\n");
printf("%d",BitK2[i]);
}
start=clock();
Run(BitK1,BitK2,QuenceB,vector1,vector2,Z);
end=clock();
for(i=1024*1024*4-3;i<1024*1024*4;i++)
{
printf("%x",Z[i]);
printf("\n");
}
elasped=((double)(end-start))/CLOCKS_PER_SEC;
printf("\nGeneratesZ is %f\n",elasped);
/*
fpr=fopen("h:\\txt\\8.mp3","rb");
fpw=fopen("h:\\txt\\C8.mp3","wb");
// for(int k=0;k<1024*1024*4;k++)
// {
// rewind(fpr);
start=clock();
while(!feof(fpr))
{
memset(buf,0,1024*1024*4);
memset(Z,0,1024*1024*4);
memset(QuenceB,0,1024*1024*4*8);
memset(Z,0,1024*1024*4);
readbyte=fread(buf,1,1024*1024*4,fpr);
Run(BitK1,BitK2,QuenceB,vector1,vector2,Z);
Crypt(buf,buf,readbyte,Z);
fwrite(buf,1,readbyte,fpw);
}
end=clock();
elasped=((double)(end-start))/CLOCKS_PER_SEC;
printf("\nEncrypt-Elasped is %f\n",elasped);
// }
fclose(fpr);
fclose(fpw);
fpr=fopen("h:\\txt\\C8.mp3","rb");
fpw=fopen("h:\\txt\\PC8.mp3","wb");
start=clock();
while(!feof(fpr))
{
memset(buf,0,1024*1024*4);
memset(Z,0,1024*1024*4);
memset(QuenceB,0,1024*1024*4*8);
memset(Z,0,1024*1024*4);
readbyte=fread(buf,1,1024*1024*4,fpr);
Run(BitK1,BitK2,QuenceB,vector1,vector2,Z);
Crypt(buf,buf,readbyte,Z);
fwrite(buf,1,readbyte,fpw);
}
end=clock();
elasped=((double)(end-start))/CLOCKS_PER_SEC;
printf("\nDecrypt-Elasped is %f\n",elasped);
fclose(fpr);
fclose(fpw);
printf("\n");
for(i=0;i<10;i++)
{
printf("%x",Z[i]);
printf("\n");
}*/
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -