数缘社区上对libtom的介绍,贴过来先

来源:互联网 发布:网络诈骗案 编辑:程序博客网 时间:2024/04/30 02:09

基于Bit位运算的C语言库分析及其应用

 

 

1 LibTom工程的简要介绍

 

LibTom 项目包括开放来源公共领域软件由汤姆St. 丹尼斯用标准C语言写成,他的主页地址是:http://libtomcrypt.org/。

 

LibTom类库包主要有四个组成部分:LibTomMath、 LibTomCrypt、 LibTomNet, 和 LibTomPoly。2004 年自, LibTomMath 和 LibTomCrypt 是最成熟的组成部分。

 

LibTomMath 是软件库被优选为有许多特点适当至于使用在密码学应用的arbitrary-precision整数算术。它被利用在 LibTomCrypt 和 LibTomPoly。库包括在包括各种各样的任务譬如基本的加法、减法、增殖、部门以及先进的算法譬如快速的模件减少, 幂模运算、jacobi 标志计算、最了不起的通常除数和最少公倍数的一百个作用。包括并且怎么multiple-precision 整数算术高效率地被实施。

 

LibTomCrypt 是以及几种消息认证代码。算法实施许多密码协议, 譬如各种各样的分组密码的软件库(AES), 和单向Hash函数, (HMAC, OMAC PMAC), 和几种公开密钥算法(ECC 、RSA 、Diffie-Hellman 和DSA) 。

 

LibTomPoly 是软件库执行多项式运算基础的软件库。

 

LibTomPoly是一个公共的开放源代码的软件库,它提供多项式基本的运算。他运用公共的软件库LibTomMath(并不包含软件库LibTomMath),来实现整数的运算并且扩展了整数运算的功能实现多项式的四则运算。

 

LibTomNet 是TCP/IP 协议被建立在 LibTomCrypt 顶部 和增加认证和编成密码来连接。LibTomNet是一个自由公开源代码的库,它拓展了LibTom-Crypt库的功能,提供了一个相对简单在TCP/IP协议上的使用加密+认证的数据流。这个库的目的就是使用一个简单的协议,它可以被使用到几乎任何地方并且保证了足够的安全性。这个库里面的函数使用了Berkeley style 模型的socket 函数,并作了合适的修改。

 

TomsFastMath

 

TomsFastMath意思是非常的块,的确它也非常的轻便易用。它使用标准的C语言写成的来解决大整数的运算的。这个库的功能还有非常快的求大整数的幂运算和其他与纠错码,设计手册和RSA密码系统有关的函数

 

这个库的绝大部分使用标准的C语言来写的。有一小部分(三个文件)使用标准C语言和汇编程序混合到一起的写的

 

和LibTomMath软件库相比较这个库快的多。并且相当的灵活,它成熟在以下的几点:

 

1. 新代码设计的有些凌乱有些。

 

2. 用的是固定的而不是多精度整数

 

3. 新代码仅仅适合于快速的求模和求幂运算。

 

为了解决这些问题所以用了些汇编程序,这些汇编程序用得很小心也很合适使得取得了很好的效果,同时用了大量的宏定义,使得汇编程序和容易的就被嵌入使用

 

 

2 LibTomMath的安装使用

 

(1)下载压缩软件包,编译生成静态库TomMath.lib

 

下载libtommath-0.33压缩包(2M),解压到例如c:/,这时,在C盘下出现目录/libtommath-0.33,此目录内包含了生成所需静态库的全部源代码,可用vc++6.0编译(见C/C++静态连接库(lib)的设计与应用)成静态库TomMath.lib;

 

(2)使用静态库TomMath.lib编程可用vc++6.0编译(见C/C++静态连接库(lib)的设计与应用);注意:头文件为:tommath.h tommath_class.h;tommath_superclass.h

 

 

 

在此目录里有一子目录/ demo,其中包含两个实例:

 

实例1:demo.c

 

实例2: timing.c

 

 

 

本目录里有下列三个文档,是学习本类库的好材料:

 

 

 

1 tommath.pdf

 

<Implementing Multiple Precision Arithmetic(实现多精度算术)>,有300页,详细写了TomLib算法的实现与应用,是很好的学习资料!

 

 

 

2 bn.pdf

 

是TomMath.lib的用户手册

 

 

 

3 poster.pdf

 

是TomLib函数与运算与通常函数与运算的对应表

 

 

 

3 32(64)位机上大整数的数据结构

 

如何设计32位PC机上的大整数类型,使得大整数运算效率较高,满足密码的实用要求?应该遵从下列原则:

 

1 正如int型整数是4个字节的长为32的0、1比特串,大整数类型(mp_int)也应该是一个0、1比特串;

 

