您好,欢迎光临赵帅的博客,如果有什么不足或者错误之处,感谢您留言指出!

【原创】山东大学 信息安全 LibTomCrypt 对称算法加密文件 实验一

我的大学 赵 帅 399浏览 0评论

写在前面

这个实验设计到了LibTomCrypt库的使用,那么首先要对这个库有一些了解,所以可以参考【转载】密码库 LibTomCrypt 库简介 ,只是简单的对该密码库一些函数调用简单介绍,还有一些资料希望大家用的到,所以大神勿喷。

一、知识准备

那么开始之前,我们还是需要了解一点点对称加密算法:

对称密码算法有时又叫传统密码算法,就是加密密钥能够从解密密钥中推算出来,反过来也成立。在大多数对称算法中,加密解密密钥是相同的。这些算法也叫秘密密钥算法或单密钥算法,它要求发送者和接收者在安全通信之前,商定一个密钥。对称算法的安全性依赖于密钥,泄漏密钥就意味着任何人都能对消息进行加密解密。只要通信需要保密,密钥就必须保密。对称算法的加密和解密表示为:
Ek(M)=C
Dk(C)=M
对称算法可分为两类[8]。一次只对明文中的单个位(有时对字节)运算的算法称为序列算法或序列密码。另一类算法是对明文的一组位进行运算,这些位组称为分组,相应的算法称为分组算法或分组密码。现代计算机密码算法的典型分组长度为64位――这个长度大到足以防止分析破译,但又小到足以方便作用。
这种算法具有如下的特性:
Dk(Ek(M))=M
常用的采用对称密码术的加密方案有5个组成部分
l)明文:原始信息。
2)加密算法:以密钥为参数,对明文进行多种置换和转换的规则和步骤,变换结果为密文。
3)密钥:加密与解密算法的参数,直接影响对明文进行变换的结果。
4)密文:对明文进行变换的结果。
5)解密算法:加密算法的逆变换,以密文为输入、密钥为参数,变换结果为明文。
对称密码术的优点在于效率高(加/解密速度能达到数十兆/秒或更多),算法简单,系统开销小,适合加密大量数据。

下面是一些对称加密的方法,我们在这里用到了:DES、AES、Blowfish。

然后我们还要看一下有多少个加解密模式。密码算法的工作模式就是怎样使用密码算法来达到一定的目的,比如怎样加密一个文件。工作模式有很多种,仅用于加密的,用来构造HASH 函数的,仅用于生成消息验证码的,用于伪随机数生成的,既能加密又能同时生成验证码的,专门针对磁盘加密。然后,我们用到了四个加密模式:ECB,CBC,CFB,OFB,CTR

二、配置项目

在这里,我们用到了 Visual Studio 2016 工具,然后要用到 LibTomCrypt 库和 LibTomMath 库,首先是 在visual studio 2013中打开 libTomMath 库,直接编译(build),生成项目,然后会在 Debug 文件里面找到 libtommath.lib 文件,然后将这个文件复制到 LibTomCrypt 库里面的header里面:

然后,我们就在Visual Studio 里面再打开 LibTomCrypt 项目,然后我们需要配置一下这个项目的一些静态库和头文件的路径设置:

完成上面操作之后,你会发现在 Debug 目录下面存在一个tomcrypt.lib 文件,然后我们新建一个工程Crypt,并且将以LibTomCrypt开头的 .h 文件 tomcrypt.lib 文件全部复制到我们新建工程Crypt的一个名字叫 include的文件夹里面(这个文件夹需要我们自己创建),然后我们还是需要配置 库路径 和 头文件路径 (这个里面需要根据自己的项目路径去配置):

最后需要加上一个lib静态库的名字,也就是 tomcrypt.lib

三、代码解析

之前说了,这个小程序设计到了AES、DES、Blowfish三种算法,其实原理都是差不多的,我们要接收控制台输入,选择自己指定的加解密的方法、加解密的模式、IV变量、密钥等等。

首先定义一些变量,在后面会用到:

使用某个算法之前,需要进行注册,使用 register_cipher()  函数:

在注册完加密方法之后,我们需要利用 int find_cipher(const char *name)  获取已注册的密码算法索引值:

下面我们就可以根据选择的加密方法和工作模式进行初始化

然后我们根据选择的加密还是解密的模式进行相对应的加解密方法:

我们需要读取 明文 并且需要创建密文,所以在开始之前 我们已经声明了三个文件流的指针变量, plaintext, cryptText  decryptText 

并且在这里我们需要用到 C语言的 fopen 方法,在读文件的时候,我们要以二进制文件(很重要!!)的形式来读取,这样会避免一些由于读取文件时候而出现的不必要的错误:

加密流程:

在这里我们首先使用 memset 这个函数对读取的明文块和加密后的密文块进行初始化:

然后使用 fread() 方法每次读取固定大小的块长:

然后使用 cbc_encrypt() 方法进行加密:

然后用 fewrite() 方法将加密好的密文 pt 写入到文件流里面:

直到文件读取结束,加密完成。

解密流程

同样我们需要读取密文和创建解密文件(和上面的方法类似):

相对于加密流程相对应的是我们用到了 cbc_decrypt() 这个解密方法,

并且将解密好的明文写入到文件里面:

直到密文文件读取结束,解密完成。

四、运行测试

我们选择加密方法和加密模式:然后选择明文a.txt, 再选择密文b.txt, 输入IV初始向量、key密钥

然后我们看一下明文和密文:
然后我们进行解密,其流程和上面相似:

我们看一下解密之后的明文:

啊哈,解密成功~

以上就是一个简单的对称加密文件的小程序,分享出来,有需要的朋友点个赞吧~~

参考资料

程序源码:http://pan.baidu.com/s/1eR774cE

实验报告:http://pan.baidu.com/s/1cd3GGA

转载请注明:碎念 » 【原创】山东大学 信息安全 LibTomCrypt 对称算法加密文件 实验一

喜欢 (6)or分享 (0)