//文件加密解密
#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. 主程序底部TabBar功能跟登录页面布局

    1:主程序底部TabBar的功能实现 效果图: 主要代码如下: - (UITabBarController*)setRootVC:(BOOL)bShowCart { //创建一个子控制器 用于显示当前 ...

  2. iOS学习笔记10-UIView动画

    上次学习了iOS学习笔记09-核心动画CoreAnimation,这次继续学习动画,上次使用的CoreAnimation很多人感觉使用起来很繁琐,有没有更加方便的动画效果实现呢?答案是有的,那就是UI ...

  3. iOS 中的 NSTimer

    iOS 中的 NSTimer NSTimer fire 我们先用 NSTimer 来做个简单的计时器,每隔5秒钟在控制台输出 Fire .比较想当然的做法是这样的: @interface Detail ...

  4. 通过注册的URL Scheme向目标APP传递参数

    通过注册的URL Scheme向目标APP传递参数 通过URL Scheme启动APP很简单就可以做到,但有时候我们想在启动APP的时候传递一些参数,这个时候我们就可以通过URL Scheme自定义U ...

  5. iOS App打包流程

    1.什么是打包 将应用程序统一放在一个后缀是ipa的文件中,然后发给其他人,可以安装在手机上供用户或测试人员安装 2.可安装ipa的前提 ①说清楚是哪一个应用程序(App Id) ②可以安装在哪一台设 ...

  6. MSLocalDB

    今天用MSLocalDB做测试,发现保存的中文都变成了??,基本可以确定是排序规则的问题,LocalDB建库默认使用Latin规则,需要改为Chinese_PRC_CI_AS,为了修改规则,需要先修改 ...

  7. SIEBEL应用概述

    Siebel CRM是围绕客户关系管理这个主题建立起来的一系列应用的总和,和一些国内公司的CRM/CALL CENTER产品不一样,Siebel应用远远不是只是接一些电话然后记录下来并进行处理这么简单 ...

  8. Eclipse報錯:Could not find or load main class

    代碼正確,但在Eclipse中無法運行,一直報錯: Could not find or load main class

  9. 深入PHP内核之面向对象总结

    很久以前看过的,今天总结一下 一.PHP中创建一个类 在PHP中创建一个简单的类是这样的: <?php $obj = new test($url) ?> 二.zend_class_entr ...

  10. select2使用

    一.简介 select2是Jquery用来代替选择框的一种组件.它让你可以定制下拉框,并且支持搜索.标记,远程数据源,无限滚动和其他更高级的功能.select2的下载地址为:https://selec ...