//文件加密解密
#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[] = "";
//定义明文长度
int plainlen = ;
//定义密文数组
unsigned char bufcrypt[] = { };
//定义密文长度
int cryptlen = ;
//开始加密明文
int rest = DesEnc(buf8, plainlen, bufcrypt, &cryptlen);
if (rest != )
{
printf("加密失败!\n");
return ;
}
else{
printf("加密成功!\n");
}
//解密文件
//定义字符数组
//之所以定义数组长度是10,是为了在末尾加上一个'\0'方便打印
unsigned char buf82[] = { };
//定义明文长度
int plainlen2 = ;
int rest2 = DesDec(bufcrypt, cryptlen, buf82, &plainlen2);
if (rest2 != )
{
printf("解密失败!\n");
return ;
}
else{
printf("解密成功!,明文是%s\n", buf82);
}
//比较解密之后的明文是否和原来的明文相同
//memcmp()比较buf8和buf82在plainlen2长度上的内容是否相同
if (memcmp(buf8, buf82, plainlen2) == )
{
printf("两者内容相同!\n");
}
return ;
} //DesEnc_raw算法加密
int DesEnc_rawfile(){
//定义字符数组
unsigned char buf8[] = "";
//定义明文长度
int plainlen = ;
//定义密文数组
unsigned char bufcrypt[] = { };
//定义密文长度
int cryptlen = ;
//开始加密明文
//DesEnc_raw用来加密8的整数倍大小的数据
//DesEnc_raw()函数详解:DesEnc_raw()函数是用来加密正好是8的整数倍的数据,
//加密后,密文和明文的长度一样
//解密DesEnc_raw()所用的函数是DesDec_raw()
int rest = DesEnc_raw(buf8, plainlen, bufcrypt, &cryptlen);
if (rest != )
{
printf("加密失败!\n");
return ;
}
else{
printf("加密成功!\n");
}
//解密文件
//定义字符数组
unsigned char buf82[] = { };
//定义明文长度
int plainlen2 = ;
int rest2 = DesDec_raw(bufcrypt, cryptlen, buf82, &plainlen2);
if (rest2 != )
{
printf("解密失败!\n");
return ;
}
else{
printf("解密成功!,明文是%s\n", buf82);
}
//比较解密之后的明文是否和原来的明文相同
//memcmp()比较buf8和buf82在plainlen2长度上的内容是否相同
if (memcmp(buf8, buf82, plainlen2) == )
{
printf("两者内容相同!\n");
}
return ;
} void main()
{
//DesEncfile();
DesEnc_rawfile();
system("pause");
}

