⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 untmain.cpp

📁 是用C++ Builder 写的DES加密算法.
💻 CPP
字号:
//---------------------------------------------------------------------------
#include <string.h>

#include <vcl.h>
#pragma hdrstop

#include "untMain.h"
#include "untBeatCode.h"

//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"

TfrmMain *frmMain;

//数据的X次方
__int64 DataXSquare(int iData, int X){	int i;    __int64 iRet;	if(X == 0)		return 1;	iRet = 1;	for(i = 0; i < X; i++)	{		iRet = iRet * iData;	}	return iRet;}
//十进制数据转换成二进制数据(大于0)
//注意二进制的高位占据缓冲数据的高位int DecToBin(__int64 iData, int iIndex, int iLen, unsigned char *pBuff){    int iMod, iRet;    iRet = iIndex + iLen;    if(iData == 0)    {        pBuff[iIndex] = 0;        iIndex++;    }    while(iData > 0)    {    	iMod = iData % 2;    	iData = iData / 2;    	pBuff[iIndex] = iMod;    	iIndex++;    }    return iRet;}
//二进制数据转换成十进制数据
__int64 BinToDec(unsigned char *pBuff, int iStart, int iEnd){	int i;    __int64 iData;	iData = 0;	for(i = iStart; i <= iEnd; i++)	{		if(pBuff[i] == 1)			iData = iData + DataXSquare(2, i - iStart);	}	return iData;}
//设置加密的数据缓冲
void TfrmMain::SetDataBuff(unsigned char *DataBuff)
{
    int iData, iIndex;
    unsigned char Buff[64];

    iIndex = 0;
    memset(Buff, 0, 64);
    //机器编号(0-14)
    iData = StrToInt(edtMachCode->Text);
    iIndex = DecToBin(iData, iIndex, 15, Buff);
    //随机码(15-25)
    iData = StrToInt(edtRandCode->Text);
    iIndex = DecToBin(iData, iIndex, 11, Buff);
    //是否允许调整参数
    if(ckbUpdPar->Checked)
        iData = 1;
    else
        iData = 0;
    iIndex = DecToBin(iData, iIndex, 1, Buff);
    //多少次游戏调节检测(27-28)
    iData = cmbDayPlay->ItemIndex;
    iIndex = DecToBin(iData, iIndex, 2, Buff);
    //赢分最大误差(29-30)
    iData = cmbMinError->ItemIndex;
    iIndex = DecToBin(iData, iIndex, 2, Buff);
    //押分超过多少为杀板人(31-32)
    iData = cmbGreatePress->ItemIndex;
    iIndex = DecToBin(iData, iIndex, 2, Buff);
    //押分少于多少为钓鱼人(33-34)
    iData = cmbFisherPress->ItemIndex;
    iIndex = DecToBin(iData, iIndex, 2, Buff);
    //钓鱼人最大赢分1(35-37)
    iData = cmbFisherMaxWin1->ItemIndex;
    iIndex = DecToBin(iData, iIndex, 3, Buff);
    //钓鱼人最大赢分2(38-40)
    iData = cmbFisherMaxWin2->ItemIndex;
    iIndex = DecToBin(iData, iIndex, 3, Buff);
    //拉连线彩下限(41-43)
    iData = cmbSendLineLottMin->ItemIndex;
    iIndex = DecToBin(iData, iIndex, 3, Buff);
    //拉连线彩上限(44-46)
    iData = cmbSendLineLottMax->ItemIndex;
    iIndex = DecToBin(iData, iIndex, 3, Buff);
    //拉单机彩输分(47-49)
    iData = cmbPullMachKill->ItemIndex;
    iIndex = DecToBin(iData, iIndex, 3, Buff);
    //杀板人多少次游戏后必须考虑放单机彩(50-52)
    iData = PullMachPlay1->ItemIndex;
    iIndex = DecToBin(iData, iIndex, 3, Buff);
    //其他人多少次游戏后必须考虑放单机彩(53-55)
    iData = PullMachPlay2->ItemIndex;
    iIndex = DecToBin(iData, iIndex, 3, Buff);
    //杀板人输分多少后考虑放分给他(56-57)
    iData = cmbSendPoint1->ItemIndex;
    iIndex = DecToBin(iData, iIndex, 2, Buff);
    //其他人输分多少后考虑放分给他(58-59)
    iData = cmbSendPoint2->ItemIndex;
    iIndex = DecToBin(iData, iIndex, 2, Buff);
    //输分超过多少称为大杀板人(60-61)
    iData = cmbRescueKill->ItemIndex;
    iIndex = DecToBin(iData, iIndex, 2, Buff);
    //大杀板人押分超过多少放分(62-63)
    iData = cmbRescuePoint->ItemIndex;
    iIndex = DecToBin(iData, iIndex, 2, Buff);
    //设置DataBuff
    DataBuff[0] = BinToDec(Buff, 0, 7);
    DataBuff[1] = BinToDec(Buff, 8, 15);
    DataBuff[2] = BinToDec(Buff, 16, 23);
    DataBuff[3] = BinToDec(Buff, 24, 31);
    DataBuff[4] = BinToDec(Buff, 32, 39);
    DataBuff[5] = BinToDec(Buff, 40, 47);
    DataBuff[6] = BinToDec(Buff, 48, 55);
    DataBuff[7] = BinToDec(Buff, 56, 63);
}

