c語言中的文件加密與解密
c語言文件加密與解密
本程序是一個(gè)c語言的大作業(yè)的一部分
是簡(jiǎn)單的基于給定密鑰實(shí)現(xiàn)的加密解密程序
希望能給后來人一些參考
文件的傳輸會(huì)有明文和密文的區(qū)別,明文發(fā)送是不安全的。
本題目實(shí)現(xiàn)對(duì)文件的加密和解密操作,采用的加密算法是根據(jù)密鑰將明文中的字母置換為其它字母,所有字母不區(qū)分大小寫,不考慮除英文字母外的字符。
例如:
明文是:They will arrive tomorrow,密鑰k=Monday
具體加密過程如下
① 設(shè)置英文字母與0到25有如下的對(duì)應(yīng)關(guān)系:
A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 |
②依據(jù)上述對(duì)應(yīng)關(guān)系將明文和密鑰轉(zhuǎn)化為一組數(shù)字:
k=(12,14,13,3,0,24)
m=(19,7,4,24,22,8,11,11,0,17,17,8,21,4,19,14,12,14,17,17,14,22)
③將明文數(shù)字依據(jù)密鑰長(zhǎng)度分段,并逐一與密鑰數(shù)字相加(模26),得到密文數(shù)字,即:
19 | 7 | 4 | 24 | 22 | 8 | 11 | 11 | 0 | 17 | 17 | 8 | 21 | 4 | 19 | 14 | 12 | 14 | 17 | 17 | 14 | 22 |
12 | 14 | 13 | 3 | 0 | 24 | 12 | 14 | 13 | 3 | 0 | 24 | 12 | 14 | 13 | 3 | 0 | 24 | 12 | 14 | 13 | 3 |
5 | 21 | 17 | 1 | 22 | 6 | 23 | 25 | 13 | 20 | 17 | 6 | 7 | 18 | 6 | 17 | 12 | 12 | 3 | 5 | 1 | 25 |
C=(5,21,17,1,22,6,23,25,13,20,17,6,7,18,6,17,12,12,3,5,1,25)
④依據(jù)字母和數(shù)字對(duì)應(yīng)關(guān)系將密文數(shù)字轉(zhuǎn)換為字母串,即密文為:
c=FVRBWGXZNURGHSGRMMDFBZ
解密過程與加密過程類似,采用的是模26減運(yùn)算
功能要求
主函數(shù)提供功能菜單供用戶選擇,用戶可以選擇調(diào)用以下各個(gè)功能,也可以選擇退出程序。
系統(tǒng)應(yīng)提供以下功能
- 加密:對(duì)給定文件file1.txt內(nèi)容按照密鑰k=Monday進(jìn)行加密,加密后密文寫到文件file2.txt中;
- 解密:對(duì)給定密文文件file3.txt 利用密鑰k=Monday進(jìn)行解密,解密后的明文存放在文件file4.txt中;
#include<stdio.h>
int key[6]={12,14,13,3,0,24};//定義密鑰
int complex();
int simplify();
int main()
{
int i=0,j=0;
printf("功能如下\n1.加密\n2.解密\n3.退出\n");
printf("請(qǐng)輸入您所需功能對(duì)應(yīng)的序號(hào):(例:如需調(diào)用加密功能,便打出1即可)\n");
for(;;)//直到輸入3時(shí)才會(huì)退出
{
scanf("%d",&i);
if(i==1)j=complex();
if(i==2)j=simplify();
if(i==3)break;
if(j==1)printf("\n功能實(shí)現(xiàn)成功\n");
if(j==0)printf("\n功能實(shí)現(xiàn)失敗\n");
}
return 0;
}
int complex() //加密
{
FILE *pin, *pout;
pin = fopen("file1.txt","r");
pout= fopen("file2.txt","w");
int k=0;
char Ming[1000],Mi[1000],*p=Ming,*q=Mi;
fgets(Ming,1000,pin); //puts(Ming);
for(;*p!='\0';p++)
{
if(*p>='a'&&*p<='z')
{
*q=(*p-97+key[k])%26+65;// printf(" %d %d %c\n",*(key+k),k,*q);
k=k+1;q++;
if(k==6)k=0;
}
if(*p>='A'&&*p<='Z')
{
*q=(*p-65+key[k])%26+65;// printf(" %d %d %c\n",*(key+k),k,*q);
k=k+1;q++;
if(k==6)k=0;
}
}
*q='\0';
//printf("密文為:"); //puts(Mi);
fputs(Mi,pout);
fclose(pin);
fclose(pout);
return 1;
}
int simplify()//解密
{
FILE *pin, *pout;
pin = fopen("file3.txt","r");
pout= fopen("file4.txt","w");//打開文件
int k=0; //定義密鑰 //k的意義是讓密匙能夠循環(huán)使用
char Ming[1000],Mi[1000],*p=Mi,*q=Ming;//定義密文,明文字符串
fgets(Mi,1000,pin);//從文件3讀取密文
for(;*p!='\0';p++)//解密
{
if(*p>='A'&&*p<='Z')
{
*q=(*p-65+26+26-*(key+k))%26+65;//printf(" %d %d %c\n",*(key+k),k,*q);//檢驗(yàn)key出沒出問題
k=k+1;q++;
if(k==6)k=0;//這兩行代碼讓密鑰循環(huán)使用
}
}
*q='\0';//使字符串結(jié)束
fputs(Ming,pout);//puts(Ming);檢驗(yàn)輸出結(jié)果//導(dǎo)出加密結(jié)果
fclose(pin);
fclose(pout); //關(guān)閉兩個(gè)文件
return 1;
}總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
C++哈希表之閉散列方法的模擬實(shí)現(xiàn)詳解
閉散列指(開放定址法)發(fā)生沖突時(shí),如果哈希表沒有被填滿,則表內(nèi)一定還有其他空閑位置,可以把沖突值放到下一個(gè)沒有被占用的空余位置上。本文將模擬實(shí)現(xiàn)閉散列方法,需要的可以參考一下2022-11-11
LeetCode題解C++生成每種字符都是奇數(shù)個(gè)的字符串
這篇文章主要為大家介紹了LeetCode題解C++生成每種字符都是奇數(shù)個(gè)的字符串示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10
C語言求解最長(zhǎng)公共子字符串問題及相關(guān)的算法分析
最長(zhǎng)公共子字符串問題即是求一個(gè)字符串在另一個(gè)字符串中出現(xiàn)的連續(xù)最多字符,這里我們來看一下面試中經(jīng)常出現(xiàn)的C語言求解最長(zhǎng)公共子字符串問題及相關(guān)的算法分析2016-06-06
QT實(shí)現(xiàn)動(dòng)態(tài)時(shí)鐘
這篇文章主要為大家詳細(xì)介紹了QT實(shí)現(xiàn)動(dòng)態(tài)時(shí)鐘,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-07-07
C++自定義API函數(shù)實(shí)現(xiàn)大數(shù)相乘算法
這篇文章主要為大家詳細(xì)介紹了C++自定義API函數(shù)實(shí)現(xiàn)大數(shù)相乘算法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-09-09

