📄 cbdestool.cpp
字号:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <stdio.h>
#include "cbDestool.h"
#include "cardutil.h"
#include "crypto.h"
char *spKey = "Key:";
char *spDes = "Output:";
char *spMac = "I.V.:";
char *spDiv = "Factor:";
char *spData= "Data:";
char *spDatax1 = "Data1:";
char *spDatax2 = "Data2:";
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TcfDES *cfDES ;
//---------------------------------------------------------------------------
__fastcall TcfDES::TcfDES(TComponent* Owner)
: TForm(Owner)
{
cbKey->Items->Clear();
cbData->Items->Clear();
cbOut->Items->Clear();
}
//---------------------------------------------------------------------------
void TcfDES::addToHistory()
{
cbKey->Items->Add(cbKey->Text);
cbData->Items->Add(cbData->Text);
cbOut->Items->Add(cbOut->Text);
}
//---------------------------------------------------------------------------
void __fastcall TcfDES::rbDESClick(TObject *Sender)
{
Label1->Caption = spKey;
Label2->Caption = spData;
Label3->Caption = spDes;
}
//---------------------------------------------------------------------------
void __fastcall TcfDES::rbMACClick(TObject *Sender)
{
Label1->Caption = spKey;
Label2->Caption = spData;
Label3->Caption = spMac;
}
//---------------------------------------------------------------------------
void __fastcall TcfDES::rbDiversifyClick(TObject *Sender)
{
Label1->Caption = spKey;
Label2->Caption = spDiv;
Label3->Caption = spDes;
}
//---------------------------------------------------------------------------
void __fastcall TcfDES::rbXORClick(TObject *Sender)
{
Label1->Caption = spDatax1;
Label2->Caption = spDatax2;
Label3->Caption = spDes;
}
//---------------------------------------------------------------------------
void __fastcall TcfDES::cbOutKeyPress(TObject *Sender, char &Key)
{
if(rbMAC->Checked) Label3->Caption = spMac;
}
//---------------------------------------------------------------------------
void TcfDES::dispmessage(char *msg)
{
cbOut->Text = msg;
}
//---------------------------------------------------------------------------
void __fastcall TcfDES::bExecuteClick(TObject *Sender)
{
int dbk,len,kl, enMode;
char key[32],data[2048],res[2048],buf[2048];
unsigned char pN[2048]={0};
unsigned char pE[2048]={0};
unsigned char pD[2048]={0};
unsigned char pData[2048]={0};
unsigned char pOUT[2048]={0};
// rsa_keygen(int bits, char *pN, char *pE, char *pD)
#if 0
rsa_keygen(1024,pN,pE,pD);
FILE *fp;
fp=fopen("rsa.log","at");
for(int iLoop=0;iLoop<128;iLoop++)
{
fputs("0x",fp);
memset(key,0,sizeof(key));
memcpy(key,pN+iLoop*2,2);
fputs(key,fp);
fputs(", ",fp);
if(!((iLoop+1)%8))
{
// if(iLoop!=0)
fputs("\n",fp);
}
}
fputs("\n",fp);
for(int iLoop=0;iLoop<128;iLoop++)
{
fputs("0x",fp);
memset(key,0,sizeof(key));
memcpy(key,pD+iLoop*2,2);
fputs(key,fp);
fputs(", ",fp);
if(!((iLoop+1)%8))
{
fputs("\n",fp);
}
}
fputs("\n",fp);
fputs(pN,fp);
fputs("\n",fp);
fputs(pD,fp);
fputs("\n",fp);
fputs(pE,fp);
fputs("\n",fp);
fclose(fp);
#endif
#if 0
//m&w
strcpy(pN,"9faae6cf19aca85fca341ead506676290563a91b33bd902af61690c17b060150f52928ce014716246479dc2f5781dde2fcd6134201d31461f6c6a8dadc071eebfe0c279d9282b16acf1802729f3886de1cde0488637ba17c50d1976788dce441546d0cf601670d5bd4c0f87867c943c2e0dfcd043c9e23262153309794a3e0a1");
strcpy(pE,"00010001");
strcpy(pD,"010C2759124ECE3A327A27582781D355F14DA9A9F81F845597D213447C49EE0F216075912CD74F92C38626A140A563B0C658BA55263EE8949F2A30C6A95C627EEFA8E58522B65102B8E2D2580C83238B002876088BBC686D12AA859B8513B7A1E33198B2F290DFD5EECFAAC03A57C6948A02F2366C79BAF18A2243210E34BA23");
#endif
#if 0
//ds5250
strcpy(pN,"CDEDA3CEEC6CFDAC18FC835115A558E7487F5C01A1627A9659A6EDB8E9C78513D4359F5F745D7CFED594CFD5A5C8E4B2E0356557F2E088E2BDEEB709CBAD563F817AC2D5F3427AEC4B2083233AB274BCB2B3B98E8C894762AFE4ED95B718F682E2BF4EFFB1E0A3F17DF37C5F0F54FF55AE71F25504E3BC54EBFEFA8DC11EA9AA");
strcpy(pE,"010001");
strcpy(pD,"010C2759124ECE3A327A27582781D355F14DA9A9F81F845597D213447C49EE0F216075912CD74F92C38626A140A563B0C658BA55263EE8949F2A30C6A95C627EEFA8E58522B65102B8E2D2580C83238B002876088BBC686D12AA859B8513B7A1E33198B2F290DFD5EECFAAC03A57C6948A02F2366C79BAF18A2243210E34BA23");
#endif
#if 1
//g&d
strcpy(pN,"C024D0A8F5347224FFF8686EC2FEE570751B1AB717418C859581BC4F58E7725A168B877B03365B6592B2B66B519C3F5FF37F1E7BDEB2F229B03BE2505C843FFDFEE2F72755D98AD43B40DACC1CC6AEBA4491DF5F1D0C83F898DCAC861235BDCFC91E6382E85D77E3D1AB1C492F1143F5A0EA44BCBEB016E929246CDF6DAC8B67");
strcpy(pE,"10001");
strcpy(pD,"2A426E9A1A84146ECAD589B282B4A925D8BBC35E6D80FF350A32E485D719E06EABF2B83377FB6692AA771FE3EEA91CCF2FB0CFB592BF6CBF7A81513F3779E6D0C5DE13AC30D3E25043D4C1C0E80D6AD5193966DC5A1DCC1321520CE60A4D72B984F9E69AFFA7768224924D60699C3357EA662466D2DB4CD944CB10D5A6779F21");
#endif
//rsa_encrypt(char *pN, char *pE, char *pData,char *pOUT );
strcpy(pData,"1111");
rsa_encrypt(pN, pE, pData,pOUT );
//rsa_decrypt(char *pN, char *pD, char *pData, char *pOUT );
memset(pData,0,sizeof(pData));
rsa_decrypt(pN, pD, pOUT,pData);
len = cbKey->GetTextLen()+1;
cbKey->GetTextBuf(buf,len);
trimspace(buf);
len = strlen(buf);
if (rbEncipher->Checked) enMode = DES_E;
else enMode = DES_D;
if ( rbDES->Checked ) {
kl = 1;
kl *= 16;
if ( len != kl) {
dispmessage("DES key: 8 bytes; 3DES key: 16 byte");
return;
}
kl /=2;
asc2bcd(buf,key,kl);
len = cbData->GetTextLen()+1;
cbData->GetTextBuf(buf,len);
trimspace(buf);
len = strlen(buf);
if ( len != 16 ) {
dispmessage("Data must be 8 bytes");
return;
}
asc2bcd(buf,data,8);
qdes(key,data,res,enMode);
bcd2ascb(res,buf,8);
} else if (rbMAC->Checked) { /* MAC*/
if ( len != 16 && len !=32) {
dispmessage("Key must be 8/16 bytes");
return;
}
if ( len == 16 ) dbk = 0; else dbk = 1;
if ( dbk) asc2bcd(buf,key,16);
else asc2bcd(buf,key,8);
// get data
len = cbData->GetTextLen()+1;
cbData->GetTextBuf(buf,len);
trimspace(buf);
len = strlen(buf)/2;
asc2bcd(buf,data,len);
len = padding(data,len);
if (1/*rbPBOC->Checked*/) {
kl = cbOut->GetTextLen()+1;
cbOut->GetTextBuf(buf,kl);
trimspace(buf);
kl = strlen(buf);
if (kl!=16) {
dispmessage("Vector must be 8 bytes");
return;
}
asc2bcd(buf,res,8);
} else memset(res,0x0,8);
for(kl=0;kl<len;kl+=8) {
xorblock(res,data+kl);
qdes(key,res,buf,DES_E);
memcpy(res,buf,8);
}
if ( dbk ) {
qdes(key+8,res,buf,DES_D);
qdes(key,buf,res,DES_E);
}
bcd2ascb(res,buf,8);
} else if ( rbXOR->Checked ) { /* XOR */
if ( len!=16) {
dispmessage("Data Length must be 8 bytes");
return;
}
asc2bcd(buf,key,8);
kl = cbData->GetTextLen()+1;
cbData->GetTextBuf(buf,kl);
trimspace(buf);
kl = strlen(buf);
if ( len != kl ) {
dispmessage("Data1 and data2's length must be same");
return;
}
asc2bcd(buf,data,8);
xorblock(key,data);
bcd2ascb(key,buf,8);
} else if ( rbDiversify->Checked ) { /* diversify */
if ( len != 32) {
dispmessage("Key must be 16 bytes");
return;
}
asc2bcd(buf,key,16);
len = cbData->GetTextLen()+1;
cbData->GetTextBuf(buf,len);
trimspace(buf);
len = strlen(buf);
if ( len != 16 ) {
dispmessage("Factor must be 8 bytes");
return;
}
asc2bcd(buf,data,8);
tripledes(key,data,res,DES_E);
memcpy(buf,res,8);
notblock(data);
tripledes(key,data,res,DES_E);
memcpy(buf+8,res,8);
memcpy(res,buf,16);
bcd2ascb(res,buf,16);
} else if (rbEncrypt->Checked && enMode == DES_E){ /* encrypted */
if ( len != 32) {
dispmessage("Key must be 16 bytes");
return;
}
asc2bcd(buf,key,16);
len = cbData->GetTextLen()+1;
cbData->GetTextBuf(buf,len);
trimspace(buf);
len = strlen(buf);
asc2bcd(buf,&data[1],len/2);
data[0] = len/2; // Ld
if (((len/2+1)%8) > 0 )
len = padding(data,len/2+1);
else len = len/2+1;
for(kl =0; kl<len; kl+=8)
tripledes(key,&data[kl],&res[kl],DES_E);
bcd2ascb(res,buf,len);
} else if (rbEncrypt->Checked && enMode == DES_D ) { /* Decrypted */
if ( len != 32) {
dispmessage("Key must be 16 bytes");
return;
}
asc2bcd(buf,key,16);
len = cbData->GetTextLen()+1;
cbData->GetTextBuf(buf,len);
trimspace(buf);
len = strlen(buf);
if ( len %8 ) {
dispmessage("Data must be 8X bytes");
return;
}
len = len /2;
asc2bcd(buf,data,len);
for(kl =0; kl<len; kl+=8)
tripledes(key,&data[kl],&res[kl],DES_D);
bcd2ascb(res,buf,len);
} else if ( eDESCBC->Checked&& enMode == DES_E ) { // 3DES CBC
if ( len != 32) {
dispmessage("Key must be 16 bytes");
return;
}
asc2bcd(buf,key,16);
len = cbData->GetTextLen()+1;
cbData->GetTextBuf(buf,len);
trimspace(buf);
len = strlen(buf);
if ( len %8 ) {
dispmessage("Data must be 8X bytes");
return;
}
len = len /2;
asc2bcd(buf,data,len);
memset(buf,0x0,8);
for(kl =0; kl<len; kl+=8) {
xorblock(buf,&data[kl]);
tripledes(key,buf,&res[kl],DES_E);
memcpy(buf,&res[kl],8);
}
bcd2ascb(res,buf,len);
} else if ( eDESECB->Checked ) { // 3DES ECB en
if ( len != 32) {
dispmessage("Key must be 16 bytes");
return;
}
asc2bcd(buf,key,16);
len = cbData->GetTextLen()+1;
cbData->GetTextBuf(buf,len);
trimspace(buf);
len = strlen(buf);
if ( len %8 ) {
dispmessage("Data must be 8X bytes");
return;
}
len = len /2;
asc2bcd(buf,data,len);
for(kl =0; kl<len; kl+=8) {
tripledes(key,&data[kl],&res[kl],enMode);
}
bcd2ascb(res,buf,len);
} else if ( eDESCBC->Checked&& enMode == DES_D ) { // 3DES CBC de
if ( len != 32) {
dispmessage("Key must be 16 bytes");
return;
}
asc2bcd(buf,key,16);
len = cbData->GetTextLen()+1;
cbData->GetTextBuf(buf,len);
trimspace(buf);
len = strlen(buf);
if ( len %8 ) {
dispmessage("Data must be 8X bytes");
return;
}
len = len /2;
asc2bcd(buf,data,len);
memset(buf,0x0,8);
for(kl =0; kl<len; kl+=8) {
tripledes(key,&data[kl],&res[kl],DES_D);
xorblock(&res[kl],buf);
memcpy(buf,&data[kl],8);
}
bcd2ascb(res,buf,len);
}
Label3->Caption = spDes;
cbOut->Text = buf;
addToHistory();
}
//---------------------------------------------------------------------------
void TcfDES::echolength(char *s)
{
short rc;
char hexs[8];
strcpy(dvbuf,s);
trimspace(dvbuf);
rc = strlen(dvbuf);
hexs[0] = rc/2;
bcd2asc(hexs,dvbuf,1);
if (rc%2) {
dvbuf[2]='*'; dvbuf[3]='\0';
}
}
//---------------------------------------------------------------------------
void __fastcall TcfDES::cbKeyChange(TObject *Sender)
{
echolength(cbKey->Text.c_str());
ecK->Caption = dvbuf;
}
//---------------------------------------------------------------------------
void __fastcall TcfDES::cbDataChange(TObject *Sender)
{
echolength(cbData->Text.c_str());
ecD->Caption= dvbuf;
}
//---------------------------------------------------------------------------
void __fastcall TcfDES::cbOutChange(TObject *Sender)
{
echolength(cbOut->Text.c_str());
ecO->Caption= dvbuf;
}
//---------------------------------------------------------------------------
void __fastcall TcfDES::rbEncryptClick(TObject *Sender)
{
Label1->Caption = spKey;
Label2->Caption = spData;
Label3->Caption = spDes;
}
//---------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -