DES加密算法模块
来源:互联网 发布:手机淘宝怎么查询等级 编辑:程序博客网 时间:2024/05/15 16:11
DES.h/*----------------------------------------------------------------------------
DES加密算法模块
2008.10.12
----------------------------------------------------------------------------*/
#include"DefineDESdata.h"
#define ENCRYPT 0
#define DECRYPT 1
typedef bool (*PSubKey)[16][48];
static bool SubKey[2][16][48];/*两个密钥的16轮子密钥*/
static char Tmp[256], deskey[16];
/*通用置换函数*/
void Transform(bool *Out, bool *In, const char *Table, int len)
{
bool Tmp[64];
for(int i = 0; i < len; ++ i) Tmp = In[ Table - 1 ];
memcpy(Out, Tmp, len);
}
/*字节转换成位*/
void Byte2Bit(bool *Out, const char *In, int bits)
{
for(int i = 0; i < bits; ++ i) Out = (In[i >> 3] >> (i & 7)) & 1;
}
/*位转换字节*/
void Bit2Byte(char *Out, const bool *In, int bits)
{
memset(Out, 0, bits >> 3);
for(int i = 0; i < bits; ++ i) Out[i >> 3] |= In << (i & 7);
}
/*异或运算*/
void Xor(bool *InA, const bool *InB, int len)
{
for(int i = 0; i < len; ++ i) InA ^= InB;
}
/*循环左移*/
void MoveLeft(bool *In, int len, int loop)
{
memcpy(Tmp, In, loop);
memcpy(In, In + loop, len - loop);
memcpy(In + len - loop, Tmp, loop);
}
/* S盒置换*/
void funS(bool Out[32], const bool In[48])
{
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];
Byte2Bit(Out, &Box_S[j][k], 4);
}
}
/* F函数*/
void funF(bool In[32], const bool Ki[48])
{
bool MR[48];
Transform(MR, In, Table_E, 48);
Xor(MR, Ki, 48);
funS(In, MR);
Transform(In, In, Table_P, 32);
}
/*生成子密钥*/
void MakeSubKey(PSubKey pSubKey, const char Key[8])
{
bool K[64], *KL = &K[0], *KR = &K[28];
Byte2Bit(K, Key, 64);
Transform(K, K, Table_PC1, 56);
for(int i = 0; i < 16; ++ i)
{
MoveLeft(KL, 28, Table_Moveleft);
MoveLeft(KR, 28, Table_Moveleft);
Transform((*pSubKey), K, Table_PC2, 48);
}
}
/*生成密钥*/
void MakeKey(const char* Key, int len)
{
memset(deskey, 0, 16);
memcpy(deskey, Key, len > 16 ? 16 : len);
MakeSubKey(&SubKey[0], &deskey[0]);
MakeSubKey(&SubKey[1], &deskey[8]);
}
//一重DES加/解密
void DES(char Out[8], char In[8], const PSubKey pSubKey, bool Type)
{
bool M[64], tmp[32], *Li = &M[0], *Ri = &M[32];
Byte2Bit(M, In, 64);
Transform(M, M, Table_IP, 64);
if( Type == ENCRYPT )/*加密*/
{
for(int i = 0; i < 16; ++ i)
{
memcpy(tmp, Ri, 32);
funF(Ri, (*pSubKey));
Xor(Ri, Li, 32);
memcpy(Li, tmp, 32);
}
}
else /*解密*/
{
for(int i = 15; i >= 0; -- i)
{
memcpy(tmp, Li, 32);
funF(Li, (*pSubKey));
Xor(Li, Ri, 32);
memcpy(Ri, tmp, 32);
}
}
Transform(M, M, Table_InverseIP, 64);
Bit2Byte(Out, M, 64);
}
/* 3次DES 加密:加(key0)-解(key1)-加(key0) 解密:解(key0)-加(key1)-解(key0)*/
bool DoDES(char *Out, char *In, long datalen, const char *Key, int keylen, bool Type)
{
if(!(Out && In && Key && (datalen=(datalen+7)&0xfffffff8))) return false;
MakeKey(Key, keylen);
for(long i = 0, j = datalen >> 3; i < j; ++ i, Out += 8, In += 8)
{
DES(Out, In, &SubKey[0], Type);
DES(Out, Out, &SubKey[1], !Type);
DES(Out, Out, &SubKey[0], Type);
}
return true;
}
DES加密算法模块
2008.10.12
----------------------------------------------------------------------------*/
#include"DefineDESdata.h"
#define ENCRYPT 0
#define DECRYPT 1
typedef bool (*PSubKey)[16][48];
static bool SubKey[2][16][48];/*两个密钥的16轮子密钥*/
static char Tmp[256], deskey[16];
/*通用置换函数*/
void Transform(bool *Out, bool *In, const char *Table, int len)
{
bool Tmp[64];
for(int i = 0; i < len; ++ i) Tmp = In[ Table - 1 ];
memcpy(Out, Tmp, len);
}
/*字节转换成位*/
void Byte2Bit(bool *Out, const char *In, int bits)
{
for(int i = 0; i < bits; ++ i) Out = (In[i >> 3] >> (i & 7)) & 1;
}
/*位转换字节*/
void Bit2Byte(char *Out, const bool *In, int bits)
{
memset(Out, 0, bits >> 3);
for(int i = 0; i < bits; ++ i) Out[i >> 3] |= In << (i & 7);
}
/*异或运算*/
void Xor(bool *InA, const bool *InB, int len)
{
for(int i = 0; i < len; ++ i) InA ^= InB;
}
/*循环左移*/
void MoveLeft(bool *In, int len, int loop)
{
memcpy(Tmp, In, loop);
memcpy(In, In + loop, len - loop);
memcpy(In + len - loop, Tmp, loop);
}
/* S盒置换*/
void funS(bool Out[32], const bool In[48])
{
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];
Byte2Bit(Out, &Box_S[j][k], 4);
}
}
/* F函数*/
void funF(bool In[32], const bool Ki[48])
{
bool MR[48];
Transform(MR, In, Table_E, 48);
Xor(MR, Ki, 48);
funS(In, MR);
Transform(In, In, Table_P, 32);
}
/*生成子密钥*/
void MakeSubKey(PSubKey pSubKey, const char Key[8])
{
bool K[64], *KL = &K[0], *KR = &K[28];
Byte2Bit(K, Key, 64);
Transform(K, K, Table_PC1, 56);
for(int i = 0; i < 16; ++ i)
{
MoveLeft(KL, 28, Table_Moveleft);
MoveLeft(KR, 28, Table_Moveleft);
Transform((*pSubKey), K, Table_PC2, 48);
}
}
/*生成密钥*/
void MakeKey(const char* Key, int len)
{
memset(deskey, 0, 16);
memcpy(deskey, Key, len > 16 ? 16 : len);
MakeSubKey(&SubKey[0], &deskey[0]);
MakeSubKey(&SubKey[1], &deskey[8]);
}
//一重DES加/解密
void DES(char Out[8], char In[8], const PSubKey pSubKey, bool Type)
{
bool M[64], tmp[32], *Li = &M[0], *Ri = &M[32];
Byte2Bit(M, In, 64);
Transform(M, M, Table_IP, 64);
if( Type == ENCRYPT )/*加密*/
{
for(int i = 0; i < 16; ++ i)
{
memcpy(tmp, Ri, 32);
funF(Ri, (*pSubKey));
Xor(Ri, Li, 32);
memcpy(Li, tmp, 32);
}
}
else /*解密*/
{
for(int i = 15; i >= 0; -- i)
{
memcpy(tmp, Li, 32);
funF(Li, (*pSubKey));
Xor(Li, Ri, 32);
memcpy(Ri, tmp, 32);
}
}
Transform(M, M, Table_InverseIP, 64);
Bit2Byte(Out, M, 64);
}
/* 3次DES 加密:加(key0)-解(key1)-加(key0) 解密:解(key0)-加(key1)-解(key0)*/
bool DoDES(char *Out, char *In, long datalen, const char *Key, int keylen, bool Type)
{
if(!(Out && In && Key && (datalen=(datalen+7)&0xfffffff8))) return false;
MakeKey(Key, keylen);
for(long i = 0, j = datalen >> 3; i < j; ++ i, Out += 8, In += 8)
{
DES(Out, In, &SubKey[0], Type);
DES(Out, Out, &SubKey[1], !Type);
DES(Out, Out, &SubKey[0], Type);
}
return true;
}
0 0
- DES加密算法模块
- DES加密算法
- DES加密算法
- DES 加密算法
- DES加密算法
- DES加密算法
- DES 加密算法
- DES 加密算法
- DES加密算法
- DES加密算法
- DES加密算法
- DES加密算法
- DES加密算法
- DES加密算法
- DES加密算法
- DES加密算法
- des加密算法
- DES加密算法
- 用动态web工程建一个Maven项目
- CalendarPad
- HDU 3861 The King’s Problem 强连通+最小路径覆盖
- Kafka/Metaq设计思想学习笔记
- 蓝桥杯——说好的进阶之回溯法
- DES加密算法模块
- 黑马程序员_笔记十六_基础加强之泛型
- 面试杂题(三)有序数组中连续k的个数(含二分搜索的递归非递归写法)
- iOS 搜索功能的实现
- slice vs splice
- ping命令
- jquery页面初始化
- Unity3D-碰撞测试
- 3 Objective-C(1)