📄 fes.h
字号:
_read(*srcFileHandle, &fileTime, sizeof(struct ftime));
}
return TRUE;
}
/**
* BOOL CheckExist(char *pathName);
* - 检验当前目录下是否已存在文件pathName
* - 如果存在返回TRUE,否则返回FALSE
**/
BOOL
CheckExist(char *pathName)
{
if (0 == access(pathName, 0x00))
{
return TRUE;
}
else
{
return FALSE;
}
}
/**
* void SeaENDE(FILEHANDLE *srcFileHandle,
FILEHANDLE *dstFileHandle);
* - 加密或解密给定的文件句柄号
* - 本函数中使用全局变量
* - key(type: KEYINFO)
* - buf(type: char *)
**/
void
SeaENDE(FILEHANDLE *srcFileHandle,
FILEHANDLE *dstFileHandle)
{
buf = (BYTE *) malloc(SIZE * sizeof(BYTE));
if (NULL == buf)
{
strcpy(message.displayStr, "[!]\n\n No enough memory for data buffer \n");
Message(&message);
getch();
FreeMessage(&message);
return;
}
if (ENCRYPT == key.flag)
{
Encrypt(srcFileHandle,
dstFileHandle);
}
else if (DECRYPT == key.flag)
{
Decrypt(srcFileHandle,
dstFileHandle);
}
free(buf);
buf = NULL;
}
/**
* void Encrypt(FILEHANDLE *srcFileHandle,
* FILEHANDLE *dstFileHandle)
* - 文件加密函数
* - 本函数中使用全局变量
* - key(type: KEYINFO)
* - message(type: WINDOWHANDLE)
* - buf(type: char *)
* - pathSrc(type: char[])
* - pathDst(type: char[])
* - drive(type: char[])
* - dir(type: char[])
* - file(type: char[])
* - ext(type: char[])
**/
void
Encrypt(FILEHANDLE *srcFileHandle,
FILEHANDLE *dstFileHandle)
{
int i, size;
long fileSize, nBlocks, leftBytes;
double progress, step;
char ch;
/* Get the file size */
fileSize = filelength(*srcFileHandle);
/* 加密循环体 */
fnsplit(pathSrc, drive, dir, file, ext);
strcpy(message.displayStr, "[i]\n\n Encrypting...[");
strcat(message.displayStr, file);
strcat(message.displayStr, ext);
strcat(message.displayStr, " >> ");
fnsplit(pathDst, drive, dir, file, ext);
strcat(message.displayStr, file);
strcat(message.displayStr, ext);
strcat(message.displayStr, "] \n");
Message(&message);
step = 100.0 / ((fileSize*1.0) / SIZE);
progress = 0;
while (fileSize >= SIZE)
{
/* 读取明文SIZE字节数 */
_read(*srcFileHandle, buf, SIZE);
for (i=0; i<SIZE/16; i++)
{
SEA(buf+i*16, &key);
}
/* 写密文到指定文件中 */
_write(*dstFileHandle, buf, SIZE);
fileSize -= SIZE;
/* 加密进程指示 */
gotoxy(message.left+message.curx,
message.top+message.cury);
cputs(" ");
gotoxy(message.left+message.curx,
message.top+message.cury);
cprintf("%2d%%", (int)progress);
progress += step;
}
/* 处理最后一个小于SIZE的明文组 */
if (fileSize > 0)
{
_read(*srcFileHandle, buf, fileSize);
nBlocks = fileSize / 16;
leftBytes = fileSize % 16;
for (i=0; i<nBlocks; i++)
{
SEA(buf+i*16, &key);
}
if (0 != leftBytes)
{
for (i=0; i<16-leftBytes; i++)
{
buf[fileSize+i] = (i%2 ? 0x55: 0xaa);
}
SEA(buf+fileSize-leftBytes, &key);
}
size = leftBytes? fileSize+16-leftBytes : fileSize;
_write(*dstFileHandle, buf, size);
}
_close(*dstFileHandle);
/* 修改密文文件属性为只读,隐藏,系统 */
_chmod(pathDst, 1, FA_RDONLY|FA_HIDDEN|FA_SYSTEM);
FreeMessage(&message);
strcpy(message.displayStr, "[i]\n\n <*> ENCRYPTION Finished <*> \n");
Message(&message);
getch();
FreeMessage(&message);
/* 是否删除原明文文件 */
strcpy(message.displayStr, "[!]\n\n Delete the SOURCE PLAIN file: ");
strcat(message.displayStr, fnChosen);
strcat(message.displayStr, "?(y/n) \n");
Message(&message);
while (1)
{
ch = getch();
if ('y' == ch || 'Y' == ch)
{
FreeMessage(&message);
break;
}
else if ('n' == ch || 'N' == ch)
{
/* 如果不删除原明文文件则退出之前恢复其文件属性 */
_chmod(pathSrc, 1, srcFileInfo.ff_attrib);
_close(*srcFileHandle);
FreeMessage(&message);
return;
}
}
/* 以下操作将彻底完全删除原明文文件,是破坏性的删除,无法恢复 */
strcpy(message.displayStr, "[!]\n\n Deleting the SOURCE PLAIN file...");
strcat(message.displayStr, fnChosen);
strcat(message.displayStr, " \n");
Message(&message);
progress = 0;
step /= 3;
for (i=0; i<3; i++)
{
fileSize = filelength(*srcFileHandle);
lseek(*srcFileHandle, 0L, SEEK_SET);
/* 用两个互反的字节反复写,
* 达到彻底删除的目的 */
ch = i%2 ? 0xaa : 0x55;
memset(buf, ch, SIZE);
while (fileSize > 0)
{
size = (fileSize>SIZE) ? SIZE : fileSize;
_write(*srcFileHandle, buf, size);
fileSize -= size;
gotoxy(message.left+message.curx,
message.top+message.cury);
cputs(" ");
gotoxy(message.left+message.curx,
message.top+message.cury);
cprintf("%2d%%", (int)progress);
progress += step;
}
}
_close(*srcFileHandle);
unlink(pathSrc);
FreeMessage(&message);
strcpy(message.displayStr, "[!]\n\n OK:the SOURCE PLAIN file deleted \n");
Message(&message);
getch();
FreeMessage(&message);
}
/**
* void Decrypt(FILEHANDLE *srcFileHandle,
FILEHANDLE *dstFileHandle)
* - 文件解密函数
* - 本函数中使用全局变量
* - key(type: KEYINFO)
* - message(type: WINDOWHANDLE)
* - buf(type: char *)
* - pathSrc(type: char[])
* - pathDst(type: char[])
* - drive(type: char[])
* - dir(type: char[])
* - file(type: char[])
* - ext(type: char[])
**/
void
Decrypt(FILEHANDLE *srcFileHandle,
FILEHANDLE *dstFileHandle)
{
int i, size;
long fileSize, nBlocks, leftBytes;
double progress, step;
char ch;
/*Get the size of plaintext file*/
_read(*srcFileHandle, &fileSize, 4);
/* 解密循环体 */
fnsplit(pathSrc, drive, dir, file, ext);
strcpy(message.displayStr, "[i]\n\n Decrypting...[");
strcat(message.displayStr, file);
strcat(message.displayStr, ext);
strcat(message.displayStr, " >> ");
fnsplit(pathDst, drive, dir, file, ext);
strcat(message.displayStr, file);
strcat(message.displayStr, ext);
strcat(message.displayStr, "] \n");
Message(&message);
step = 100.0 / ((fileSize*1.0) / SIZE);
progress = 0;
while (fileSize >= SIZE)
{
_read(*srcFileHandle, buf, SIZE);
for (i=0; i<SIZE/16; i++)
{
SEA(buf+i*16, &key);
}
/* 写明文到指定文件中 */
_write(*dstFileHandle, buf, SIZE);
fileSize -= SIZE;
/* 解密进程指示 */
gotoxy(message.left+message.curx,
message.top+message.cury);
cputs(" ");
gotoxy(message.left+message.curx,
message.top+message.cury);
cprintf("%2d%%", (int)progress);
progress += step;
}
/* 处理最后一个小于SIZE的密文组 */
if (fileSize > 0)
{
leftBytes = fileSize % 16;
nBlocks = fileSize / 16 + (leftBytes ? 1 : 0);
size = leftBytes? fileSize+16-leftBytes : fileSize;
_read(*srcFileHandle, buf, size);
for (i=0; i<nBlocks; i++)
{
SEA(buf+i*16, &key);
}
_write(*dstFileHandle, buf, fileSize);
}
/* 恢复原明文文件的创建日期 */
setftime(*dstFileHandle, &fileTime);
_close(*dstFileHandle);
/* 恢复原明文文件的文件属性 */
_chmod(pathDst, 1, dstFileInfo.ff_attrib);
FreeMessage(&message);
strcpy(message.displayStr, "[i]\n\n <*> DECRYPTION Finished <*> \n");
Message(&message);
getch();
FreeMessage(&message);
/* 是否删除原密文文件 */
strcpy(message.displayStr, "[!]\n\n Delete the SOURCE CIPHER file: ");
strcat(message.displayStr, fnChosen);
strcat(message.displayStr, "?(y/n) \n");
Message(&message);
while (1)
{
ch = getch();
if ('y' == ch || 'Y' == ch)
{
FreeMessage(&message);
break;
}
else if ('n' == ch || 'N' == ch)
{
/* 如果不删除原密文文件则退出之前恢复其文件属性 */
_chmod(pathSrc, 1, srcFileInfo.ff_attrib);
_close(*srcFileHandle);
FreeMessage(&message);
return;
}
}
/* 彻底完全删除原密文文件,无法恢复 */
strcpy(message.displayStr, "[!]\n\n Deleting the SOURCE CIPHER file...");
strcat(message.displayStr, fnChosen);
strcat(message.displayStr, " \n");
Message(&message);
progress = 0;
step /= 3;
for (i=0; i<3; i++)
{
fileSize = filelength(*srcFileHandle);
lseek(*srcFileHandle, 0L, SEEK_SET);
/* 用两个互反的字节反复写,
* 达到彻底删除的目的 */
ch = i%2 ? 0xaa : 0x55;
memset(buf, ch, SIZE);
while (fileSize > 0)
{
size = (fileSize>SIZE) ? SIZE : fileSize;
_write(*srcFileHandle, buf, size);
fileSize -= size;
gotoxy(message.left+message.curx,
message.top+message.cury);
cputs(" ");
gotoxy(message.left+message.curx,
message.top+message.cury);
cprintf("%2d%%", (int)progress);
progress += step;
}
}
_close(*srcFileHandle);
unlink(pathSrc);
FreeMessage(&message);
strcpy(message.displayStr, "[!]\n\n OK:the SOURCE CIPHER file deleted \n");
Message(&message);
getch();
FreeMessage(&message);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -