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

📄 func.cpp

📁 使用TEA加密方法的简单加密解密程序. 包含 COMMAND版本 和 WIN32 两个版本.可供初学者学习. 超级雷电
💻 CPP
字号:
#include "stdafx.h"
#include <commdlg.h>
#include "func.h"
#include <iostream>
#include <fstream>
#include <cstring>
#include <cstdlib>
#include <ctime>
#include "conio.h"
#include "io.h"
#include <process.h>
#include "resource.h"


using namespace std;

extern HINSTANCE hInst;
extern bool bIn;
extern bool bOut;

struct _notice
{
	HWND  hWin;
	char* szFileNameIn;
	char* szFileTitleNameIn;
	char* szFloderNameOut;
	char* code;
	int   iflag;
	bool sta;
};


void tean(long *k, long *v, long N) {
  long y=v[0], z=v[1];
  long limit,sum=0;
  if(N>0) { /* ENCRYPT */
    limit=DELTA*N;
    while(sum!=limit) {
      y+=((z<<4)^(z>>5)) + (z^sum) + k[sum&3];
      sum+=DELTA;
      z+=((y<<4)^(y>>5)) + (y^sum) + k[(sum>>11)&3];
    }
  } else { /* DECRYPT */
    sum=DELTA*(-N);
    while(sum) {
      z-=((y<<4)^(y>>5)) + (y^sum) + k[(sum>>11)&3];
      sum-=DELTA;
      y-=((z<<4)^(z>>5)) + (z^sum) + k[sum&3];
    }
  }
  v[0]=y; v[1]=z;
}

void cl_enc_block(long *k, long *v) {
 tean(k,v,ROUNDS);
}

void cl_dec_block(long *k, long *v) {
 tean(k,v,-ROUNDS);
}

void keychange(long *k, char* code)
{
	int i;
	for (i = strlen(code); i < 8; i++) code[i] = '*';
    for (i = 0; i < 4; i++) {
        k[i] = (long)code[i] * (long)code[i] * (long)code[i+1] * (long)code[i+1]; 
    }
}       