//在字符串strCode1前面补0
AnsiString FillZero(AnsiString strCode, int iNeedLen)
{
    int i, iLen;
    AnsiString strZero;

    iLen = strCode.Length();
    if(iLen >= iNeedLen)
    {
        return strCode;
    }
    else
    {
        strZero = "";
        for(i = 0; i < iNeedLen - iLen; i++)
        {
            strZero = strZero + '0';
        }
        return strZero + strCode;
    }
}

//打码
bool TfrmMain::BeatCode(unsigned char *pIn, unsigned char *pOut){    int i, iData;    unsigned char Buff[8];    //将整数转换成二进制数据    for(i = 0; i < 8; i++)    {        memset(Buff, 0, 8);        DecToBin(pIn[i], 0, 8, Buff);        memcpy(pOut + 8 * i, Buff, 8);    }    //0  - 14位:机器编号(验证)    iData = BinToDec(pOut, 0, 14);    if(iData != StrToInt(edtMachCode->Text))        return FALSE;    //15 - 25位:随机码(验证)    iData = BinToDec(pOut, 15, 25);    if(iData != StrToInt(edtRandCode->Text))        return FALSE;    //是否允许用户调整游戏参数    iData = BinToDec(pOut, 26, 26);    if(iData == 0)        ckbUpdPar->Checked = false;    else        ckbUpdPar->Checked = true;    //27 - 28位:多少次游戏调节检测    iData = BinToDec(pOut, 27, 28);    cmbDayPlay->ItemIndex = iData;    //29 - 30位:实际和理想分数最小误差    iData = BinToDec(pOut, 29, 30);    cmbMinError->ItemIndex = iData;    //31 - 32位:押分达多少称为杀板人    iData = BinToDec(pOut, 31, 32);    cmbGreatePress->ItemIndex = iData;    //33 - 34位:押分少于多少称钓鱼人    iData = BinToDec(pOut, 33, 34);    cmbFisherPress->ItemIndex = iData;    //35 - 37位:钓鱼人的最大赢分1    iData = BinToDec(pOut, 35, 37);    cmbFisherMaxWin1->ItemIndex = iData;    //38 - 40位:钓鱼人的最大赢分2    iData = BinToDec(pOut, 38, 40);    cmbFisherMaxWin2->ItemIndex = iData;    //41 - 43位:连线彩达多少才能拉下限    iData = BinToDec(pOut, 41, 43);    cmbSendLineLottMin->ItemIndex = iData;    //44 - 46位:连线彩达多少才能拉上限    iData = BinToDec(pOut, 44, 46);    cmbSendLineLottMax->ItemIndex = iData;    //47 - 49位:拉单机彩最小输分    iData = BinToDec(pOut, 47, 49);    cmbPullMachKill->ItemIndex = iData;    //50 - 52位:杀板人多少次游戏后必须考虑单机彩1    iData = BinToDec(pOut, 50, 52);    PullMachPlay1->ItemIndex = iData;    //53 - 55位:其他人多少次游戏后必须考虑单机彩2    iData = BinToDec(pOut, 53, 55);    PullMachPlay2->ItemIndex = iData;    //56 - 57位:杀板人输分达多少考虑放用户    iData = BinToDec(pOut, 56, 57);    cmbSendPoint1->ItemIndex = iData;    //58 - 59位:其他人输分达多少考虑放用户    iData = BinToDec(pOut, 58, 59);    cmbSendPoint2->ItemIndex = iData;    //60 - 6位:用户输分超过多少称大杀板人    iData = BinToDec(pOut, 60, 61);    cmbRescueKill->ItemIndex = iData;    //62 - 63位:大杀板人单次押分多少才拯救    iData = BinToDec(pOut, 62, 63);    cmbRescuePoint->ItemIndex = iData;    return TRUE;}
//---------------------------------------------------------------------------
__fastcall TfrmMain::TfrmMain(TComponent* Owner)
        : TForm(Owner)
{
}

//---------------------------------------------------------------------------
void __fastcall TfrmMain::btnEncClick(TObject *Sender)
{
    unsigned char In[8];
    unsigned char Out[8];
	unsigned char Buff[8];
    unsigned char CodeBuff[64];
    int i, iTemp, iCode1, iCode2, iCode3, iCode4;
    AnsiString strCode1, strCode2, strCode3, strCode4;

    //判断机器编号输入是否正确
    iTemp = StrToInt(edtMachCode->Text);
    if(iTemp < 0 || iTemp > 32000)
    {
        Application->MessageBoxA("机器编号输入错误,请输入0-32000之间的数据!", "输入错误", MB_OK);
        edtMachCode->SetFocus();
        return;
    }
    //判断随机码输入是否正确
    iTemp = StrToInt(edtRandCode->Text);
    if(iTemp < 0 || iTemp > 4000)
    {
        Application->MessageBoxA("随机码输入错误,请输入0-4000之间的数据!", "输入错误", MB_OK);
        edtRandCode->SetFocus();
        return;
    }
    //设置加密的数据缓冲
    SetDataBuff(In);
    //加密数据
    Des_Go(Out, In, sizeof(In), des_key, sizeof(des_key), ENCRYPT);
    //将加密后的数据转换成用十进制表示
    memset(CodeBuff, 0, 64);
    for(i = 0; i < 8; i++)
    {    	memset(Buff, 0, 8);    	DecToBin(Out[i], 0, 8, Buff);    	memcpy(CodeBuff + 8 * i, Buff, 8);    }    //48 - 63位    iCode1 = BinToDec(CodeBuff, 48, 63);
    strCode1 = FillZero(IntToStr(iCode1), 5);
    //32 - 47位    iCode2 = BinToDec(CodeBuff, 32, 47);
    strCode2 = FillZero(IntToStr(iCode2), 5);
    //16 - 31位    iCode3 = BinToDec(CodeBuff, 16, 31);
    strCode3 = FillZero(IntToStr(iCode3), 5);
    //0 - 15位    iCode4 = BinToDec(CodeBuff, 0, 15);
    strCode4 = FillZero(IntToStr(iCode4), 5);
    edtCode->Text = strCode1 + strCode2 + strCode3 + strCode4;}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::btnDecClick(TObject *Sender)
{
    int iIndex;
    unsigned char In[8];
    unsigned char Out[8];
    unsigned char Buff[64];

    //将整数转换成二进制数据放在Buff中
    iIndex = 0;
    memset(Buff, 0, 64);
    //0 - 15位
    iIndex = DecToBin(StrToInt64(edtCode->Text.SubString(16, 5)), iIndex, 16, Buff);
    //16 - 31位
    iIndex = DecToBin(StrToInt64(edtCode->Text.SubString(11, 5)), iIndex, 16, Buff);
    //32 - 47位
    iIndex = DecToBin(StrToInt64(edtCode->Text.SubString(6, 5)), iIndex, 16, Buff);
    //48 - 63位
    iIndex = DecToBin(StrToInt64(edtCode->Text.SubString(1, 5)), iIndex, 16, Buff);
    //设置输入缓冲
    In[0] = BinToDec(Buff, 0, 7);
    In[1] = BinToDec(Buff, 8, 15);
    In[2] = BinToDec(Buff, 16, 23);
    In[3] = BinToDec(Buff, 24, 31);
    In[4] = BinToDec(Buff, 32, 39);
    In[5] = BinToDec(Buff, 40, 47);
    In[6] = BinToDec(Buff, 48, 55);
    In[7] = BinToDec(Buff, 56, 63);
    //解密数据
    Des_Go(Out, In, sizeof(In), des_key, sizeof(des_key), DECRYPT);
    //分析解密数据
    memset(Buff, 0, 64);
    if(!BeatCode(Out, Buff))
    {
        Application->MessageBoxA("您输入的卡号不正确!", "输入错误", MB_OK);
    }
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::btnExitClick(TObject *Sender)
{
    Close();
}
//---------------------------------------------------------------------------



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -