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

📄 menu.cpp

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

using namespace std;

void printMainMenu()
{
    system("CLS");
    cout<<"┌─────[文件加密解密助手]─────┐"<<endl;
    cout<<"├───────────────────┤"<<endl; 
    cout<<"│  [1].加密文件         [2].解密文件   │"<<endl;
    cout<<"│  [3].关    于         [4].退    出   │"<<endl;
    cout<<"└───────────────────┘"<<endl;
}    

void printSubMenu1()
{
    cout<<"┌───[加 密  文 件]───┐"<<endl;
    cout<<"│[1].设置密码 [2].返回上级 │"<<endl; 
    //cout<<"│[2].查看信息 [3].返回上级 │"<<endl;
    cout<<"└─────────────┘"<<endl;
}    

void printSubMenu2()
{
    cout<<"┌───[解 密  文 件]───┐"<<endl;
    cout<<"│[1].输入密码 [2].返回上级 │"<<endl; 
    //cout<<"│[2].查看信息 [3].返回上级 │"<<endl;
    cout<<"└─────────────┘"<<endl;
}

void printArithmetic()
{
    cout<<"┌──────────────────────────┐"<<endl; 
    cout<<"│加密解密算法说明:                                  │"<<endl;
    cout<<"│TEA - Tiny Encryption Algorithm                     │"<<endl; 
    cout<<"│Feistel cipher by David Wheeler & Roger M. Needham  │"<<endl; 
    cout<<"│(extended version)                                  │"<<endl; 
    cout<<"└──────────────────────────┘"<<endl;
}

void printAuthor()
{
    cout<<"┌──────────────────┐"<<endl;
    cout<<"│版 本 号 : 1 . 0                   │"<<endl;
    cout<<"│程序设计 : 李 洁 信                │"<<endl;  
    cout<<"│E - MAIL : segadcman@sina.com      │"<<endl;
    cout<<"│联    系 :  北方工业大学            │"<<endl;
    cout<<"└──────────────────┘"<<endl;
} 

void printHelp()
{
    cout<<"┌──────────────────┐"<<endl; 
    cout<<"│文件选择模式按键说明:               │"<<endl;
    cout<<"│ESC -- 退出                         │"<<endl;  
    cout<<"│TAB -- 显示当前文件夹文件详细信息   │"<<endl; 
    cout<<"│-  -- 后退一个盘符                 │"<<endl;    
    cout<<"│+  -- 前进一个盘符                 │"<<endl;   
    cout<<"│/   -- 返回当前盘根目录             │"<<endl;  
    cout<<"│.   -- 返回上级目录                 │"<<endl;
    cout<<"│其他说明:                           │"<<endl; 
    cout<<"│加密文件名:*.sec                   │"<<endl;     
    cout<<"└──────────────────┘"<<endl; 
}    
                  
    
void printCode(char* code, int status)
{
    char ch;
    int n = 0;
    if (status) {
        cout<<"┌───[设 置  密 码]────┐"<<endl;
        cout<<"└──请设置文件密码:________ ┘\b\b\b\b\b\b\b\b\b\b\b";
    }    
    else {
        cout<<"┌───[输 入  密 码]────┐"<<endl;
        cout<<"└──请输入文件密码:________ ┘\b\b\b\b\b\b\b\b\b\b\b";
    }    
    while (1) {
        ch = getch();
        if (ch == '\r') break;
        if (ch == '\b') {
            if (n > 0) {
                cout<<"\b_\b";
                n--;
            }    
            continue;
        }    
        if (n >= LEN-1) continue;
        code[n++] = ch;
        cout<<"*";
    }
    cout<<endl;
    cout<<endl;
    code[n] = '\0';
    if (status) {
        cout<<"[您设置的密码为]: [";
        if (code[0] == '\0') cout<<"空密码]"; else cout<<code<<"]";
        cout<<endl;
    }  
}       
           
bool mean(const char *file)
{
    char unmean[] = "/*:<>?|\\\"";
    if (file[0] == '.') return false;
    for (int i = 0; i < strlen(unmean); i++) {
        if (strchr(file, unmean[i])) return false;
    }
    if (file[0] == '.' || file[strlen(file)-1] == '.') return false;
    return true;
} 

