?? 00des_main.h
字號(hào):
#ifndef DES_MAIN_INCLUDED_
#define DES_MAIN_INCLUDED_
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "DESTables.h"
/*
char keyHex[17]={0};
char cTextHex[17]={0};
bool mTextBit[64];
bool cTextBit[64];
bool keyBit[64];
*/
char mTextChar[9]={0};
//16個(gè)子密鑰
static bool SubKey[16][48];
static bool Tmp[255];
void Transform(bool *Out, bool *In,const int *Table, int len)
{
int i;
for(i=0; i<len; ++i)
Tmp[i] = In[Table[i]-1];
memcpy(Out, Tmp, len);
}
void RotateL(bool *In, int len, int loop)
{
memcpy(Tmp, In, loop);
memcpy(In, In+loop, len-loop);
memcpy(In+len-loop, Tmp, loop);
}
void CreateSubKey(bool *Key)
{
bool Key2[56];
bool *KL=&Key2[0];
bool *KR=&Key2[28];
int i;
Transform(Key2, Key, PC1_Table, 56);
for(i=0; i<16; ++i) {
RotateL(KL, 28, LeftShift_Table[i]);
RotateL(KR, 28, LeftShift_Table[i]);
Transform(SubKey[i],Key2,PC2_Table,48);
}
}
bool weakkey(bool SubKey[16][48]){
int i,j;
bool FLAG=FALSE;
for(i=0;i<15;i++)
{
for(j=0;j<48;)
if(SubKey[i][j]!=SubKey[i+1][j])
{
FLAG=TRUE;
break; }
else j++;
}
return FLAG;
}
//字符轉(zhuǎn)化為二進(jìn)制
void CharToBit(char *in,bool *out,int LengthOfBit)
{
int i;
for(i=0;i<LengthOfBit;i++)
out[i]=(in[i/8]>>(i%8))&0x01;
}
//二進(jìn)制轉(zhuǎn)化為字符
void BitToChar(bool *in,char *out,int LengthOfBit)
{
int i;
for(i=0;i<LengthOfBit;i++)
out[i/8]|=(in[i]<<(i%8));
}
//二進(jìn)制轉(zhuǎn)化為十六進(jìn)制
void BitToHex(bool *input,char *output)
{
int i;
for(i=0;i<16;i++){
char c;
int x;
x=input[i*4]+input[i*4+1]*2+input[i*4+2]*4+input[i*4+3]*8;
if(x<10)
c='0'+x;
else
c='A'+x-10;
if(i%2)
output[i-1]=c;
else
output[i+1]=c;
}
}
//十六進(jìn)制轉(zhuǎn)化為二進(jìn)制
void HexToBit(char *input,bool *output)
{
int i;
for(i=0;i<16;i++){
int x;
if(input[i]>='A'&&input[i]<='F')
x=input[i]-'A'+10;
else
if(input[i]>='a'&&input[i]<='f')
x=input[i]-'a'+10;
else{
x=input[i]-'0';
}
if(i%2){
output[(i-1)*4]=x&0x01;
output[(i-1)*4+1]=(x>>1)&0x01;
output[(i-1)*4+2]=(x>>2)&0x01;
output[(i-1)*4+3]=(x>>3)&0x01;
}
else{
output[(i+1)*4]=x&0x01;
output[(i+1)*4+1]=(x>>1)&0x01;
output[(i+1)*4+2]=(x>>2)&0x01;
output[(i+1)*4+3]=(x>>3)&0x01;
}
}
}
//異或運(yùn)算
void Xor(bool *InA, bool *InB)
{ int i;
for(i=0; i<32; ++i)
InA[i] =InA[i]^InB[i];
}
void Function_f(bool *r_in,bool *r_out,int order)
{
bool r_tmp[48],r_tmp2[32];
int i;
//E擴(kuò)展
Transform(r_tmp,r_in,E_Table,48);
//和內(nèi)部密鑰做異或運(yùn)算
Xor(r_tmp,SubKey[order]);
for(i=0;i<8;i++){
bool tmp[6];
int j;
int row,column;
int n;
for(j=0;j<6;j++)
tmp[j]=r_tmp[i*6+j];
row=tmp[0]*2+tmp[5];
column=tmp[1]*8+tmp[2]*4+tmp[3]*2+tmp[4];
n=S_Box[i][row][column];
//十進(jìn)制n轉(zhuǎn)化為二進(jìn)制并存放r_tmp2
r_tmp2[i*4]=n&0x01;
r_tmp2[i*4+1]=(n>>1)&0x01;
r_tmp2[i*4+2]=(n>>2)&0x01;
r_tmp2[i*4+3]=(n>>3)&0x01;
}
//P置換
Transform(r_out,r_tmp2,P_Table,32);
}
//加密/解密過(guò)程
void Run(bool *input,bool *output,int FLAG)
{
int order[16];
int i;
bool tmp[64];
bool result_f[32];
bool L_tmp[32];
if(FLAG==1)
{
for(i=0;i<16;i++)
order[i]=i;
}
else
{
for(i=0;i<16;i++)
order[i]=15-i;
}
memcpy(tmp, input, 64);
//IP置換
Transform(tmp,tmp,IP_Table,64);
bool *L=&tmp[0];
bool *R=&tmp[32];
//16圈加密過(guò)程
for(i=0;i<16;i++){
memcpy(L_tmp, R, 32);
Function_f(R,result_f,order[i]);//f函數(shù)
Xor(L,result_f);//異或運(yùn)算
memcpy(R,L, 32);
memcpy(L,L_tmp, 32);
}
memcpy(output,R,32);
memcpy(output+32,L,32);
//IP逆置換
Transform(output,output,IPR_Table,64);
}
#endif
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -