?? cryptogram.cpp
字號:
// cryptogram.cpp: implementation of the Ccryptogram class.
//
//////////////////////////////////////////////////////////////////////
#include "memory.h"
#include "md5.h"
#include "cryptogram.h"
#include "d3des.h"
#define CREPTY_VER 0x01
/* 函數說明:這個函數是產生簽名的時候調用
* 參數說明:wPlainLen :明文長度
* pbyPlain :指向明文的指針
* wSignLen :簽名長度
* pbySign :指向簽名的指針
* 返回值: 0x00 :成功
* 0x01 :作簽名失敗
* 0x02 :存放簽名的空間太小
*
*/
unsigned char TFCA_CreatSign(unsigned short wPlainLen, unsigned char *pbyPlain,
unsigned short wSignLen, unsigned char *pbySign)
{
if(wSignLen < 16)
return 0x02;
if(TFCA_MD5(pbyPlain,wPlainLen,pbySign) != 0x00)
return 0x01;
return 0x00;
}
/* 函數說明:這個函數是驗證簽名的時候調用
* 參數說明:wPlainLen :明文長度
* pbyPlain :指向明文的指針
* wSignLen :簽名長度
* pbySign :指向簽名的指針
* 返回值: 0x00 :簽名有效
* 0x01 :作簽無效
* 0x02 : 其它錯誤
*/
unsigned char TFCA_VerifySign(unsigned short wPlainLen, unsigned char *pbyPlain,
unsigned short wSignLen, unsigned char *pbySign)
{
unsigned char NewSing[16] = {0};
if(wSignLen != 16)
return 0x01;
if(TFCA_CreatSign(wPlainLen,pbyPlain,16,NewSing) != 0)
return 0x02;
for(int i = 0; i < 16 ;i++)
{
if(pbySign[i] != NewSing[i])
return 0x01;
}
return 0x00;
}
bool DES(bool bEnspot, bool bTriDES, unsigned char* pbyKey,int nLength, unsigned char* pbySource, unsigned char* pbyTarget)
{
if(nLength==0 || nLength%8)
return false;
int section = nLength/8;
if(bTriDES){
des2key(pbyKey,bEnspot?EN0:DE1);
for(int i = 0 ;i<section;i++)
Ddes(pbySource+8*i,pbyTarget+8*i);
}
else{
deskey(pbyKey,bEnspot?EN0:DE1);
for(int i = 0 ;i<section;i++)
des(pbySource+8*i,pbyTarget+8*i);
}
return true;
}
unsigned char TFCA_Encrypt(unsigned char byKeyType,unsigned short wKeyLen,
unsigned char *pbyKey,unsigned short wPlainLen, unsigned char *pbyPlain,
unsigned short *pwEncryptLen, unsigned char *pbyEncrypt)
{
int wFillLen = 0;
wFillLen = ((wPlainLen + 16)) % 64;
if(wFillLen > 0)
wFillLen = 64 - wFillLen;
if(byKeyType == 0x00)
{
if(wKeyLen != 16)
{
memset(pbyEncrypt, 0 ,*pwEncryptLen);
*pwEncryptLen = 0x00;
return 0x03;
}
if((*pwEncryptLen) < (wPlainLen + 16 + wFillLen))
{
memset(pbyEncrypt, 0 ,*pwEncryptLen);
*pwEncryptLen = 0x00;
return 0x02;
}
/*首先附加簽名*/
memcpy(pbyEncrypt , pbyPlain , wPlainLen );
for(int i = 0 ; i < wFillLen; i++)
pbyEncrypt[wPlainLen + i] = 0xf0;
wPlainLen += wFillLen;
if(TFCA_CreatSign(wPlainLen,pbyEncrypt,16,&pbyEncrypt[wPlainLen]) != 0x00)
{
memset(pbyEncrypt, 0 ,*pwEncryptLen);
*pwEncryptLen = 0x00;
return 0x01;
}
wPlainLen += 16;
if(!DES(true,true,pbyKey,wPlainLen,pbyEncrypt,pbyEncrypt))
{
memset(pbyEncrypt, 0 ,*pwEncryptLen);
*pwEncryptLen = 0x00;
return 0x04;
}
}
else if(byKeyType == 0x01)
{
if(wKeyLen != 8)
{
memset(pbyEncrypt, 0 ,*pwEncryptLen);
*pwEncryptLen = 0x00;
return 0x03;
}
if((*pwEncryptLen) < (wPlainLen + 16 + wFillLen))
{
memset(pbyEncrypt, 0 ,*pwEncryptLen);
*pwEncryptLen = 0x00;
return 0x02;
}
/*首先附加簽名*/
memcpy(pbyEncrypt , pbyPlain , wPlainLen );
for(int i = 0 ; i < wFillLen; i++)
pbyEncrypt[wPlainLen + i] = 0xf0;
wPlainLen += wFillLen;
if(TFCA_CreatSign(wPlainLen,pbyEncrypt,16,&pbyEncrypt[wPlainLen]) != 0x00)
{
memset(pbyEncrypt, 0 ,*pwEncryptLen);
*pwEncryptLen = 0x00;
return 0x01;
}
wPlainLen += 16;
if(!DES(true,false,pbyKey,wPlainLen,pbyEncrypt,pbyEncrypt))
{
memset(pbyEncrypt, 0 ,*pwEncryptLen);
*pwEncryptLen = 0x00;
return 0x04;
}
}
else
{
if((*pwEncryptLen) < (wPlainLen + 16))
{
memset(pbyEncrypt, 0 ,*pwEncryptLen);
*pwEncryptLen = 0x00;
return 0x02;
}
/*首先附加簽名*/
memcpy(pbyEncrypt , pbyPlain , wPlainLen );
if(TFCA_CreatSign(wPlainLen,pbyEncrypt,16,&pbyEncrypt[wPlainLen]) != 0x00)
{
memset(pbyEncrypt, 0 ,*pwEncryptLen);
*pwEncryptLen = 0x00;
return 0x01;
}
wPlainLen += 16;;
}
*pwEncryptLen = wPlainLen;
return 0x00;
}
unsigned char TFCA_Decrypt(unsigned char byEncrypVer,unsigned char byKeyType,unsigned short wKeyLen,
unsigned char *pbyKey,unsigned short *pwPlainLen, unsigned char *pbyPlain,
unsigned short wEncryptLen, unsigned char *pbyEncrypt)
{
bool bIsRootKet = false;
if(byEncrypVer != CREPTY_VER)
{
*pwPlainLen = 0;
return 0x01;
}
if(byKeyType == 0x00)
{/*根密鑰*/
bIsRootKet = true;
if(wKeyLen != 16)
{
*pwPlainLen = 0;
return 0x03;
}
}
else if(byKeyType == 0x01)
{/*會話密鑰*/
if(wKeyLen != 8)
{
*pwPlainLen = 0;
return 0x03;
}
}
else/*不加密*/
{
if((*pwPlainLen) < wEncryptLen)
{
*pwPlainLen = 0;
return 0x03;
}
*pwPlainLen = wEncryptLen;
memcpy(pbyPlain,pbyEncrypt,wEncryptLen);
(*pwPlainLen) = wEncryptLen-16;
if(TFCA_VerifySign(*pwPlainLen,pbyPlain,16,&pbyPlain[*pwPlainLen]) != 0 )
{
*pwPlainLen = 0;
return 0x02;
}
return 0x00;
}
if((*pwPlainLen) < wEncryptLen)
{
*pwPlainLen = 0;
return 0x03;
}
if(!DES(false,bIsRootKet,pbyKey,wEncryptLen,pbyEncrypt,pbyPlain) != 0)
{
*pwPlainLen = 0;
return 0x04;
}
if(wEncryptLen <= 16)
{
*pwPlainLen = 0;
return 0x05;
}
(*pwPlainLen) = wEncryptLen-16;
if(TFCA_VerifySign(*pwPlainLen,pbyPlain,16,&pbyPlain[*pwPlainLen]) != 0 )
{
*pwPlainLen = 0;
return 0x02;
}
return 0x00;
}
unsigned char TFCA_GetVer()
{
return CREPTY_VER;
}
unsigned long MCoef_32[2]={0xE7BD2160,0xDA3A2A9C};
// 兩個小m序列系數
// dwMset: 隨機發生器所使用的小m序列
// dwKey: 隨機數種子
// nNumber: 產生的隨機序列長度(以DWORD為單位)
// pdwRandom: 指向隨機數存儲空間的指針
// return value: 運算完成之后隨機數發生器的狀態
unsigned long m_Seq_32_m(unsigned long dwMset,unsigned long dwKey,int nNumber, unsigned long * pdwRandom)
{
_asm
{
CLD
MOV EDI,pdwRandom;
MOV ECX,nNumber;
MOV ESI,dwMset;
MOV EAX,dwKey;
ALIGN 4
LOOP_CIRCLE1:
PUSH ECX
MOV ECX,32
LOOP_CIRCLE2:
MOV EBX,EAX;
SHL EAX,1
AND EBX,ESI; //select the bit for xor
MOV EDX,EBX;
BSWAP EBX;
XOR BX,DX;
XOR BH,BL; // because P only judge one byte
// so must XOR to judge the p of whole word
JP NEXT //jp equals the xor
INC EAX
NEXT: DEC ecx
JNZ LOOP_CIRCLE2
POP ECX
STOSD
DEC ECX
JNZ LOOP_CIRCLE1
MOV dwKey,EAX
}
return dwKey;
}
// 產生長度為nLength字節的隨機數
// Buffer: 指向隨機數存放區域的指針
// nLength: 產生隨機數數量
void RandomGenerator(unsigned char * Buffer, int nlength)
{
unsigned long A;
unsigned char B[4];
_asm
{
_emit 0x0f
_emit 0x31
MOV A,EAX
}
A=m_Seq_32_m(MCoef_32[0],A,nlength/4,(unsigned long*)Buffer);
if(nlength%4!=0)
{
m_Seq_32_m(MCoef_32[0],A,1,(unsigned long*)B);
memcpy(Buffer+(nlength/4)*4,B,nlength%4);
}
return;
}
unsigned char TFCA_CreateKey(unsigned short *pwKeyLen,unsigned char *pKey)
{
if(*pwKeyLen < 8)
return 0x02;
*pwKeyLen = 8;
RandomGenerator(pKey,*pwKeyLen);
return 0;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -