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

📄 fes.h

📁 一款文件加密的小软件
💻 H
📖 第 1 页 / 共 3 页
字号:
        _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 + -