LibtomCrypt库

2019/09/05 密码学

我在做批量认证协议的实验时,需要调用常见密码学的库来实现密码算法。例如在Python环境下,可以使用pycrypto库,在C/C++环境下,可以选择LibTomCrypt库。下面主要描述关于这个库的使用以及我在使用过程中遇到的问题。

LibTomCrypt简介

LibTomCrypt是一个简单易用的加密工具,它提供给开发者相当多的大家熟悉的分组密码、单向hash函数、伪随机数生成器、公钥加密和其他的一些程序算法。它用标准的纯C语言写成。它有一个标准的API允许新密码,hashes函数,伪随机数生成器,添加和删除,它的特点是用很容易使用这些函数。LibTomCrypt是免费自由的软件。

LibTom库除了这个Crypt密码库,还有另外两个可选的库,分别是LibTomMath、TomsFastMath,这两个库用于为Crypt提供可选的数学支持。点击这里libtom可以下载相关的源代码。

Build

最快速方便构建静态库:

make

如果要构建一个共享的库:

make -f makefile.shared

运行tests文件夹下的代码,在运行之前确保已经安装LibTomMath。

make CFLAGS="-DUSE_LTM -DLTM_DESC" EXTRALIBS="-ltommath" test

使用GMP模块提供数学运算支持,在运行之前确保已经安装LibTomMath、TomsFastMath、GMP。

make CFLAGS="-DUSE_GMP -DGMP_DESC -DLTM_DESC -DTFM_DESC" EXTRALIBS="-lgmp" timing

遇到的问题

我在github上fork了一份代码,地址是LearnLibtom。这份代码实现了在MacOS环境下调用LibTomCrypt静态库,执行AES加密的功能。我在这份代码的框架基础上实现DSA加解密的功能,但是一直没能跑成功。我从LibTomCrypt库中下载原版的测试代码,代码在编译阶段没有任何问题,但是在运行阶段会出现错误:

ltc_mp.name == NULL

我在google上查了很多资料,都没有找到这个错误的原因。我将类似的问题的所有解决方式都尝试了一遍,就是绕不开这个错误。于是我在源代码中搜索ltc_mp变量,然后初始化该变量,失败;调用这个结构体自带的初始化函数,失败;自定义一个同名的变量,失败。

在很多次的实验过程中,我发现了该变量的用途,它是用来定义使用什么类型的数学运算模块。LibTomCrypt支持使用GMP、Libtommath、TomsFastMath作为数学运算模块。同时我也弄明白为什么AES部分的代码能成功运行,而DSA不行,那是因为原作者的代码中,在调用AES算法中装填的密码是自定义的,而不是随机生成的。我调用DSA随机生成密钥的接口中需要使用伪随机数生成器,这个参数依赖上述的任意数学运算模块。

那么现在问题就转变为:

  1. 如何定义数学运算模块。

  2. 如何初始化伪随机数生成器。

这两个问题,我翻遍了源代码、README.md和测试样例的代码,都没有找到准确的答案。我只知道一点是在生成静态库的时候可以在编译阶段添加数学运算模块的关键字,分别是GMP_DESC、LTM_DESC、TFM_DESC。这个描述清楚的写在源代码的README.md中,但是这并不能解决上述问题。

意外的是,所有的答案都在长达208页的开发者文档中。(下载地址

在手册的17.4小节中说明,创建静态库的时候需要显式标明使用的数学模块,否则在默认情况下是不会链接到任何的数学模块,也就是没有默认项。(无语)

好了,当正要运行的时候,结果还是失败了。说明看手册不认真,继续看。

在手册的10.10小节是一段使用RSA加密的示例代码,其中有几行非常重要的代码。原来用到的伪随机数生成器、Hash功能全部都要先注册,而且这里还初始化了ltc_mp结构体为tfm_desc,表明使用TFM_DESC模块。

/* register prng/hash */
if (register_prng(&sprng_desc) == -1) {
    printf("Error registering sprng");
    return EXIT_FAILURE;
}

/* register a math library (in this case TomsFastMath) */
ltc_mp = tfm_desc;

/* register hashes .... */
if (register_hash(&sha1_desc) == -1) {
    printf("Error registering sha1");
    return EXIT_FAILURE;
}

呜呼,到这里程序就可以运行了,我将源代码上传到github上,地址是https://github.com/alienxcn/LearnLibtom

总结

平时在写代码的时候难免会遇到各种各样非预期的奇葩Bug,我的第一反应就是google和baidu搜问题的解决方案,将别人的方法自己立刻去试一遍。在大部分时候这样做是没有问题的,而且搜索技巧足够好的话,很快就能解决问题。不过这样做就会让自己忽视了问题的本质,也就是这个Bug为什么会产生。只顾着解决问题,但是没能引起对这个问题的深入思考,这样长期来看并不是好事情。

教训来啦:下次使用开源代码时,一定要看说明书!(Developer Documentation)

Search

    Table of Contents