使用LibtomCrypt密码库

2020/05/05 密码学

LibTom Projects are open source libraries written in portable C under a permissive license. The libraries supports a variety of cryptographic and algebraic primitives designed to enable developers and students to pursue the field of cryptography much more efficiently. Currently the projects consist of three prominent libraries (LibTomCrypt, LibTomMath and TomsFastMath) which form the bulk of the source contributions.

Libtom项目包含三个部分,分别是LibTomMath(LTM)、TomsFastMath(TFM)和LibTomCrypt。其中LibtomCrypt是一个比较成熟的、基于C语言的开源密码库。下面我主要记录下如何在Linux系统上安装LibtomCrypt并使用该库。

安装

访问这里,下载LibtomCrypt和TFM的源代码文件。需要注意的是,默认情况下LibtomCrypt不提供数学支持,需要预先LTM和TFM组件,下面内容以TFM为例。

安装TFM

wget https://github.com/libtom/tomsfastmath/releases/download/v0.13.1/tfm-0.13.1.zip
unzip tfm-0.13.1.zip
cd tomsfastmath-0.13.1
sudo make install

安装LibtomCrypt

wget https://github.com/libtom/libtomcrypt/releases/download/v1.18.2/crypt-1.18.2.zip
unzip crypt-1.18.2.zip
cd libtomcrypt-1.18.2
sudo make install CFLAGS="-DUSE_TFM -DTFM_DESC" EXTRALIBS="-ltfm"

运行测试文件

cd libtomcrypt-1.18.2
make CFLAGS="-DUSE_TFM -DLTM_DESC" EXTRALIBS="-ltfm" test
./test

Hello World

我们使用下面代码来测试一下是否正确安装密码库。

// testLibtomCrypt.c
#include <tomcrypt.h>
int main(void)
{
   ltc_mp = tfm_desc;
   ecc_key mykey;
   prng_state prng;
   int err;

   /* register yarrow */
   if (register_prng(&yarrow_desc) == -1) {
      printf("Error registering Yarrow\n");
      return -1;
   }

   /* setup the PRNG */
   if ((err = rng_make_prng(128, find_prng("yarrow"), &prng, NULL))
       != CRYPT_OK) {
      printf("Error setting up PRNG, %s\n", error_to_string(err));
      return -1;
   } else {
      printf("PRNG OK!\n");
   }

   /* make a 192-bit ECC key */
   if ((err = ecc_make_key(&prng, find_prng("yarrow"), 24, &mykey))
       != CRYPT_OK) {
      printf("Error making key: %s\n", error_to_string(err));
      return -1;
   }
   return 0;
}

编译命令为

gcc -DTFM_DESC testLibtomCrypt.c -ltomcrypt -ltfm -o test
./test

# Output : PRNG OK!

从上面的例子中,我们需要注意三点。第一是头文件的名称是tomcrypt.h。第二是每一个main函数中都要声明使用的数学库,例如这里安装了TFM,所以需要添加一行代码ltc_mp = tfm_desc;显式标注。第三是需要注册和声明伪随机数生成器。

可能会遇到的问题

如果你在macOS上按照上面的步骤安装LibtomCrypt时,在第一步安装TFM过程中会提示没有权限读写。即便已经使用sudo命令提升到root用户,也会提示没有权限读写。这是因为在比较新版本的macOS中启用了安全保护机制,无法对/usr/lib/usr/include这两个文件夹写入文件。这个问题进一步导致安装LibtomCrypt时编译过程出错,提示的原因是找不到头文件tfm.h

解决办法有两个思路。第一种思路是关闭macOS的安全保护机制,需要进入系统恢复模式中输入命令关闭,这样做可能会带来未知的安全风险,这里不详细展开。下面主要讲一下第二种思路。

简单说就是将头文件和静态库放到别的目录中,在编译自己的程序时显式指定头文件和静态库所在的目录。

# 分别创建两个文件夹
mkdir Libs
mkdir Include

# 安装TFM
cd tomsfastmath-0.13.1
make
cp src/headers/tfm.h ../Include/
cp libtfm.a ../Libs/

# 安装LibtomCrypt
cd libtomcrypt-1.18.2
make CFLAGS="-DUSE_TFM -DTFM_DESC -I/Users/alienx/Downloads/Include" EXTRALIBS="/Users/alienx/Downloads/Libs/libtfm.a"
cp -r src/headers/ ../Include/
cp libtomcrypt.a ../Libs/

# 编译测试文件
# testLibtomCrypt.c 与Include、Libs文件夹在同一目录下
gcc -c testLibtomCrypt.c -I./Include -Wall -O2 -DTFM_DESC
gcc -o test testLibtomCrypt.o -L./Libs -ltomcrypt -ltfm
./test
# Output : PRNG OK!

总结

写下这篇内容的原因是自己在安装这个密码库时遇到了很多问题,最终是通过阅读代码库里面的README.md来解决问题的。对于一个程序员或者是工程师来说,遇到问题第一时间不应该是百度或者是谷歌,我认为应该先把代码里面的说明文档仔细看清楚。

例如有一处地方,就是调用这个密码库的时候需要显式标注数学库的类别(ltc_mp = tfm_desc;)以及注册伪随机数函数,这一点在Github上并没有说明。当时一直以为是没有正确安装导致出错,浪费了许多时间。事实上在代码库的说明文档中有清晰的注明如何编写一个示例程序,因为第一次出现在第97页,所以懒得去看…

我在这个密码库的基础上修改了DSA的部分代码实现了基于DSA的批量认证算法,见博客中其它文章。

Search

    Table of Contents