You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

600 lines
18 KiB
C++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#pragma execution_character_set("utf-8")
// DES.cpp: implementation of the DES class.
//
//////////////////////////////////////////////////////////////////////
#include <string>
#include <memory.h>
#include "des.h"
////////////////////////////////////////////////////////////////////////
// initial permutation IP
const char IP_Table[64] = {
58, 50, 42, 34, 26, 18, 10, 2, 60, 52, 44, 36, 28, 20, 12, 4,
62, 54, 46, 38, 30, 22, 14, 6, 64, 56, 48, 40, 32, 24, 16, 8,
57, 49, 41, 33, 25, 17, 9, 1, 59, 51, 43, 35, 27, 19, 11, 3,
61, 53, 45, 37, 29, 21, 13, 5, 63, 55, 47, 39, 31, 23, 15, 7
};
// final permutation IP^-1
const char IPR_Table[64] = {
40, 8, 48, 16, 56, 24, 64, 32, 39, 7, 47, 15, 55, 23, 63, 31,
38, 6, 46, 14, 54, 22, 62, 30, 37, 5, 45, 13, 53, 21, 61, 29,
36, 4, 44, 12, 52, 20, 60, 28, 35, 3, 43, 11, 51, 19, 59, 27,
34, 2, 42, 10, 50, 18, 58, 26, 33, 1, 41, 9, 49, 17, 57, 25
};
// expansion operation matrix
const char E_Table[48] = {
32, 1, 2, 3, 4, 5, 4, 5, 6, 7, 8, 9,
8, 9, 10, 11, 12, 13, 12, 13, 14, 15, 16, 17,
16, 17, 18, 19, 20, 21, 20, 21, 22, 23, 24, 25,
24, 25, 26, 27, 28, 29, 28, 29, 30, 31, 32, 1
};
// 32-bit permutation function P used on the output of the S-boxes
const char P_Table[32] = {
16, 7, 20, 21, 29, 12, 28, 17, 1, 15, 23, 26, 5, 18, 31, 10,
2, 8, 24, 14, 32, 27, 3, 9, 19, 13, 30, 6, 22, 11, 4, 25
};
// permuted choice table (key)
const char PC1_Table[56] = {
57, 49, 41, 33, 25, 17, 9, 1, 58, 50, 42, 34, 26, 18,
10, 2, 59, 51, 43, 35, 27, 19, 11, 3, 60, 52, 44, 36,
63, 55, 47, 39, 31, 23, 15, 7, 62, 54, 46, 38, 30, 22,
14, 6, 61, 53, 45, 37, 29, 21, 13, 5, 28, 20, 12, 4
};
// permuted choice key (table)
const char PC2_Table[48] = {
14, 17, 11, 24, 1, 5, 3, 28, 15, 6, 21, 10,
23, 19, 12, 4, 26, 8, 16, 7, 27, 20, 13, 2,
41, 52, 31, 37, 47, 55, 30, 40, 51, 45, 33, 48,
44, 49, 39, 56, 34, 53, 46, 42, 50, 36, 29, 32
};
// number left rotations of pc1
const char LOOP_Table[16] = {
1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1
};
// The (in)famous S-boxes
const char S_Box[8][4][16] = {
// S1
14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7,
0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8,
4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0,
15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13,
// S2
15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10,
3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5,
0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15,
13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9,
// S3
10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8,
13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1,
13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7,
1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12,
// S4
7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15,
13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9,
10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4,
3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14,
// S5
2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9,
14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6,
4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14,
11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3,
// S6
12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11,
10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8,
9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6,
4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13,
// S7
4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1,
13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6,
1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2,
6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12,
// S8
13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7,
1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2,
7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8,
2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11
};
//DES::DES()
//{
// m_mode = DM_CBC;
// m_pad_type = PT_ISO_1;
//}
DES::DES(DES_MODE mode, PAD_TYPE pad_type)
{
m_mode = mode;
m_pad_type = pad_type;
}
DES::~DES()
{
}
/*******************************************************************/
/*
<20><> <20><> <20><> <20><>: ByteToBit
<20><> <20><> <20><> <20><><EFBFBD><EFBFBD> <20><>BYTEת<45><D7AA>ΪBit<69><74>
<20><> <20><> ˵ <20><><EFBFBD><EFBFBD> Out: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Bit<69><74>[in][out]
In: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>BYTE<54><45>[in]
bits: Bit<69><74><EFBFBD>ij<EFBFBD><C4B3><EFBFBD>[in]
<20><><EFBFBD><EFBFBD>ֵ ˵<><CBB5><EFBFBD><EFBFBD> void
/*******************************************************************/
void ByteToBit(bool *Out, const char *In, int bits)
{
for(int i=0; i<bits; ++i)
Out[i] = (In[i>>3]>>(7 - i&7)) & 1;
}
/*******************************************************************/
/*
<20><> <20><> <20><> <20><>: BitToByte
<20><> <20><> <20><> <20><><EFBFBD><EFBFBD> <20><>Bitת<74><D7AA>ΪByte<74><65>
<20><> <20><> ˵ <20><><EFBFBD><EFBFBD> Out: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>BYTE<54><45>[in][out]
In: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Bit<69><74>[in]
bits: Bit<69><74><EFBFBD>ij<EFBFBD><C4B3><EFBFBD>[in]
<20><><EFBFBD><EFBFBD>ֵ ˵<><CBB5><EFBFBD><EFBFBD> void
/*******************************************************************/
void BitToByte(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 - i&7);
}
/*******************************************************************/
/*
<20><> <20><> <20><> <20><>: RotateL
<20><> <20><> <20><> <20><><EFBFBD><EFBFBD> <20><>BIT<49><54><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<20><> <20><> ˵ <20><><EFBFBD><EFBFBD> In: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Bit<69><74>[in]
len: Bit<69><74><EFBFBD>ij<EFBFBD><C4B3><EFBFBD>[in]
loop: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ij<EFBFBD><C4B3><EFBFBD>
<20><><EFBFBD><EFBFBD>ֵ ˵<><CBB5><EFBFBD><EFBFBD> void
/*******************************************************************/
void RotateL(bool *In, int len, int loop)
{
bool Tmp[256];
memcpy(Tmp, In, loop);
memcpy(In, In+loop, len-loop);
memcpy(In+len-loop, Tmp, loop);
}
/*******************************************************************/
/*
<20><> <20><> <20><> <20><>: Xor
<20><> <20><> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Bit<69><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<20><> <20><> ˵ <20><><EFBFBD><EFBFBD> InA: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Bit<69><74>[in][out]
InB: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Bit<69><74>[in]
loop: Bit<69><74><EFBFBD>ij<EFBFBD><C4B3><EFBFBD>
<20><><EFBFBD><EFBFBD>ֵ ˵<><CBB5><EFBFBD><EFBFBD> void
/*******************************************************************/
void Xor(bool *InA, const bool *InB, int len)
{
for(int i=0; i<len; ++i)
InA[i] ^= InB[i];
}
/*******************************************************************/
/*
<20><> <20><> <20><> <20><>: Transform
<20><> <20><> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Bit<69><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λת<CEBB><D7AA>
<20><> <20><> ˵ <20><><EFBFBD><EFBFBD> Out: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Bit<69><74>[out]
In: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Bit<69><74>[in]
Table: ת<><D7AA><EFBFBD><EFBFBD>Ҫ<EFBFBD>ı<EFBFBD>ָ<EFBFBD><D6B8>
len: ת<><D7AA><EFBFBD><EFBFBD><EFBFBD>ij<EFBFBD><C4B3><EFBFBD>
<20><><EFBFBD><EFBFBD>ֵ ˵<><CBB5><EFBFBD><EFBFBD> void
/*******************************************************************/
void Transform(bool *Out, bool *In, const char *Table, int len)
{
bool Tmp[256];
for(int i=0; i<len; ++i)
Tmp[i] = In[ Table[i]-1 ];
memcpy(Out, Tmp, len);
}
/*******************************************************************/
/*
<20><> <20><> <20><> <20><>: S_func
<20><> <20><> <20><> <20><><EFBFBD><EFBFBD> ʵ<><CAB5><EFBFBD><EFBFBD><EFBFBD>ݼ<EFBFBD><DDBC><EFBFBD>S BOXģ<58><C4A3>
<20><> <20><> ˵ <20><><EFBFBD><EFBFBD> Out: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>32Bit[out]
In: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>48Bit[in]
<20><><EFBFBD><EFBFBD>ֵ ˵<><CBB5><EFBFBD><EFBFBD> void
/*******************************************************************/
void S_func(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]; //<2F><>֯SID<49>±<EFBFBD>
for(int l=0; l<4; ++l) //<2F><><EFBFBD><EFBFBD>Ӧ4bit<69><74>ֵ
Out[l] = (S_Box[i][j][k]>>(3 - l)) & 1;
}
}
/*******************************************************************/
/*
<20><> <20><> <20><> <20><>: F_func
<20><> <20><> <20><> <20><><EFBFBD><EFBFBD> ʵ<><CAB5><EFBFBD><EFBFBD><EFBFBD>ݼ<EFBFBD><DDBC>ܵ<EFBFBD><DCB5><EFBFBD><EFBFBD><EFBFBD>P
<20><> <20><> ˵ <20><><EFBFBD><EFBFBD> Out: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>32Bit[out]
In: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>48Bit[in]
<20><><EFBFBD><EFBFBD>ֵ ˵<><CBB5><EFBFBD><EFBFBD> void
/*******************************************************************/
void F_func(bool In[32], const bool Ki[48])
{
bool MR[48];
Transform(MR, In, E_Table, 48);
Xor(MR, Ki, 48);
S_func(In, MR);
Transform(In, In, P_Table, 32);
}
bool DES::Encrypt(char *in, unsigned int inLen, const char *key, unsigned char keyLen, char *out)
{
std::string s(in, inLen);
RunPad(s);
//return RunDes(DT_ENCRYPT, in, inLen, key, keyLen, out);
return RunDes(DT_ENCRYPT, s.c_str(), s.length(), key, keyLen, out);
}
bool DES::Decrypt(char *in, unsigned int inLen, const char *key, unsigned char keyLen, char *out)
{
std::string s(in, inLen);
RunPad(s);
//return RunDes(DT_DECRYPT, in, inLen, key, keyLen, out);
return RunDes(DT_DECRYPT, s.c_str(), s.length(), key, keyLen, out);
}
/*******************************************************************/
/*
<20><> <20><> <20><> <20><>: RunDes
<20><> <20><> <20><> <20><><EFBFBD><EFBFBD> ִ<><D6B4>DES<45><EFBFBD><E3B7A8><EFBFBD>ı<EFBFBD><C4B1>ӽ<EFBFBD><D3BD><EFBFBD>
<20><> <20><> ˵ <20><><EFBFBD><EFBFBD> desType :<3A><><EFBFBD>ͣ<EFBFBD><CDA3><EFBFBD><EFBFBD><EFBFBD>ENCRYPT<50><54><EFBFBD><EFBFBD><EFBFBD><EFBFBD>DECRYPT
in :<3A><><EFBFBD><EFBFBD><EFBFBD>ܴ<EFBFBD>ָ<EFBFBD><D6B8>
inLen :<3A><><EFBFBD><EFBFBD><EFBFBD>ܴ<EFBFBD><DCB4>ij<EFBFBD><C4B3>ȣ<EFBFBD>ͬʱOut<75>Ļ<EFBFBD><C4BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>СӦ<D0A1><D3A6><EFBFBD>ڻ<EFBFBD><DABB>ߵ<EFBFBD><DFB5><EFBFBD>datalen
key :<3A><>Կ(<28><>Ϊ8λ,16λ,24λ)֧<><D6A7>3<EFBFBD><33>Կ
keyLen :<3A><>Կ<EFBFBD><D4BF><EFBFBD>ȣ<EFBFBD><C8A3><EFBFBD><EFBFBD><EFBFBD>24λ<34><CEBB><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6>ü<EFBFBD>
out :<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
<20><><EFBFBD><EFBFBD>ֵ ˵<><CBB5><EFBFBD><EFBFBD> bool :<3A>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>ܳɹ<DCB3>
/*******************************************************************/
//bool DES::RunDes(DES_TYPE desType,char* In,char* Out,unsigned datalen,const char* Key,const unsigned char keylen)
bool DES::RunDes(DES_TYPE desType, const char* in,unsigned int inLen, const char* key,const unsigned char keyLen, char* out)
{
//<2F>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϸ<EFBFBD><CFB7><EFBFBD>
if(!(in && out && key && inLen && keyLen>=8))
{
return false;
}
//ֻ<><D6BB><EFBFBD><EFBFBD>8<EFBFBD><38><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E3B3A4><EFBFBD>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD>
if(inLen & 0x00000007)
return false;
bool m_SubKey[3][16][48]; //<2F><>Կ
//<2F><><EFBFBD><EFBFBD><ECB2A2><EFBFBD><EFBFBD>SubKeys
unsigned char nKey = (keyLen>>3)>3 ? 3: (keyLen>>3);
for(int i=0; i < nKey; i++)
{
SetSubKey(&m_SubKey[i], &key[i<<3]);
}
if(m_mode == DM_ECB) //ECBģʽ
{
if(nKey == 1) //<2F><>Key
{
for(int i = 0, j = inLen >> 3; i<j; ++i, out += 8, in += 8)
{
Des(out, in, &m_SubKey[0], desType);
}
}
else if(nKey == 2) //3DES 2Key
{
for(int i = 0, j = inLen >> 3; i<j; ++i, out += 8, in += 8)
{
Des(out, in, &m_SubKey[0], desType);
Des(out, out, &m_SubKey[1], ((desType == DT_ENCRYPT) ? (DT_DECRYPT) : (DT_ENCRYPT)));
Des(out, out, &m_SubKey[0], desType);
}
}
else //3DES 3Key
{
for(int i = 0, j = inLen >> 3; i<j; ++i, out += 8, in += 8)
{
Des(out, in, &m_SubKey[desType ? 2 : 0], desType);
Des(out, out, &m_SubKey[1], ((desType == DT_ENCRYPT) ? (DT_DECRYPT) : (DT_ENCRYPT)));
Des(out, out, &m_SubKey[desType ? 0 : 2], desType);
}
}
}
else //CBCģʽ
{
char cvec[8] = ""; //Ťת<C5A4><D7AA><EFBFBD><EFBFBD>
char cvin[8] = ""; //<2F>м<EFBFBD><D0BC><EFBFBD><EFBFBD><EFBFBD>
if(nKey == 1) //<2F><>Key
{
for(int i = 0, j = inLen >> 3; i<j; ++i, out += 8, in += 8)
{
if(desType == DT_ENCRYPT)
{
for(int j = 0; j < 8; ++j) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ťת<C5A4><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
cvin[j] = in[j] ^ cvec[j];
}
}
else
{
memcpy(cvin, in, 8);
}
Des(out, cvin, &m_SubKey[0], desType);
if(desType == DT_ENCRYPT)
{
memcpy(cvec, out, 8); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>趨ΪŤת<C5A4><D7AA><EFBFBD><EFBFBD>
}
else
{
for(int j = 0; j < 8; ++j) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ťת<C5A4><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
out[j] = out[j] ^ cvec[j];
}
memcpy(cvec, cvin, 8); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>趨ΪŤת<C5A4><D7AA><EFBFBD><EFBFBD>
}
}
}
else if(nKey == 2) //3DES CBC 2Key
{
for(int i = 0, j = inLen >> 3; i < j; ++i, out += 8, in += 8)
{
if(desType == DT_ENCRYPT)
{
for(int j = 0; j < 8; ++j) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ťת<C5A4><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
cvin[j] = in[j] ^ cvec[j];
}
}
else
{
memcpy(cvin, in, 8);
}
Des(out, cvin, &m_SubKey[0], desType);
Des(out, out, &m_SubKey[1], ((desType==DT_ENCRYPT)?(DT_DECRYPT):(DT_ENCRYPT)));
Des(out, out, &m_SubKey[0], desType);
if(desType == DT_ENCRYPT)
{
memcpy(cvec, out, 8); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>趨ΪŤת<C5A4><D7AA><EFBFBD><EFBFBD>
}
else
{
for(int j = 0; j < 8; ++j) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ťת<C5A4><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
out[j] = out[j] ^ cvec[j];
}
memcpy(cvec, cvin, 8); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>趨ΪŤת<C5A4><D7AA><EFBFBD><EFBFBD>
}
}
}
else //3DES CBC 3Key
{
for(int i = 0, j = inLen >> 3; i < j; ++i, out += 8, in += 8)
{
if(desType == DT_ENCRYPT)
{
for(int j = 0; j < 8; ++j) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ťת<C5A4><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
cvin[j] = in[j] ^ cvec[j];
}
}
else
{
memcpy(cvin, in, 8);
}
Des(out, cvin, &m_SubKey[desType ? 2 : 0], desType);
Des(out, out, &m_SubKey[1], ((desType==DT_ENCRYPT)?(DT_DECRYPT):(DT_ENCRYPT)));
Des(out, out, &m_SubKey[desType ? 0 : 2], desType);
if(desType == DT_ENCRYPT)
{
memcpy(cvec, out, 8); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>趨ΪŤת<C5A4><D7AA><EFBFBD><EFBFBD>
}
else
{
for(int j = 0; j < 8; ++j) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ťת<C5A4><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
out[j] = out[j] ^ cvec[j];
}
memcpy(cvec,cvin,8); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>趨ΪŤת<C5A4><D7AA><EFBFBD><EFBFBD>
}
}
}
}
return true;
}
/*******************************************************************/
/*
<20><> <20><> <20><> <20><>: RunPad
<20><> <20><> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Э<EFBFBD><D0AD><EFBFBD>Լ<EFBFBD><D4BC><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD>ݽ<EFBFBD><DDBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<20><> <20><> ˵ <20><><EFBFBD><EFBFBD> nPadType :<3A><><EFBFBD>ͣ<EFBFBD>PAD<41><44><EFBFBD><EFBFBD>
In :<3A><><EFBFBD>ݴ<EFBFBD>ָ<EFBFBD><D6B8>
Out :<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
datalen :<3A><><EFBFBD>ݵij<DDB5><C4B3><EFBFBD>
padlen :(in,out)<29><><EFBFBD><EFBFBD>buffer<65>ij<EFBFBD><C4B3>ȣ<EFBFBD><C8A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ij<EFBFBD><C4B3><EFBFBD>
<20><><EFBFBD><EFBFBD>ֵ ˵<><CBB5><EFBFBD><EFBFBD> bool :<3A>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD>
/*******************************************************************/
bool DES::RunPad(const char* in,unsigned int inLen,char* out,unsigned int &padlen)
{
int res = (inLen & 0x00000007);
if(res == 0)
{
return true;
}
//if(padlen < (inLen + 8 - res))
//{
// return false;
//}
//else
//{
padlen = (inLen + 8 - res);
memcpy(out, in, inLen);
//}
if(m_pad_type == PT_ISO_1)
{
memset(out + inLen, 0x00, 8 - res);
}
else if(m_pad_type == PT_ISO_2)
{
memset(out + inLen, 0x80, 1);
memset(out + inLen, 0x00, 7 - res);
}
else if(m_pad_type == PT_PKCS_7)
{
memset(out + inLen, 8 - res, 8 - res);
}
else
{
return false;
}
return true;
}
bool DES::RunPad(std::string &in)
{
int res = (in.length() & 0x00000007);
if(res == 0)
{
return true;
}
if(m_pad_type == PT_ISO_1)
{
in.append(8-res, 0x00);
}
else if(m_pad_type == PT_ISO_2)
{
in.append(1, 0x80);
if(7 - res > 0)
{
in.append(7 - res, 0x00);
}
}
else if(m_pad_type == PT_PKCS_7)
{
in.append(8-res, 8-res);
}
else
{
return false;
}
return true;
}
//<2F><><EFBFBD><EFBFBD><E3B2A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Կ<EFBFBD><D4BF>SubKey<65><79><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void DES::SetSubKey(PSubKey pSubKey, const char Key[8])
{
bool K[64], *KL=&K[0], *KR=&K[28];
ByteToBit(K, Key, 64);
Transform(K, K, PC1_Table, 56);
for(int i=0; i<16; ++i) {
RotateL(KL, 28, LOOP_Table[i]);
RotateL(KR, 28, LOOP_Table[i]);
Transform((*pSubKey)[i], K, PC2_Table, 48);
}
}
//DES<45><53>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD>
void DES::Des(char Out[8], const char In[8], const PSubKey pSubKey, DES_TYPE desType)
{
bool M[64], tmp[32], *Li=&M[0], *Ri=&M[32];
ByteToBit(M, In, 64);
Transform(M, M, IP_Table, 64);
if( desType == DT_ENCRYPT )
{
for(int i=0; i<16; ++i)
{
memcpy(tmp, Ri, 32); //Ri[i-1] <20><><EFBFBD><EFBFBD>
F_func(Ri, (*pSubKey)[i]); //Ri[i-1]<5D><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>SBox<6F><78><EFBFBD><EFBFBD>ΪP
Xor(Ri, Li, 32); //Ri[i] = P XOR Li[i-1]
memcpy(Li, tmp, 32); //Li[i] = Ri[i-1]
}
}
else
{
for(int i=15; i>=0; --i)
{
memcpy(tmp, Ri, 32); //Ri[i-1] <20><><EFBFBD><EFBFBD>
F_func(Ri, (*pSubKey)[i]); //Ri[i-1]<5D><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>SBox<6F><78><EFBFBD><EFBFBD>ΪP
Xor(Ri, Li, 32); //Ri[i] = P XOR Li[i-1]
memcpy(Li, tmp, 32); //Li[i] = Ri[i-1]
}
}
RotateL(M,64,32); //Ri<52><69>Li<4C><69>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>M
Transform(M, M, IPR_Table, 64); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>
BitToByte(Out, M, 64); //<2F><>֯<EFBFBD><D6AF><EFBFBD>ַ<EFBFBD>
}
/*
std::string des_encrypt(std::string in, std::string key)
{
}
std::string des_decrypt(std::string in, std::string key)
{
}
*/