?? unitkeys.cpp
字號:
//---------------------------------------------------------------------------
#pragma hdrstop
#include <stdlib.h>
#include <memory.h>
#include <vcl.h>
#include <stdio.h>
#include "UnitKeys.h"
static char srcData[9];
//---------------------------------------------------------------------------
//隨機生成一個八位的子密鑰
unsigned int GetRandKey()
{
return random(95)+32;
}
//---------------------------------------------------------------------------
//修正對64字節數組形式的子密鑰
void CheckSumBits(char* S)
{
unsigned int i,j,sum;
for (i=0;i<8;i++)
{
sum = 0x1;
for (j=0;j<7;j++)
sum ^= S[i*8+j];
S[i*8+7]=sum;
}
}
//---------------------------------------------------------------------------
//把字符串型子密鑰轉成字節的數組,一個char表示一個二進制位
void BytesToBits(const char* S, char *bits, int len)
{
int i;
for(int i=0; i<len; ++i)
bits[i] = (S[i>>3]>>(i&7)) & 1;
}
//---------------------------------------------------------------------------
//把字節的數組轉成字符串型子密鑰,一個char表示一個二進制位
void BitsToBytes(char* S, const char *bits, int len)
{
int i;
memset(S, 0, len>>3);
for(i=0; i<len; i++)
S[i>>3] |= bits[i]<<(i&7);
}
//---------------------------------------------------------------------------
//應用一個置換,把In數組中的數據轉換后放到Out數組中
void Transform(const char *Table, char *In, char *Out, int len)
{
int i;
char Temp[256];
for (i=0;i<len;i++)
Temp[i]=In[Table[i]-1];
for (i=0;i<len;i++)
Out[i]=Temp[i];
}
//---------------------------------------------------------------------------
//循環左移Loop位
void RotateL(char *In, char *Out, int len, int loop)
{
char TMP[256];
memcpy(TMP+len-loop, In, loop);
memcpy(TMP, In+loop, len-loop);
memcpy(Out, TMP, len);
}
//---------------------------------------------------------------------------
//生成16個子密鑰
void MakeSubKey(char* In)
{
int i;
char SourceKey[64];
//轉換成原始的64字節數組
BytesToBits(In, SourceKey, 64);
// memcpy(SourceKey, In, 64);
//取得C0和D0數據
Transform(PC1_Table, SourceKey, CD[0], 56);
//生成子密鑰
for (i=0;i<16;i++)
{
//左移
RotateL(CD[i],CD[i+1],28,LOOP_Table[i]);
RotateL(CD[i]+28,CD[i+1]+28,28,LOOP_Table[i]);
//置換2生成SubKeys[i]
Transform(PC2_Table, CD[i+1], SubKeys[i], 48);
SubKeys[i][48] = 0;
}
}
//---------------------------------------------------------------------------
//異或
void Xor(char *InA, const char *InB, int len)
{
for(int i=0; i<len; ++i)
InA[i] = (InA[i] ^ InB[i]) & 0x01;
}
//---------------------------------------------------------------------------
void F_func(char *In, char *Out, const char *Ki)
{
static char MR[48];
Transform(E_Table, In, MR, 48);
Xor(MR, Ki, 48);
S_func(Out, MR);
Transform(P_Table, Out, Out, 32);
}
//---------------------------------------------------------------------------
void S_func(char *Out, const char *In)
{
for(char i=0,j,k; i<8; ++i,In+=6,Out+=4)
{
j = (In[0]<<1) + In[5];
k = (In[1]<<3) + (In[2]<<2) + (In[3]<<1) + In[4];
BytesToBits(&S_Box[i][j][k], Out, 4);
}
}
//---------------------------------------------------------------------------
//生成IP表及相應的逆身表IP^-1
void GenIPTable()
{
int i, j;
memset(IP_Table, 0, 64);
memset(IPR_Table, 0, 64);
for (i=0;i<64;i++)
{
j = random(64);
while (IPR_Table[j]!=0)
j = random(64);
IP_Table[i] = j+1;
IPR_Table[j] = i+1;
}
}
//---------------------------------------------------------------------------
//DES過程,輸入64位明文,加密或解密標志,輸出64位密文
void DES(const char *Src, char *Dest, bool flag)
{
char DestBin[64];
int i, Loop;
Loop = ((DesLoop>16) || (DesLoop<1)) ? 16 : DesLoop;
//得到LR[0]
BytesToBits(Src, LR[0],64);
//經過初始置換
Transform(IP_Table, LR[0], LR[0], 64);
//經過16輪加密
for (i=0;i<Loop;i++)
{
memcpy(LR[i+1],LR[i]+32,32);
if (flag)
F_func(LR[i]+32, LR[i+1]+32, SubKeys[i]);
else
F_func(LR[i]+32, LR[i+1]+32, SubKeys[Loop-1-i]);
Xor(LR[i+1]+32, LR[i], 32);
}
//把R16和L16聯成64位出輸
RotateL(LR[Loop],LR[Loop],64,32);
//經過最終置換
Transform(IPR_Table, LR[Loop], DestBin, 64);
//輸出
BitsToBytes(Dest, DestBin, 64);
}
//---------------------------------------------------------------------------
//加密過程
void Encrypt(const char *Src, char *Dest)
{
DES(Src, Dest, true);
}
//---------------------------------------------------------------------------
//解密過程
void DeEncrypt(const char *Src, char *Dest)
{
DES(Src, Dest, false);
}
//---------------------------------------------------------------------------
bool SetIPTable(const char *In)
{
int i, j;
memcpy(IP_Table, In, 64);
memset(IPR_Table, 0, 64);
for (i=0;i<64;i++)
{
if (IPR_Table[IP_Table[i]-1]!=0)
return false;
IPR_Table[IP_Table[i]-1] = i+1;
}
return true;
}
//---------------------------------------------------------------------------
void MakeSubKey2(char* In)
{
int i;
char SourceKey[64];
//轉換成原始的64字節數組
BytesToBits(In, SourceKey, 64);
for (i=0;i<16;i++)
Transform(KeyTable[i], SourceKey, SubKeys[i],48);
}
#pragma package(smart_init)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -