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,当中包括两个实例:

实例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. 大数据打造你的变美频道——数加平台上小红唇的大数据实践

    在2017在线峰会--票选最美云上大数据暨大数据技术峰会上,来自小红唇的王洋分享了数加平台上小红唇的大数据实践.他对数据仓储解决方案和搜索引擎进行了详细介绍.通过算法平台应用的基于视频元信息的回归.近 ...

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

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

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

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

  4. “数”说“云上盛宴” “智”创未来生活 中国联通:“线上+线下”为智博会赋能添彩

    2021中国国际智能产业博览会(下简称"智博会")于8月23日拉开帷幕,重庆的大数据智能化发展再一次成为关注的焦点.期间,中国联通将采取"1+4"布展新格局,通 ...

  5. Flink:史上最详细的介绍(一)[简介]

    1.Flink简介 Flink:史上最详细的介绍(二)[架构体系] Flink:详细的不能再详细的安装步骤(三)[安装步骤] Flink:详细讲解FlinkFlink 运行架构(四)[运行架构] Fl ...

  6. 【无标题】音频蓝牙语音芯片,WT2605C-32N实时录音上传技术方案介绍

    基于WT2605C-32N音频蓝牙语音芯片的实时录音上传技术方案介绍 现代社会,信息技术的发展尤其迅速,信息和数据的重要性和安全性日渐深刻,在某些特殊场合,因为工作上的需要,或者日常生活的需求,往往需 ...

  7. 求出千位数上的数加百位数上的数等于十位数上的数加个位数上的数的个数cnt,再把所有满足条件的四位数依次存入数组b中,然后对数组b中的四位数按从大到小的顺序进行排序。

    已知数据文件IN13.DAT中存有300个四位数,并已调用读函数readDat()把这些数存入数组a中,请编制一个函数jsValue(),其功能是:求出千位数上的数加百位数上的数等于十位数上的数加个位 ...

  8. 编制一个函数jsValue(),求出千位数上的数减百位数上的数减十位数上的数减个位数上的数大于零的个数cnt,再求出所有满足此条件的四位数的平均值pjz1,以及不满足此条件的四位数的平均值pzj2

    已知数据文件IN15.DAT中存有300个四位数,并已调用读函数readDat()把这些数存入数组a中,请编制一个函数jsValue(),其功能是:求出千位数上的数减百位数上的数减十位数上的数减个位数 ...

  9. android模拟器玩手游,手游模拟器使用说明 手游在电脑上玩的方法介绍

    手游模拟器使用说明 手游在电脑上玩的方法介绍 2018-06-05 16:33:31来源:游戏下载编辑:评论(0) 随着移动互联网的不断发展,人们时间愈加聚焦于移动互联设备工具,移动手机端各种应用逐年 ...

最新文章

  1. MySQL 性能优化,优化设计及设计原则解读
  2. 转: jdbc连接数据库需要注意和出错的地方
  3. 两个ListBox的相互操作
  4. 具有实际意义的5种云遣返
  5. 赤峰市职称计算机,关注丨赤峰今年评职称最新政策全在这……
  6. 面对想法简单客户的有效需求分析
  7. 获取 子文件夹 后缀_CSDN学院第一个Ptython Homework-- 递归统计文件夹大小
  8. python程序启动其他python程序,如何使用Python启动应用程序的实例?
  9. leetcode206:反转链表
  10. sql server charindex函数和patindex函数详解(转)
  11. 单选按钮用法, 选择的值
  12. CPU卡发卡总结(三)——充值和消费
  13. android 整合最新X5WebView 以及离线安装教程
  14. Sketch 51 新功能介绍(包含破解版下载)
  15. 如何编辑修改PDF,PDF怎么删除页眉页脚
  16. 层次短语模型学习笔记
  17. excel取整数的函数_函数010 EXCEL如何随机打乱数据,不重复随机数来帮忙!
  18. java的login_Java login登陆界面设计
  19. ESP32----NVS使用
  20. 我,是一个培训班出来的程序员

热门文章

  1. Ubuntu-13.04-X86_64安装GT630驱动
  2. 修复系统字体,解决文字乱码问题。
  3. 系统缺失字体: Symbol、Wingdings、Wingdings2...
  4. UVA 10189 Minesweeper
  5. 移动硬盘里面的文件怎么恢复
  6. ZooKeeper 可视化工具
  7. 采用流媒体技术实现网络中的视频、音频传播
  8. VB程序设计教程(第四版)龚沛曾-实验8-5
  9. java实现两人对战的五子棋游戏
  10. 宅在家的这几天,突然收到(余额宝)视频面试,四面成功拿下offer