http://blog.csdn.net/songlingrebecca/article/details/5879154
基于Bit位运算的C语言库分析及其应用
1 LibTomproject的简要介绍
LibTom 项目包含开放来源公共领域软件由汤姆St. 丹尼斯用标准C语言写成,他的主页地址是:http://libtomcrypt.org/。
LibTom类库包主要有四个组成部分:LibTomMath、 LibTomCrypt、 LibTomNet, 和 LibTomPoly。2004 年自, LibTomMath 和 LibTomCrypt 是最成熟的组成部分。
LibTomMath 是软件库被优选为有很多特点适当至于使用在password学应用的arbitrary-precision整数算术。它被利用在 LibTomCrypt 和 LibTomPoly。库包含在包含各种各样的任务譬如主要的加法、减法、增殖、部门以及先进的算法譬如高速的模件降低, 幂模运算、jacobi 标志计算、最了不起的通常除数和最少公倍数的一百个作用。包含而且怎么multiple-precision 整数算术高效率地被实施。
LibTomCrypt 是以及几种消息认证代码。算法实施很多password协议, 譬如各种各样的分组password的软件库(AES), 和单向Hash函数, (HMAC, OMAC PMAC), 和几种公开密钥算法(ECC 、RSA 、Diffie-Hellman 和DSA) 。
LibTomPoly 是软件库运行多项式运算基础的软件库。
LibTomPoly是一个公共的开放源码的软件库,它提供多项式主要的运算。他运用公共的软件库LibTomMath(并不包括软件库LibTomMath),来实现整数的运算而且扩展了整数运算的功能实现多项式的四则运算。
LibTomNet 是TCP/IP 协议被建立在 LibTomCrypt 顶部 和添加�认证和编成password来连接。LibTomNet是一个自由公开源码的库,它拓展了LibTom-Crypt库的功能,提供了一个相对简单在TCP/IP协议上的使用加密+认证的数据流。这个库的目的就是使用一个简单的协议,它能够被使用到差点儿不论什么地方而且保证了足够的安全性。这个库里面的函数使用了Berkeley style 模型的socket 函数,并作了合适的改动。
TomsFastMath
TomsFastMath意思是很的块,的确它也很的轻便易用。它使用标准的C语言写成的来解决大整数的运算的。这个库的功能还有很快的求大整数的幂运算和其它与纠错码,设计手冊和RSApassword系统有关的函数
这个库的绝大部分使用标准的C语言来写的。有一小部分(三个文件)使用标准C语言和汇编程序混合到一起的写的
和LibTomMath软件库相比較这个库快的多。而且相当的灵活,它成熟在下面的几点:
1. 新代码设计的有些凌乱有些。
2. 用的是固定的而不是多精度整数
3. 新代码只适合于高速的求模和求幂运算。
为了解决这些问题所以用了些汇编程序,这些汇编程序用得非常小心也非常合适使得取得了非常好的效果,同一时候用了大量的宏定义,使得汇编程序和easy的就被嵌入使用
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,当中包括两个实例:
本文件夹里有下列三个文档,是学习本类库的好材料:
<Implementing Multiple Precision Arithmetic(实现多精度算术)>,有300页,具体写了TomLib算法的实现与应用,是非常好的学习资料!
3 32(64)位机上大整数的数据结构
怎样设计32位PC机上的大整数类型,使得大整数运算效率较高,满足password的有用要求?应该遵从下列原则:
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语言写成的免费的开放源码的库,它支持多精度的整数运算的库。这个库设计的很easy。这个库和应用程序接口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被设计的非常easyeasy使用,它有一个标准的API同意新password,hashes函数,伪随机数生成器,加入�和删除,它的特点是用非常easy使用这些函数
还有些源码的样例公用户使用。
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)
- 分组password
- 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.一些password很的灵活依据
- password支持
- 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 (支持全部password)
- 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也能够构建. 它能够又一次装配除去运算法则, 使用不同的建造选项 (举例来说. 比較小或高速password)或使用不同的建造用工具工作. 它有成功的被測试非常多的月台从处理器的 x86(英代尔和 AMD) , ARM7TDMI , PowerPC 和 MIPS 系列排列. password是全部的 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