VOID EnCode(PVOID pn)
{
	_notice* _pn;

	_pn = (_notice*)pn;
	HWND  hWin = _pn->hWin;
	char* szFileNameIn = _pn->szFileNameIn;
	char* szFileTitleNameIn = _pn->szFileTitleNameIn;
	char* szFloderNameOut = _pn->szFloderNameOut;
	char* code = _pn->code;
	int   iflag = _pn->iflag;
	bool sta = _pn->sta;


	char szExt[MAX_PATH];
	char szFileNameOut[MAX_PATH];
	char szFileTitleNameOut[MAX_PATH];
	char szDefaultExt[] = ".sec";
	char string[MAX_PATH];
	TCHAR szTitle[MAX_PATH];
	long addTime;

	strcpy(szFileTitleNameOut, szFileTitleNameIn);
	int i = 0;
	char* si = strrchr(szFileTitleNameIn, '.');
	char* sj = strrchr(szFileTitleNameOut, '.');

	if (si) {
		for (i = 0; *si != '\0' ; i++, si++) {
			szExt[i] = *si;
		}
	}
	szExt[i] = '\0';
	if (!sj) sj = &szFileTitleNameOut[strlen(szFileTitleNameOut)];
	for (i = 0; i < 4; i++) {
		*sj++ = szDefaultExt[i];
	}
	*sj = '\0';

	if (iflag) {
		strcpy(szFileNameOut, szFloderNameOut);		
		if(szFileNameOut[strlen(szFileNameOut)-1] != '\\') 
			strcat(szFileNameOut, "\\");
		strcat(szFileNameOut, szFileTitleNameOut);
	}
	else {
		strcpy(szFileNameOut, szFileNameIn);
		si = strrchr(szFileNameOut, '.');
		if (!si) si = &szFileNameOut[strlen(szFileNameOut)];
		for (i = 0; i < 4; i++) {
			*si++ = szDefaultExt[i];
		}
		*si = '\0';

	}
	if (!strcmp(szExt, szDefaultExt)) {
		MessageBox(hWin, "此文件已加密!", "说明", 0);
		_pn->sta = false;
        _endthread () ;
	}
	if (code[0] == '\0') {
		sprintf(string, "           您没有设置密码!\n解密文件时,您不需要输入密码!");
	}
	else {
		sprintf(string, "您设置的密码为:%s\n请您妥善保存好,以备解密!", code);
	}
	MessageBox(hWin, string, "说明", 0);

    long k[4]; 
    long v[2];
    long t[2];
    long* lt;
    streampos freallen, fpos;
    long filelen;
    int  flag;
    char ch;
    char remnant[MAX_PATH];
    
    keychange(k, code);
    ifstream fin(szFileNameIn, ios::in|ios::binary);    
    if (!fin.is_open()) {
        MessageBox(hWin, "无法打开文件!", "说明", 0);
        fin.close();
		_pn->sta = false;
        _endthread () ;
    }     

	freallen = fin.seekg(0, ios_base::end).tellg();
    filelen = long(freallen);
	addTime = filelen/100;

    if (filelen % 8 == 0) flag = 0;
    else {
        flag = filelen%8;
        filelen = (filelen/8)*8;
    }    
       
    fin.seekg(0, ios_base::beg);
    
    ofstream fout(szFileNameOut, ios::out | ios::binary);
    
    if (fout.is_open()) {
		int count = 0;
	    long total = 0;
        while (fin.read((char*)v, 8)) {
                cl_enc_block(k, v);    
                fout.write((char*)v, 8);
                fpos = fin.tellg();
				if (fpos > total) {
					if (count <= 100) sprintf(szTitle, "%d% 加密解密TOOL  加密中...", count++);
					total += addTime;
					SetWindowText(hWin, szTitle);
				}
        }
    } 
	else {
		MessageBox(hWin, "无法生成文件!", "说明", 0);
        fin.close();
		fout.close();
		_pn->sta = false;
        _endthread () ;
	}

    fin.clear();  
    if (flag) {
        int s = 0;
        fin.seekg(fpos, ios_base::beg);
        while (fin.read((char*)&ch, 1)) {
            remnant[s++] = ch;
        }
        remnant[s++] = 1;
        while (s < 8) remnant[s++] = 0;    
        memcpy(t, remnant, 8);
        lt = (long*)t;
        cl_enc_block(k, lt);
        fout.write((char*)lt, 8);
    }    
    
    memcpy(t, code, 8);
    lt = (long*)t;
    cl_enc_block(k, lt);
    fout.write((char*)lt, 8); 
    
    memcpy(t, szExt, 8);
    lt = (long*)t;
    cl_enc_block(k, lt);
    fout.write((char*)lt, 8);
             
    v[0] = 0x0L; v[1] = (long)flag;
    cl_enc_block(k, v);
    fout.write((char*)v, 8);
                 
        
        
    fin.clear();
	fin.close();
    fout.close();
	SetWindowText(hWin, "100% 加密解密TOOL  加密中...");
	MessageBox(hWin, "加密成功!", "说明", 0);
	_pn->sta = true;
	LoadString(hInst, IDS_STRING_IN, szFileNameIn, MAX_PATH);
	LoadString(hInst, IDS_STRING_OUT, szFloderNameOut, MAX_PATH);
	SetWindowText(hWin, "加密解密TOOL");
	SetWindowText(GetDlgItem(hWin, IDC_EDIT1), szFileNameIn);
	SetWindowText(GetDlgItem(hWin, IDC_EDIT2), szFloderNameOut);
	bIn = false;
	bOut = false;
	_endthread () ;

}        
     