2 对于大整数的0、1比特串,进行运算时应尽量发挥C语言的底层运算功能,特别是位运算功能;

 

3 应方便将通常的表示十进大整数数的(0,1,…9)字符串与mp_int的0、1比特串相互转换;

 

4 应方便地将磁盘文件的比特串输入到mp_int中。

 

 

 

根据这些原则,32位机上的大整数类型mp_int可设计为一个(动态)结构如下:

 

 

 

typedef struct {

 

int used, alloc, sign;

 

mp_digit *dp;

 

} mp_int;

 

 

 

其中:

 

(1) mp_digit是无符号整数:

 

typedef unsigned long mp_digit;

 

相当于大整数mp_int的进位制;实际使用这32位的28位,少用4位;28位是3个半字节,适合进行文件处理,多余的4位可用于运算时的进位处理;

 

用16进制表示一个mp_digit如下:

 

0XXXXXXX

 

这里,X为16进数字0-f之一,将这个32位比特串称为一个mp_digit单元;若干个mp_digit单元构成一个大整数;

 

(2) dp是存放大整数的地址,将大整数(的二进比特串)分段(mp_digit单元)存在从该地址起的内存里;缺省时,分配dp为MP_PREC=64(个mp_digit单元),即:alloc=64;

 

(3) used为实际使用的mp_digit单元;

 

(4) sign=0,表示非负数,=1表示负数

 

 

 

不难看出,对于分配了alloc个mp_digit的大整数mp_int,因为实际可以使用的比特数是28*alloc,因此可以表示的整数范围是:

 

[-228*alloc, 228*alloc ]

 

 

 

这样,就推广了32位机的整数类型int到大整数类型mp_int,充分利用了32位机的软、硬件特性,使大整数运算建立在32位机的比特级运算上,得到了最大的效益。

 

 

 

对于64位机,情况类似。

 

 

 

4 LibTomMath库的介绍

 

LibTomMath库特点

 

LibTomMath是一个用纯C语言写成的免费的开放源代码的库,它支持多精度的整数运算的库。这个库设计的非常简单。这个库和应用程序接口API配合使用使得程序非常的高效简单。

 

这个库设计脱离盒子在GCC 2.95,或者Visual C++ v6.00 SP5也可以构建,也不需要配置。这些源代码安排设计的非常合适。这些源代码的旁边还有注解来帮助理解算法和算法的执行。这些代码可以作为一种教学工具作为讲研究数论的学生。

 

这个库提供了非常大量优化的程序为数论的各个领域服务。

 


  • 简单代数

    • 加法
    • 减法
    • 乘法
    • 乘方
    • 除法

 

 

 


  • 位运算

    • 左移/右移 (mult by 2 b by moving digits)
    • 快速的乘2除2 和 2 的K次幂 k>1
    • 二元的与、或、异或

 

 

 


  • 数论

    • 最大公因子
    • 最小公倍数
    • Jacobi 符号计算
    • 延伸欧几里德算法
    • 求模求幂

 

 

 


  • 杂项

    • 在整数里面求根
    • 伪随机整数
    • 有符号和无符号的比较

 

 

 


  • 最优化

    • 快速 Comba based 乘法, 平方 和 Montgomery 程序.
    • Montgomery, Diminished Radix and Barrett based求幂模
    • Karatsuba and Toom-Cook 乘法运算

 

 

5 其他库的介绍:

 

LibTomCrypt库的介绍

 

LibTomCrypt是一个相当复杂有标准组件的加密工具,它提供给开发者相当多的

 

大家熟悉的分组密钥,单向hash函数,链模式,伪随机数生成器,公钥加密和其他的一些程序算法。

 

LibTomCrypt被设计的非常简单容易使用,它有一个标准的API允许新密码,hashes函数,伪随机数生成器,添加和删除,它的特点是用很容易使用这些函数

 

还有些源代码的例子公用户使用。

 