bool getFix(const char *file, char *fix)
{
    char *cp = strrchr(file, '.');
    if (!cp) return false;
    int i = 0;
    while (*cp) {
        fix[i++] = *cp++;
    }
    fix[i] = '\0';
    return true;
} 

bool isEncrypted(const char *file)
{
    int i, j;
    char fix[FILE_NAME_MAX_LEN];
    getFix(file, fix);
    if (!strcmp(fix, czOutFix)) return true;
    else return false;
}

bool changeName(char *file, const char *fix)
{
    int i;
    char *cp = strrchr(file, '.');
    for (i = 0; i < strlen(fix); i++) {
        *cp++ = fix[i];
    }
    *cp = '\0';
    return true;
}    

bool addSuffix(char *file, const char *fix)
{
    int i, j;
    if (strlen(file)+strlen(fix) >= FILE_NAME_MAX_LEN)
        return false;
    for (i = strlen(file), j = 0; j < strlen(fix); i++, j++) {
        file[i] = fix[j];
    }
    file[i] = '\0';
    return true;
} 

int inputFileName(char *file, const char *fix)
{
/*    cout<<"★[输入<exit>或<EXIT>退出,默认扩展名为]: <"<<fix<<">★"<<endl;
    cout<<"★[请输入文件名]:"; 
    cin>>file;
    if (!strcmp(file, "exit") || !strcmp(file, "EXIT")) return 0;
    while (!mean(file)) {
        printMainMenu();
        cout<<"★[输入<exit>或<EXIT>退出,默认扩展名为]: <"<<fix<<">★"<<endl;
        cout<<"☆[文件名包含非法字符]"<<endl; 
        cout<<"★[请重新输入文件名]:";
        cin>>file;
        if (!strcmp(file,"exit") || !strcmp(file, "EXIT")) return 0;
    }
    if (!strchr(file, '.')) addSuffix(file, fix); */
    CBrowseDir statdir;
    if (statdir.BeginBrowse(fix)) {
       statdir.GetFile(file); 
    }
    else return 0;
    printMainMenu(); 
        
    ifstream fin(file, ios::in | ios::binary);    
    if (!fin.is_open()) {
        fin.close();
        cout<<"[无法打开 <"<<file<<"> 文件]"<<endl;
        cout<<"[按任意键返回]"<<endl; 
        getch();
        return 0;
    } 
    fin.close();
    printFileInfo(file);
    return 1;
} 

int outputPath(char* path)
{
    CBrowseDir statdir;
    statdir.SetMethod(0);
    if (statdir.BeginBrowse("*.*")) {
       statdir.GetFile(path); 
    }
    else return 0;
}    
              

int Menu(char* file, char *code)
{
    char ch;
    printMainMenu();
    ch = getch();
    while (!strchr("1234", ch)) ch = getch();
    
    switch (ch) {
        case '1' : if (SubMenu1(file, code)) return 1;
                   else return 0;
                   break;
        case '2' : if (SubMenu2(file, code)) return 2;
                   else return 0;
                   break;
        case '3' : if (SubMenu3()) return 3;
                   break;
        case '4' : return 4;
                   break;
        default  : 
                   break;
    }  
}   

int SubMenu1(char * file, char * code)
{
    char ch;
    
    if (!inputFileName(file, "*.*")) return 0;
    
    printSubMenu1();
    do {
        ch = getch();
    }while (!strchr("12", ch));
    switch (ch) {
        case '1': 
                  //printFileInfo(file);
                  printCode(code, 1);
                  return 1;  
                  break;
        case '2': 
                  return 0;
                  break;
        case '3': return 0;
                  break;
        default : return 0;
                  break;
    }
}            
           
int SubMenu2(char* file, char *code)
{
    char ch;
    
    if (!inputFileName(file, "*.sec")) return 0;
    
    printSubMenu2();
    do {
        ch = getch();
    }while (!strchr("12", ch));
    switch (ch) {
        case '1': //printFileInfo(file);
                  printCode(code, 0);
                  return 1;  
                  break;
        case '2': //printFileInfo(file);
                  return 0;
                  break;
        case '3': return 0;
                  break;
        default : return 0;
                  break;
    }
}

int SubMenu3()
{
    system("CLS");
    printArithmetic();
    printAuthor();
    printHelp();
    return 1;
}               
               
