📄 func.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 + -