C语言 文件操作12--文件加密的更多相关文章

  1. Java IO,io,文件操作,删除文件,删除文件夹,获取文件父级目录

    Java IO,io,文件操作,删除文件,删除文件夹,获取文件父级目录 这里先简单的贴下常用的方法: File.separator //当前系统文件分隔符 File.pathSeparator // ...

  2. C++ 学习笔记之——文件操作和文件流

    1. 文件的概念 对于用户来说,常用到的文件有两大类:程序文件和数据文件.而根据文件中数据的组织方式,则可以将文件分为 ASCII 文件和二进制文件. ASCII 文件,又称字符文件或者文本文件,它的 ...

  3. Python文件操作:文件的打开关闭读取写入

    Python文件操作:文件的打开关闭读取写入 一.文件的打开关闭 Python能以文本和二进制两种方式处理文件,本文主要讨论在Python3中文本文件的操作. 文件操作都分为以下几个步骤: 1.打开文 ...

  4. C语言应用操作之文件

    文件是C语言中德中的重点,小编在学习C语言基础知识的时候,大多数的输入输出操作是在屏幕上进行的,现在总算在文件学习上感觉到高大上的样纸.在以前数据量很小时,我们通常将信息从键盘在屏幕上进行输入输出的, ...

  5. 总结文件操作函数-文件夹(三)-C语言

    获取.改变当前文件夹: 原型为: #include <unistd.h>   //头文件 char *getcwd(char *buf, size_t size); //获取当前文件夹.相 ...

  6. s14 第5天 时间模块 随机模块 String模块 shutil模块(文件操作) 文件压缩(zipfile和tarfile)shelve模块 XML模块 ConfigParser配置文件操作模块 hashlib散列模块 Subprocess模块(调用shell) logging模块 正则表达式模块 r字符串和转译

    时间模块 time datatime time.clock(2.7) time.process_time(3.3) 测量处理器运算时间,不包括sleep时间 time.altzone 返回与UTC时间 ...

  7. php课程---文件操作及文件上传的代码总结

    php里面文件包含目录和文件两种 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "h ...

  8. AIR文件操作:使用文件对象操作文件和目录 .

    来源:http://blog.csdn.net/zdingxin/article/details/6635376 在AIR中可以方便的对本地文件操作,不过上次做了个项目,发现还是有不少不方便的地方,比 ...

  9. Python之文件操作:文件的读写

    一.open函数:对文件读写之前,需要先打开文件,获取文件句柄 注意:open() file() 尽量使用open(),Python3以后不支持file()了 1.open(file_name[,ac ...

  10. linux常用命令之------文件操作、文件查看、权限、打包压缩

    1.一般公司把linux作为自己的应用服务器,将应用和服务器部署在上面 2.测试一般用来打包.压缩.查日志,写一个简单的shell 获得linux服务器的方式 a:网上租一台云服务器 b:安装vmwa ...

随机推荐

  1. C语言中void*详解及应用

    void在英文中作为名词的解释为“空虚:空间:空隙”:而在C语言中,void被翻译为“无类型”,相应的void *为“无类型指针”.void似乎只有“注释”和限制程序的作用,当然,这里的“注释”不是为 ...

  2. 基础学习day10--异常、包

    一.异常 1.1.异常定义 异常:--不正常,程序在运行时出现不正常情况 异常由来:其实也是现实生活中一个具体的事物,马可以通过JAVA的类的形式表现描述,并封装成类. Java对不正常情况描述后的, ...

  3. xib命名注意事项--防止被其他控制器意外地 当做默认的 view了

    注意: 1.创建的xib如果不是想给指定的控制器做view的话,命名就要注意了! 2.最好是不要命名和控制器名字相关的xib. 如下举例说明一下: - (void)touchesBegan:(NSSe ...

  4. iOS 验证邮箱手机号格式

    做登录界面时,用户在UITextfield中输入输入邮箱账号后,我们应该在本地验证格式是否正确,再将参数传给服务器验证. 最简单的就是利用系统的NSPredicate //利用正则表达式验证 -(BO ...

  5. Swift中的字典

    学习来自<极客学院:Swift中的字典> 工具:Xcode6.4 直接上基础的示例代码,多敲多体会就会有收获:百看不如一敲,一敲就会 import Foundation //字典的声明 v ...

  6. 使用docker搭建lnmp环境

    Docker容器LNMP环境搭建 安装 制作镜像 启动并关联实例 安装 系统环境 硬件型号: ThinkPad T520 系统版本: ubuntu 14.04 CPU: i7 RAM: 8G 添加软件 ...

  7. 深入理解CSS中的层叠上下文和层叠顺序

    零.世间的道理都是想通的 在这个世界上,凡事都有个先后顺序,凡物都有个论资排辈.比方说食堂排队打饭,对吧,讲求先到先得,总不可能一拥而上.再比如说话语权,老婆的话永远是对的,领导的话永远是对的. 在C ...

  8. 用nginx-gridFS读取MongoDB的图片及文件(为什么你老是配不成功?)

    最近在部署公司服务器的nginx + mongodb + gridfs环境: 搜索了N多文档,基本上都一样,期间遇到很多问题: 下面是整理的一份搭建文档: 摘要 nginx-gridfs是一个ngin ...

  9. Android Design Support Library——Floating Action Button

    Floating Action Button是一种悬浮操作的圆形按钮,继承自ImageView,可以通过android:src或者ImageView的任意方法,来设置FloatingActionBut ...

  10. Android资源下载

    各个版本,在线源码: http://grepcode.com/project/repository.grepcode.com/java/ext/com.google.android/android/ ...