bool printFileInfo(char* file)
{
    //system("CLS");
    char fname[_MAX_PATH];  
    char *fp = strrchr(file, '\\') + 1;
    int i = 0;
    while (*fp) {
        fname[i++] = *fp++;
    }
    fname[i] = '\0';  
    struct _finddata_t c_file; 
    long hFile; 
    if( (hFile = _findfirst(fname, &c_file )) == -1L ) 
           printf( "No *.c files in current directory!\n" ); 
    else {
        printf( "┌──┬──┬──┬──────────┬────────────┬─────┐"); 
        printf( "│只读│隐藏│系统│文   件     名   称 │文 件 最 后 修 改 时 间 │容      量│"); 
        printf( "├──┼──┼──┼──────────┼────────────┼─────┤"); 
        printf( ( c_file.attrib & _A_RDONLY ) ? "│ 是 │" : "│ 否 │" ); 
        printf( ( c_file.attrib & _A_SYSTEM ) ? " 是 │" : " 否 │" ); 
        printf( ( c_file.attrib & _A_HIDDEN ) ? " 是 │" : " 否 │" ); 
        printf( "%-20.20s│%.24s│%8ldKB│", c_file.name, ctime( &( c_file.time_write ) ), c_file.size/1024 ); 
        printf( "└──┴──┴──┴──────────┴────────────┴─────┘");
    }  
    _findclose(hFile);
    return true;
}  

bool printAllInfo()
{
    struct _finddata_t c_file; 
    long hFile; 
    int pause = -1;
    system("CLS");
    if( (hFile = _findfirst("*.*", &c_file )) == -1L 
     && (c_file.attrib & _A_SUBDIR) ) {
           printf( "No *.* files in current directory!\n" ); 
    }        
    else {
        ++pause;
        printf( "┌──┬──┬──┬──────────┬────────────┬─────┐"); 
        printf( "│只读│隐藏│系统│文   件     名   称 │文 件 最 后 修 改 时 间 │容      量│"); 
        printf( "├──┼──┼──┼──────────┼────────────┼─────┤"); 
      if ( strcmp(c_file.name,".") && strcmp (c_file.name,"..") ) {
        printf( ( c_file.attrib & _A_RDONLY ) ? "│ 是 │" : "│ 否 │" ); 
        printf( ( c_file.attrib & _A_SYSTEM ) ? " 是 │" : " 否 │" ); 
        printf( ( c_file.attrib & _A_HIDDEN ) ? " 是 │" : " 否 │" ); 
        printf( "%-20.20s│%.24s│%8ldKB│", c_file.name, ctime( &( c_file.time_write ) ), c_file.size/1024 ); 
      }    
    }   

/* Find the rest of the .c files */ 
    while( _findnext( hFile, &c_file ) == 0 ) {
      ++pause;
      if (pause == 0) {
        printf("[按任意键继续显示]");
        getch();
        system("CLS"); 
        printf( "┌──┬──┬──┬──────────┬────────────┬─────┐"); 
        printf( "│只读│隐藏│系统│文   件     名   称 │文 件 最 后 修 改 时 间 │容      量│"); 
        printf( "├──┼──┼──┼──────────┼────────────┼─────┤"); 
        }  
        if ( strcmp(c_file.name,".") && strcmp (c_file.name,"..") ) {  
        printf( ( c_file.attrib & _A_RDONLY ) ? "│ 是 │" : "│ 否 │" ); 
        printf( ( c_file.attrib & _A_SYSTEM ) ? " 是 │" : " 否 │" ); 
        printf( ( c_file.attrib & _A_HIDDEN ) ? " 是 │" : " 否 │" ); 
        printf( "%-20.20s│%.24s│", c_file.name, ctime( &( c_file.time_write ) ) ); 
        if (c_file.attrib & _A_SUBDIR) printf("文  件  夹│");
        else printf("%8ldKB│", c_file.size/1024); 
        }      
        if (pause == 18) {
        pause = -1; 
        printf( "└──┴──┴──┴──────────┴────────────┴─────┘");
      }    
    } 
    if (pause != -1)
        printf( "└──┴──┴──┴──────────┴────────────┴─────┘");
    _findclose( hFile ); 
    printf("[按任意键返回]"); 
    getch();
} 

               

⌨️ 快捷键说明

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