C语言 文件操作12--文件加密
//文件加密解密 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h> #include"des.h" //加密分为对称加密和非对称加密 //对称加密:加密的密钥和解密的密钥一样,对称的特点是--加密速度快,用于大文件加密 //常用的加密算法:des 3des ssff33 sm6系列 //非对称加密:加密的密钥和解密的密钥不一样,非对称的特点是--加密速度慢,但加密强度高 //常用的加密算法:rsa1024 rsa2048 //对称加密是一种分组加密,每个分组的长度本质上是密钥的长度,des算法密钥是8个字节,或者16个字节,每组是8个字节或者16字节 当明文的长度正好是8的整数倍的时候加密没有问题 //但是明文的长度不是8的整数倍就要采用补码的形式了 //DesEnc这种加密算法是这么设计的 当明文的长度不是8的整数倍的时候,缺几补几 //例如:明文(sdefgtyheg12drg)长度15,那么再补1个字节就是8的整数倍,那么就在补一个1,形成补码明文(sdefgtyheg12drg1),再进行加密,解密的时候自动去掉末尾的数字表示的长度-1,得到正确的明文 //明文(sdefgtyheg12d)长度13,那么再补3个字节就是8的整数倍,那么就在补三个3,形成补码明文(sdefgtyheg12d333),再进行加密.......解密的时候自动去掉末尾的数字表示的长度-3,得到正确的明文 //明文(sdefgtyh4444)长度12,那么再补4个字节就是8的整数倍,那么就在补四个个4,形成补码明文(sdefgtyh44444444),再进行加密.......解密的时候自动去掉末尾的数字表示的长度-4,得到正确的明文 //明文(sessssse)长度8,本身已经是8的整数倍了 但是DesEnc是一种补码加密,必须要补码,所以需要补上8个0,形成补码明文(sessssse00000000),再进行加密.......解密的时候发现末尾数字是0,那么直接将数组长度减去8,得到正确的明文 //注意:DesEnc加密补码只是在整个文件末尾补码,并不是每个分组都进行补码
//DesEnc_raw()这种加密算法只针对与8的整数倍大小的数据,原理也是分组加密,但是加密的时候不用补码 //所以DesEnc_raw()函数加密之后的密文长度和明文长度相同,但是DesEnc(0函数加密之后的密文长度至少比明文长度多1个字节,至多比明文长度多8个字节,所有准备的密文数组要相应的大一点 //DesEnc算法加密 int DesEncfile(){ //定义字符数组 unsigned char buf8[9] = "123456789"; //定义明文长度 int plainlen = 9; //定义密文数组 unsigned char bufcrypt[16] = { 0 }; //定义密文长度 int cryptlen = 0; //开始加密明文 int rest = DesEnc(buf8, plainlen, bufcrypt, &cryptlen); if (rest != 0) { printf("加密失败!\n"); return 1; } else{ printf("加密成功!\n"); } //解密文件 //定义字符数组 //之所以定义数组长度是10,是为了在末尾加上一个'\0'方便打印 unsigned char buf82[10] = { 0 }; //定义明文长度 int plainlen2 = 0; int rest2 = DesDec(bufcrypt, cryptlen, buf82, &plainlen2); if (rest2 != 0) { printf("解密失败!\n"); return 1; } else{ printf("解密成功!,明文是%s\n", buf82); } //比较解密之后的明文是否和原来的明文相同 //memcmp()比较buf8和buf82在plainlen2长度上的内容是否相同 if (memcmp(buf8, buf82, plainlen2) == 0) { printf("两者内容相同!\n"); } return 0; } //DesEnc_raw算法加密 int DesEnc_rawfile(){ //定义字符数组 unsigned char buf8[8] = "12345678"; //定义明文长度 int plainlen = 8; //定义密文数组 unsigned char bufcrypt[100] = { 0 }; //定义密文长度 int cryptlen = 0; //开始加密明文 //DesEnc_raw用来加密8的整数倍大小的数据 //DesEnc_raw()函数详解:DesEnc_raw()函数是用来加密正好是8的整数倍的数据, //加密后,密文和明文的长度一样 //解密DesEnc_raw()所用的函数是DesDec_raw() int rest = DesEnc_raw(buf8, plainlen, bufcrypt, &cryptlen); if (rest != 0) { printf("加密失败!\n"); return 1; } else{ printf("加密成功!\n"); } //解密文件 //定义字符数组 unsigned char buf82[9] = { 0 }; //定义明文长度 int plainlen2 = 0; int rest2 = DesDec_raw(bufcrypt, cryptlen, buf82, &plainlen2); if (rest2 != 0) { printf("解密失败!\n"); return 1; } else{ printf("解密成功!,明文是%s\n", buf82); } //比较解密之后的明文是否和原来的明文相同 //memcmp()比较buf8和buf82在plainlen2长度上的内容是否相同 if (memcmp(buf8, buf82, plainlen2) == 0) { printf("两者内容相同!\n"); } return 0; } void main() { //DesEncfile(); DesEnc_rawfile(); system("pause"); }