VOID DeCode(PVOID pn)
{

	_notice* _pn;

	_pn = (_notice*)pn;
	HWND  hWin = _pn->hWin;
	char* szFileNameIn = _pn->szFileNameIn;
	char* szFileTitleNameIn = _pn->szFileTitleNameIn;
	char* szFloderNameOut = _pn->szFloderNameOut;
	char* code = _pn->code;
	int   iflag = _pn->iflag;
	bool sta = _pn->sta;
	

	long k[4];
    long v[2];
    streampos fposa, fpos, pos = 0;

	char szExt[MAX_PATH];
	char szFileNameOut[MAX_PATH];
	char szFileTitleNameOut[MAX_PATH];
	char szDefaultExt[] = ".sec";
	//char string[MAX_PATH];
	char fix[MAX_PATH];
	TCHAR szTitle[MAX_PATH];

    char key[MAX_PATH];
    char remnant[MAX_PATH];
    char* pkey;
    char* pfix;
    char* prem;
//    char ch;
    int flag;
	long addTime;
    
    keychange(k, code);
	strcpy(szFileTitleNameOut, szFileTitleNameIn);
	int i = 0;
	char* si = strrchr(szFileTitleNameIn, '.');

	if (si) {
		for (i = 0; *si != '\0' ; i++, si++) {
			szExt[i] = *si;
		}
	}
	szExt[i] = '\0';

	if (strcmp(szExt, szDefaultExt)) {
		MessageBox(hWin, "您选择的文件不需要解密!", "说明", 0);
        _pn->sta = false;
		_endthread () ;
    }


	ifstream fin(szFileNameIn, ios::in | ios::binary);
    if (!fin.is_open()) {
        MessageBox(hWin, "无法打开文件!", "说明", 0);
        fin.close();
		_pn->sta = false;
        _endthread () ;
    }
           
    fin.seekg(-24, ios_base::end);
    fin.read((char*)v, 8);
    cl_dec_block(k, v);
    memcpy(key, v, 8);
    pkey = (char*)key;
    pkey[8] = '\0';
    
    
    if (strcmp(code, pkey)) {
        MessageBox(hWin, "密码不正确!", "说明", 0);
        fin.close();
		_pn->sta = false;
        _endthread () ;
    }

    fin.read((char*)v, 8);
    cl_dec_block(k, v);
    memcpy(fix, v, 8);
    pfix = (char*)fix;
    pfix[8] = '\0';
    
    fin.read((char*)v, 8);
    cl_dec_block(k, v);
    flag = (int)v[1];


	if (iflag) {
		strcpy(szFileNameOut, szFloderNameOut);		
		if(szFileNameOut[strlen(szFileNameOut)-1] != '\\') 
			strcat(szFileNameOut, "\\");
		strcat(szFileNameOut, szFileTitleNameOut);
	}
	else {
		strcpy(szFileNameOut, szFileNameIn);
	}

	si = strrchr(szFileNameOut, '.');
	for (i = 0; *si != '\0'; i++, si++) {
		*si = pfix[i];
	}
	*si = '\0';

	fpos = fin.seekg(0, ios_base::end).tellg(); 
    addTime = (long)fpos / 100;
    ofstream fout(szFileNameOut, ios::out | ios::binary);
    fin.seekg(0, ios_base::beg);

	long total = 0;
	int count = 0;
    while (fin.tellg() < fpos-streampos(24+(flag?8:0))) {
		if (fin.read((char*)v, 8)) {
                cl_dec_block(k, v);    
                fout.write((char*)v, 8);
				fposa = fin.tellg();
				if (fposa > total) {
					if (count <= 100) sprintf(szTitle, "%d% 加密解密TOOL  解密中...", count++);
					total += addTime;
					SetWindowText(hWin, szTitle);
				}
        }
    }
    fin.read((char*)v, 8);
    cl_dec_block(k, v);
    memcpy(remnant, v, 8);
    prem = (char*)remnant;

    for (int s = 0; s < flag; s++) {
        fout.write((char*)&prem[s], 1);
    }    
    
    fin.clear();
	SetWindowText(hWin, "100% 加密解密TOOL  解密中...");
    MessageBox(hWin, "解密成功!", "说明", 0);    
    fin.close();
    fout.close();
	_pn->sta = true;
	LoadString(hInst, IDS_STRING_IN, szFileNameIn, MAX_PATH);
	LoadString(hInst, IDS_STRING_OUT, szFloderNameOut, MAX_PATH);
	SetWindowText(hWin, "加密解密TOOL");
	SetWindowText(GetDlgItem(hWin, IDC_EDIT1), szFileNameIn);
	SetWindowText(GetDlgItem(hWin, IDC_EDIT2), szFloderNameOut);
	bIn = false;
	bOut = false;
	_endthread () ;


}    



⌨️ 快捷键说明

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