返回目录:word文档
操作界面
加密前的文件:
加密后的文件
将加密后的文件解密后即可还原
初始密码为:hujing
开发环境:vc6.0
操作系统:windows
源代码
/**************************************************
*** 实现了对一个文件进行加密和解密 ***
*** 作者:胡靖 ***
*** 版本:1.0 ***
**************************************************/
#include
#include
#include
void Print();
int Encryption();
int PasswordVerify();
int PasswordChange();
int PasswordGet();
char Password[30] = "hujing";
char Password_K[30] = "123451234512345123451234512345";
char PasswordPath[] = "c:string.txt";
int main(){
int i;
PasswordGet();
if(PasswordVerify() == 0){
printf("密码验证失败!n");
getch();
exit(1);
}else{
printf("验证通过!n");
getch();
}
while(1){
system("cls");//清屏
fflush(stdin);//清空缓冲区
Print();
scanf("%d", &i);
switch(i){
case 1:
case 2: Encryption(); break;
case 3: PasswordChange(); break;
case 0: exit(1);
default: printf("输入异常!n");
printf("按任意键继续..........");
getch();
}
}
return 0;
}
//输出界面
void Print(){
printf("*******************************************n");
printf("***** 1.加密 ****n");
printf("***** 2.解密 ****n");
printf("***** 3.修改密码 ****n");
printf("***** 0.退出 ****n");
printf("*******************************************n");
}
//获取登录密码
int PasswordGet(){
FILE *PasswordBin;
int i, num;
PasswordBin = fopen(PasswordPath, "rb");
//文件打开失败(第一次登陆)
if(PasswordBin == NULL){
num = strlen(Password);
PasswordBin = fopen(PasswordPath, "wb");
system("attrib +H c:string");
//将初始密码转码
for(i = 0; i < num; i++){
Password[i] ^= Password_K[i];
}
Password[i] = '0';
//将密码写入文件
if( fwrite(Password, 1, num, PasswordBin) == 0){
printf("文件写入失败!n");
exit(1);
}
//还原密码
for(i = 0; i < num; i++){
Password[i] ^= Password_K[i];
}
Password[i] = '0';
return 1;
}
//读取密码并转码
fread(Password, 1, 30, PasswordBin);
for(i = 0; i < strlen(Password); i++){
Password[i] ^= Password_K[i];
}
return 0;
}
//加密解密函数
int Encryption(){
char BeforeFile_s[30], //加密前文件路径
Key_s[30], //密钥
AfterFile_s[30]; //加密后文件路径
FILE *BeforeFile, //加密前文件
*AfterFile; //加密后文件
char Buffer[50]; //缓存数组
int ReadNum, //读取的长度
KeyNum; //密钥的长度
int i;
//接收文件路径及密钥
printf("请输入原文件的完整路径:n");
fflush(stdin);
scanf("%s", BeforeFile_s);
printf("请输入新建文件的完整路径:n");
fflush(stdin);
scanf("%s", AfterFile_s);
printf("请输入加密 密钥:n");
fflush(stdin);
scanf("%s", Key_s);
KeyNum = strlen(Key_s);
//打开前文件
BeforeFile = fopen(BeforeFile_s, "rb");
if(BeforeFile == NULL){
printf("文件[%s]打开失败!n", BeforeFile_s);
printf("按任意键继续..........");
getch();
return 1;
}
//打开后文件
AfterFile = fopen(AfterFile_s, "wb");
if(AfterFile == NULL){
printf("文件[%s]打开失败!n", AfterFile_s);
printf("按任意键继续..........");
getch();
fclose(BeforeFile);
return 1;
}
//进行文件加密解密
while((ReadNum = fread(Buffer, 1, KeyNum, BeforeFile)) != 0){
for(i = 0; i < ReadNum; i++){
Buffer[i] ^= Key_s[i];
}
if( fwrite(Buffer, 1, ReadNum, AfterFile) == 0){
printf("文件写入失败!n");
printf("按任意键继续..........");
getch();
fclose(BeforeFile);
fclose(AfterFile);
return 1;
}
}
printf("操作成功!n");
printf("按任意键继续..........");
getch();
fclose(BeforeFile);
fclose(AfterFile);
return 0;
}
//密码验证函数
int PasswordVerify(){
char Password_s[30];
int i, j;
for(i = 0; i < 3; i++){
printf("请输入验证密码(第%d次,还剩%d次):n", i+1, 3-i);
fflush(stdin);
//接收键盘录入
for(j = 0; 1; j++){
Password_s[j] = getch();
//输入回车时
if(Password_s[j] == 'r'){
Password_s[j] = '0';
break;
}
//输入退格时
if(Password_s[j] == 'b'){
printf("b b");
j -= 2;
if(j < 0){
j = -1;
}
continue;
}
printf("*");
}
printf("n");
if(strcmp(Password_s, Password) == 0){
return 1;
}
}
return 0;
}
//密码修改函数
int PasswordChange(){
FILE *PasswordBin;
char Password_s[30], Password_ss[30];
int i, j;
//验证原密码
if(PasswordVerify() == 0){
printf("验证失败!n");
printf("按任意键继续..........");
return 0;
}
printf("请输入新密码:n");
fflush(stdin);
//接收键盘录入
for(j = 0; 1; j++){
Password_s[j] = getch();
//输入回车时
if(Password_s[j] == 'r'){
Password_s[j] = '0';
break;
}
//输入退格时
if(Password_s[j] == 'b'){
printf("b b");
j -= 2;
if(j < 0){
j = -1;
}
continue;
}
printf("*");
}
printf("n");
printf("请再次输入:n");
fflush(stdin);
//接收键盘录入
for(j = 0; 1; j++){
Password_ss[j] = getch();
//输入回车时
if(Password_ss[j] == 'r'){
Password_ss[j] = '0';
break;
}
//输入退格时
if(Password_ss[j] == 'b'){
printf("b b");
j -= 2;
if(j < 0){
j = -1;
}
continue;
}
printf("*");
}
printf("n");
//验证两次输入密码是否相同
if(strcmp(Password_s, Password_ss) != 0){
printf("两次密码输入不同!修改失败!n");
printf("按任意键继续..........");
getch();
return 0;
}
//将修改后的密码写入文件
PasswordBin = fopen(PasswordPath, "wb");
for(i = 0; i < strlen(Password_s); i++){
Password_s[i] ^= Password_K[i];
}
fwrite(Password_s, 1, strlen(Password_s), PasswordBin);
printf("密码修改成功!n");
printf("按任意键继续..........");
getch();
return 0;
}