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.htommath_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机上的大整数类型,使得大整数运算效率较高,满足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

数缘社区上对libtom的介绍,贴过来先的更多相关文章

  1. 从SAP社区上的一篇博客开始,聊聊SAP产品命名背后的那份情怀

    最近Jerry在SAP社区上看到一篇博客:It's Steampunk now. 博客原文:https://blogs.sap.com/2019/08/20/its-steampunk-now/ 什么 ...

  2. 17.从键盘上输入一个正整数n,请按照以下五行杨辉三角形的显示方式, 输出杨辉三角形的前n行。请采用循环控制语句来实现。 (三角形腰上的数为1,其他位置的数为其上一行相邻两个数之和。) 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1

    17.从键盘上输入一个正整数n,请按照以下五行杨辉三角形的显示方式, 输出杨辉三角形的前n行.请采用循环控制语句来实现. (三角形腰上的数为1,其他位置的数为其上一行相邻两个数之和.) 1 1 1 1 ...

  3. Python数模笔记-Sklearn(1) 介绍

    1.SKlearn 是什么 Sklearn(全称 SciKit-Learn),是基于 Python 语言的机器学习工具包. Sklearn 主要用Python编写,建立在 Numpy.Scipy.Pa ...

  4. 数仓建模—建模工具PdMan(CHINER)介绍

    数据仓库系列文章(持续更新) 数仓架构发展史 数仓建模方法论 数仓建模分层理论 数仓建模-宽表的设计 数仓建模-指标体系 数据仓库之拉链表 数仓-数据集成 数仓-数据集市 数仓-商业智能系统 数仓-埋 ...

  5. 市面上主流服务器简单介绍(apache、IIS、tomcat..)

    apache:apache(阿帕奇)的具体介绍可以参看apache的网站(http://www.apache.org/),或者在网上随便搜搜吧.apache是世界使用排名第一的web服务器软件:它可以 ...

  6. PhoneGap 在 Android 上的插件开发方法介绍

    移动应用开发已经成为软件开发的一个重要方向,但是移动开发面临的一个重要问题就是跨平台的问题.PhoneGap 作为一个多平台的软件开发框架,提供了一次编写多个平台的运行.目前已经支持多达 6 个移动平 ...

  7. ASP中文件上传组件ASPUpload介绍和使用方法

    [导读]要实现该功能,就要利用一些特制的文件上传组件.文件上传组件网页非常多,这里介绍国际上非常有名的ASPUpload组件 1 下载和安装ASPUpload  要实现该功能,就要利用一些特制的文件上 ...

  8. windows下GitHub的安装、配置以及项目的上传过程详细介绍

    概要 本文主要介绍了在Win10系统中安装Github终端.如何配置安装好的Git终端以及如何利用Git终端将自己的项目上传到远程服务器中 操作必备 win10系统电脑一台.良好的互联网连接.GitH ...

  9. Scrum立会报告+燃尽图(十月十五日总第六次):视频上传及选题介绍工作

    此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2196 Scrum立会master:田良 一.小组介绍 组长:付佳 组员: ...

随机推荐

  1. ASP.NET 后台不识别ASPX中的控件

    请问后台不识别ASPX中的控件,怎么解决 这个程序是在网上下载的 C# code <asp:DataGrid runat="server" ID="dgList1& ...

  2. Java实现Http服务器(三)

    下面重点介绍上篇文章介绍的HttpServerImpl类当中的ServerImpl类 sun.net.httpserver.ServerImpl   600行左右的类,是整个HttpServer的核心 ...

  3. JUnit扩展:引入新注解Annotation

    发现问题 JUnit提供了Test Suite来帮助我们组织case,还提供了Category来帮助我们来给建立大的Test Set,比如BAT,MAT, Full Testing. 那么什么情况下, ...

  4. java高级:weakReference

    Java WeakReference的理解与使用 http://www.tuicool.com/articles/imyueq

  5. http server v0.1_mime.c

    #include <string.h> #include "mime.h" static STR_MIME_MAP mime_map[]= { MIME_MAP(MIM ...

  6. [BZOJ 1053] [HAOI 2007] 反素数ant

    题目链接:BZOJ 1053 想一想就会发现,题目让求的 1 到 n 中最大的反素数,其实就是 1 到 n 中因数个数最多的数.(当有多于一个的数的因数个数都为最大值时,取最小的一个) 考虑:对于一个 ...

  7. Gradle在大型Java项目上的应用

    在Java构建工具的世界里,先有了Ant,然后有了Maven.Maven的CoC[1].依赖管理以及项目构建规则重用性等特点,让Maven几乎成为Java构建工具的事实标准.然而,冗余的依赖管理配置. ...

  8. java + spring (jython\python\script) Error:SyntaxError: no viable alternative at character '\n'

    使用Jython结合java和Python开发功能时,要是遇到如下情况: 2016-03-10 16:16:49 DEBUG [com.freedom.orion.configs.JyhtonConf ...

  9. 【POJ2773】Happy 2006 欧几里德

    题目描述: 分析: 根据欧几里德,我们有gcd(b×t+a,b)=gcd(a,b) 则如果a与b互质,则b×t+a与b也一定互质,如果a与b不互质,则b×t+a与b也一定不互质. 所以与m互质的数对m ...

  10. jstat命令(Java Virtual Machine Statistics Monitoring Tool)

    1.介绍 Jstat用于监控基于HotSpot的JVM,对其堆的使用情况进行实时的命令行的统计,使用jstat我们可以对指定的JVM做如下监控: - 类的加载及卸载情况 - 查看新生代.老生代及持久代 ...