C語言實現密碼本小專案
阿新 • • 發佈:2020-02-27
一、引言
學C語言有一段時間了,趁著正好做了密碼本的小專案,把它分享出來。
二、思路與原理
密碼本,見名知意,就是存放賬號密碼,起到備忘錄作用的本子,將需要備忘的資料通過加密存放在文字檔案中,開啟的文字檔案為加密文字,需要通過軟體檢視已經存放的資料,提高安全性。(軟體設計了啟動密碼,三次過後自動退出)
專案目標:
- 儲存賬號密碼,退出後開啟軟體資料不丟失
- 進行簡單加密
- 能按條件查詢賬號密碼
- 能修改賬號密碼資料
- 能按條件進行刪除資料
知識涉及到陣列、檔案操作的使用以及簡單異或加密。
軟體的部分截圖如下:
主選單
增加資料
刪除資料
查詢資料
全部資料
三、實現
1.標頭檔案及資料定義
在密碼本的小專案中我設立四個了存放資料的陣列,所存放的賬號密碼的站點,存放的賬號,存放的密碼以及備註。定義了一個全域性變數,用來計數當前密碼本使用的條數。
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h> //定義四個陣列,用來存放站點、賬號、密碼、備註的值 char webSite[100][20]; char userName[100][20]; char passWord[100][20]; char reMark[100][20]; //定義一個全域性變數 int g_count = 0;
2.程式的整體框架
int main(void) { InitInfo(); int nChoice = 1; StartPassWord(); while (nChoice) { printf("*********************************歡迎使用密碼本*********************************\n"); printf(" 請輸入以下選項進行操作: \n"); printf(" 1、增加資料 \n"); printf(" 2、刪除資料 \n"); printf(" 3、修改資料 \n"); printf(" 4、查詢資料 \n"); printf(" 5、全部資料 \n"); printf(" 6、結束程式 \n"); printf("********************************************************************************\n"); scanf_s("%d",&nChoice); switch (nChoice) { case 1: { AddInfo();//增加資料 }break; case 2: { DelInfo(); //刪除資料 }break; case 3: { EditInfo();//修改資料 }break; case 4: { FindInfo();//查詢資料 }break; case 5: { ReadAllInfo();//檢視全部 }break; case 6: { nChoice = 0;//退出程式 }break; } } printf("歡迎下次使用!\n"); system("pause"); return 0; }
3.函式的宣告
//啟動時輸入密碼 void StartPassWord(); //增加資料 void AddInfo(); //刪除資料 void DelInfo(); //修改資料 void EditInfo(); //查詢資料 void FindInfo(); //讀取全部資料 void ReadAllInfo(); //儲存資料 void SaveInfo(); //初始化資料 void InitInfo();
4.各個函式的實現
//增加資料 void AddInfo() { printf("輸入需要儲存的 站點:"); scanf_s("%s",webSite[g_count],20); printf("輸入需要儲存的 賬號:"); scanf_s("%s",userName[g_count],20); printf("輸入需要儲存的 密碼:"); scanf_s("%s",passWord[g_count],20); printf("輸入需要儲存的 備註:"); scanf_s("%s",reMark[g_count],20); g_count++; SaveInfo(); InitInfo(); system("pause"); system("cls"); } //檢視全部 void ReadAllInfo() { FILE *pfile; if (fopen_s(&pfile,"data.i","r") != 0) { printf("file open fail"); exit(1); } fscanf_s(pfile,"當前個數%d\n",&g_count); printf("當前有%d條資料\n",g_count); for (int i = 0; i < g_count; i++) { printf("第%d條資料:\n",i + 1); printf("站點:%s,賬號:%s,密碼:%s,備註:%s",webSite[i],userName[i],passWord[i],reMark[i]); printf("\n"); } fclose(pfile); system("pause"); system("cls"); } //儲存資料 void SaveInfo() { for (int j = 0; j < g_count; j++) { for (int m = 0; m < 20; m++) { webSite[j][m] ^= 5; userName[j][m] ^= 5; passWord[j][m] ^= 5; reMark[j][m] ^= 5; } } FILE *pfile; if (fopen_s(&pfile,"w") != 0) { printf("file open fail"); exit(1); } fseek(pfile,SEEK_SET); fprintf(pfile,g_count); for (int i = 0; i < g_count; i++) { fwrite(webSite[i],20,1,pfile); fwrite(userName[i],pfile); fwrite(passWord[i],pfile); fwrite(reMark[i],pfile); fprintf(pfile,"\n"); } fclose(pfile); } //刪除資料 void DelInfo() { char aTemp[20]; int nFind = 0; int nIndex = 0; printf("請輸入要刪除的站點:\n"); scanf_s("%s",aTemp,20); for (; nIndex < g_count; nIndex++) { if (strcmp(aTemp,webSite[nIndex]) == 0) { nFind = 1; break; } } if (nFind == 1) { for (int i = nIndex; i < g_count; i++) { strcpy_s(webSite[i],webSite[i + 1]); strcpy_s(userName[i],userName[i + 1]); strcpy_s(passWord[i],passWord[i + 1]); strcpy_s(reMark[i],reMark[i + 1]); } g_count--; SaveInfo(); InitInfo(); printf("刪除成功\n"); } else { printf("查詢失敗!\n"); } system("pause"); system("cls"); } //初始化資料 void InitInfo() { FILE *pfile; if (fopen_s(&pfile,"r") != 0) { printf("請先建立data.i檔案!"); system("pause"); exit(1); } fscanf_s(pfile,&g_count); for (int i = 0; i < g_count; i++) { fread(webSite[i],pfile); fread(userName[i],pfile); fread(passWord[i],pfile); fread(reMark[i],pfile); fscanf_s(pfile,"\n"); } for (int j = 0; j < g_count; j++) { for (int m = 0; m < 20; m++) { webSite[j][m] ^= 5; userName[j][m] ^= 5; passWord[j][m] ^= 5; reMark[j][m] ^= 5; } } fclose(pfile); } //查詢資料 void FindInfo() { char aTemp[20]; int nFind = 0; printf("請輸入要查詢的站點:\n"); scanf_s("%s",20); for (int nIndex = 0; nIndex < g_count; nIndex++) { if (strcmp(aTemp,webSite[nIndex]) == 0) { nFind = 1; } if (nFind == 1) { printf("站點:%s,備註:%s\n",webSite[nIndex],userName[nIndex],passWord[nIndex],reMark[nIndex]); break; } } if (nFind == 0) { printf("查詢失敗!\n"); } system("pause"); system("cls"); } //修改資料 void EditInfo() { char aTemp[20]; int nFind = 0; printf("請輸入要修改的站點:\n"); scanf_s("%s",webSite[nIndex]) == 0) { nFind = 1; } if (nFind == 1) { printf("輸入需要修改的 賬號:"); scanf_s("%s",20); printf("輸入需要修改的 密碼:"); scanf_s("%s",20); printf("輸入需要修改的 備註:"); scanf_s("%s",reMark[nIndex],20); printf("站點:%s,reMark[nIndex]); SaveInfo(); break; } } if (nFind == 0) { printf("查詢失敗!\n"); } system("pause"); system("cls"); } //啟動時輸入密碼 void StartPassWord() { char spw[10] = "abcd"; //程式的啟動密碼 char write[10] = ""; int nSuccess = 0; for (int i = 1; i <= 3; i++) { printf("請輸入啟動密碼:\n"); scanf_s("%s",write,10); if (strcmp(write,spw) == 0) { nSuccess = 1; break; } else { printf("你的輸入有誤!還有%d次機會\n",3 - i); system("pause"); system("cls"); } } if (nSuccess == 1) { printf("輸入正確!按任意鍵開始使用程式\n"); } else { printf("輸入全部錯誤!按任意鍵結束程式\n"); system("pause"); exit(1); } system("pause"); system("cls"); }
5.關於加密
異或加密:異或是一種運算方式,在C語言中是^符號,通常可以用於加密。
例如專案中的實現
for (int j = 0; j < g_count; j++) { for (int m = 0; m < 20; m++) { webSite[j][m] ^= 5; userName[j][m] ^= 5; passWord[j][m] ^= 5; reMark[j][m] ^= 5; } }
四、總結
程式中還有很有缺陷,第一次寫部落格,希望大家多多包涵!
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。