LibTomCrypt是免费自由的软件,它被用在商业上,再分配和其他分支部门领域。

 


  • 公共的领域开放的代码.
  • 用标准的纯C语言写的 (except for things like RNGs for natural reasons)
  • Builds out of the box on virtually every box. All that is required is GCC for the source to build.
  • Includes a 90+ page user manual in PDF format (with working examples in it)
  • 分组密码

    • Ciphers come with an ECB encrypt/decrypt, setkey and self-test interfaces.
    • All ciphers have the same prototype which facilitates using multiple ciphers at runtime.
    • Some of the ciphers are flexible in terms of code size and memory usage.一些密码非常的灵活根据
    • 密码支持

      • Blowfish
      • XTEA
      • RC5
      • RC6
      • SAFER+
      • Rijndael (aka AES)
      • Twofish
      • SAFER (K64, SK64, K128, SK128)
      • RC2
      • DES, 3DES
      • CAST5
      • Noekeon
      • Skipjack
      • Anubis
      • Khazad
  • 链模式

    • 链模式支持

      • ECB
      • CBC
      • OFB
      • CFB
      • CTR
  • 单向hash函数

    • 所有的 hashes用同一个界面原型
    • Hashes 支持.

      • MD2
      • MD4
      • MD5
      • SHA-1
      • SHA-224/256/384/512
      • TIGER-192
      • RIPE-MD 128/160
      • WHIRLPOOL
  • 消息认证

    • FIPS-198 HMAC (支持所有的hashes)
    • FIPS pending OMAC1 (支持所有密码)
    • PMAC 认证
  • 消息加密+认证 模式

    • EAX 模式
    • OCB 模式
  • 伪随机数生成器

    • Yarrow
    • RC4
    • Fortuna
    • SOBER-128
  • 公钥加密算法

    • RSA
    • DH
    • ECC
    • DSA
  • 其它标准

    • PKCS #1 (both v1.5 and v2.0 padding)
    • PKCS #5
    • ASN.1 DER for INTEGER types.

 

LibTomCrypt这个库设计脱离盒子在GCC 2.95,或者Visual C++ v6.00 SP5也可以构建. 它可以重新装配除去运算法则, 使用不同的建造选项 (举例来说. 比较小或快速密码)或使用不同的建造用工具工作. 它有成功的被测试很多的月台从处理器的 x86(英代尔和 AMD) , ARM7TDMI , PowerPC 和 MIPS 系列排列. 密码是所有的 endian 中立者和只有使用标准 C 语法.

 

 

LibTomPoly库的介绍

 

LibTomPoly 有如下的特征:

 


  • 公众的领域而且只依赖 LibTomMath, LibTomMath 是另外一个公共的库.
  • 轻便的源代码
  • 提供有限的不同程度多项式计算

    • 包括一些代数的操作.
    • 平常的加法,减法,除法,乘法.
    • 模组的版本那增加/替代人员/mul
    • Monic 减少
    • 比较

 

 

 

typedef struct { int used, /* number of terms */

 

alloc; /* number of terms available (total) */

 

mp_int characteristic, /* characteristic, zero if not finite */

 

*terms; /* terms of polynomial */

 

} pb_poly;

 

 

函数返回值

 






返回值



意思




MP _OKAY



函数执行成功




MP _VAL



函数输入是无效的




MP _MEM



内存耗尽




 



 




MP _YES



回答是yes




MP_ NO



回答是No

 

 

 

和 LibTomMath类似 左边的参数是计算的参数,右边的是结果

 

pb_add(a, b, c); /* c = a + b */

 

pb_mul(a, b, c); /* c = a * b */

 

int pb_addmod(pb_poly *a, pb_poly *b, pb_poly *c, pb_poly *d);

 

int pb_submod(pb_poly *a, pb_poly *b, pb_poly *c, pb_poly *d);

 

int pb_mulmod(pb_poly *a, pb_poly *b, pb_poly *c, pb_poly *d);

 

 

 

初始化函数

 

int pb_init(pb_poly *a, mp_int *characteristic);

 

长度大小函数

 

int pb_init_size(pb_poly *a, mp_int *characteristic, int size);

 

拷贝函数

 

int pb_init_copy(pb_poly *a, pb_poly *b);

 

将多项式b拷贝给多项a

 

清除函数

 

int pb_clear(pb_poly *a);

 

释放多项式a

 

基本操作

 






返回值



意思




PB EQ



多项式完全相等




PB DEG LT



左边多项式比右边多项式次幂低




PB DEG EQ



左边多项式和右边多项式次相同




PB DEG GT



左边多项式比右边多项式次幂高

 

 

 

乘多项式和除多项式

 

函数原型:

 

int pb_lshd(pb_poly *a, int i);

 

int pb_rshd(pb_poly *a, int i);

 

例子

 

pb_lshd(a, 2); /* a(x) = a(x) * x^2 */

 

pb_rshd(a, 7); /* a(x) = a(x) / x^7 */

 

 

 

TomsFastMath库的介绍

 

TomsFastMath是一个计算大整数的高精度的库。它提供的函数来操作有符号的大整数通过相关的API和单一的数据类型,。

 

到目前为止只有GCC makefile 被支持。为了创建这个库只需要简单的用命令”make”就可以了。这个库是一个刚刚投入使用的新库,所以现在还没有安装脚本存在。你必须创建这个项目用“make test”

 

为了简单的测试一下,用stest program,键入命令make stest并且按照你的目标运行一下。这个项目会显示出乘法,扯平测长法,montgomery