为了便于使用Montgomery约化,专门定义了一个结构体,我们将它称作Montgomery模数,这点与Barrett模数类似。结构体的定义如下:

struct bn_mont_ctx_st

{

int ri;

BIGNUM RR;

BIGNUM N;

BIGNUM Ni;

BN_ULONG n0;

int flags;

};

typedef struct bn_mont_ctx_st BN_MONT_CTX;

其中:

  • ri                    模数N的长度,若记N的字长为len,则ri=len×32;
  • RR                  即R2 mod N,在将大整数转化到Montgomery整数时用。R=2ri=Blen。
  • N                    模数;
  • Ni                   即上面算法中提到的,。
  • n0                   Ni的最低字。
  • flags                       Montgomery模数的属性,和大整数的属性类似。

为了方便对这种新的结构体进行操作与管理,定义了许多相关的基本函数来做实现一些基本的功能——初始化、新建、释放、设置模数、Montgomery模数和普通大整数之间的转换。

(1).    首先看看怎样新建和释放一个Montgomery模数。这一点与大整数的新建和释放(见§0.2.1)是非常相似的。同样是两种方法都可以新建一个Montgomery模数。

  1. 方法1:先定义再初始化:

BN_MONT_CTX mont;

BN_MONT_CTX_init (&mont);

  1. 方法2:新建一个指向Montgomery模数的指针,再调用新建函数。

BIGNUM * mont;

mont=BN_MONT_CTX_new();

Montgomery模数的释放也和大整数相同。

  1. 用方法1——BN_MONT_CTX_init新建的Montgomery数,无法人为地释放。只有当该大整数所在的函数执行完毕后,才能同别的数据类型一起被释放。
  2. 用方法2——BN_MONT_CTX_new新建的Montgomery数,可以人为地释放。调用专门的释放函数BN_free即可:

BN_MONT_CTX_free (mont);

下面简要介绍下上面涉及到的三个函数。方法1用到的初始化函数:

───────────────────────────────────────

void BN_MONT_CTX_init(BN_MONT_CTX *ctx)

功能:    初始化Montgomery模数,内部信息置零。

输入:    ctx

输出:    -

返回:    -

出处:    bn_mont.c

备注:    内部信息(n0除外)置零。

───────────────────────────────────────

方法2用到的新建函数:

───────────────────────────────────────

BN_MONT_CTX *BN_MONT_CTX_new(void)

功能:    新建一个Montgomery模数,并将内部信息置零

输入:    -

输出:    -

返回:    新建的Montgomery模数地址

出处:    bn_mont.c

───────────────────────────────────────

释放Montgomery模数用到的函数:

───────────────────────────────────────

void BN_MONT_CTX_free(BN_MONT_CTX *mont)

功能:    释放Montgomery模数

输入:    mont

输出:    -

返回:    -

出处:    bn_mont.c

───────────────────────────────────────

(2).    设置Montgomery模数。初始化或者新建好一个Montgomery模数以后,该模数内部信息全部为零,所以需要设置其内部信息。可以是用一个大整数来设置模数的内部信息,也可以直接从一个已有的Montgomey模数那里复制。

───────────────────────────────────────

int BN_MONT_CTX_set(BN_MONT_CTX *mont, const BIGNUM *mod)

功能:    利用给定大数设置Montgomery模数

输入:    mod【用来设置Montgomey模数的大整数】

输出:    mont【Montgomery模数】

返回:    1【正常】 or 0【出错】

出处:    bn_mont.c

备注:    利用给定大数mod设置好Montgomery模数中相关信息——ri,RR,N,Ni,n0。

───────────────────────────────────────

复制Montgomery模数如下:

───────────────────────────────────────

BN_MONT_CTX *BN_MONT_CTX_copy (BN_MONT_CTX *to, BN_MONT_CTX *from)

功能:    复制Montgomery模数

输入:    from【源模数】

输出:    to ← from

返回:    to【目标模数,正常】 or NULL【出错】

出处:    bn_mont.c

───────────────────────────────────────

OpenSSL密码库算法笔记——第2.3.3章 Montgomery模数与相关函数相关推荐

  1. OpenSSL密码库算法笔记——第 2.2.4章 Barrett模数与相关函数

    为了便于使用Barrett约化,专门定义了一个结构体,我们将它称作Barrett模数.结构体的定义如下: struct bn_recp_ctx_st { BIGNUM N; BIGNUM Nr; in ...

  2. OpenSSL密码库算法笔记——第6.5.2章 密钥协商函数

    现在来看看OpenSSL中哪些函数是用来具体实现密钥协商的. ─────────────────────────────────────── int ECDH_compute_key(void *ou ...

  3. OpenSSL密码库算法笔记——第4.1.1章 平方和算法

    平方和算法是模指数运算的基本.如果指数e的二进制展开为,则利用平方和算法可以这样计算模指数: .                                        ----(4.1) 现在 ...

  4. OpenSSL密码库算法笔记——第4.1.2章 窗口算法

    如果存储空间足够的话,可以事先将一部分计算结果(比如指数很小时的运算结果)存储起来,到后面需要时再直接调用.窗口算法就用到了这种思想,它一次可以处理指数e的多个比特(不妨设为k比特,而k称为窗口的大小 ...

  5. OpenSSL密码库算法笔记——第5.1.2章 椭圆曲线算法集

    在定义椭圆曲线点群时出现了描述曲线所用算法的参数const EC_METHOD *meth,这一节就来看看这个参数有什么用处. 椭圆曲线算法集的定义如下. typedef struct ec_meth ...

  6. OpenSSL密码库算法笔记——第1.2.2章 comba乘法

    comba乘法就是用另外一种顺序来做乘法:           ----(1.4) 即按照由低到高的顺序计算乘积r的每一个字.其具体算法如下:(参见[3]算法3) ────────────────── ...

  7. OpenSSL密码库算法笔记——第1.2.5章 comba平方

    comba平方就是将comba乘法和经典平方的思想结合在一起: ----(1.9) 具体算法如下:(参见[3]算法4) ─────────────────────────────────────── ...

  8. OpenSSL密码库算法笔记——第5.1.1章 椭圆曲线点群的定义

    下面定义的椭圆曲线点群不仅包含了域的信息和曲线的信息,甚至还包括了很多别的有利于实现的信息. 椭圆曲线点群的定义如下. typedef struct ec_group_st   EC_GROUP; s ...

  9. OpenSSL密码库算法笔记——第5.3.1章 椭圆曲线点群的算法集

    在使用椭圆曲线之前,必需先设定好曲线上的算法集,只有这样在应用中才知道应该使用哪些函数. 下面就来看看怎样设定好曲线上的方法集. ─────────────────────────────────── ...

  10. OpenSSL密码库算法笔记——第2.2.2章 Barrett约化的优越性

    现在简单的将经典运算和Barrett约化做下对比.经典模运算就是做长除法,而Barrett约化与经典模运算不同. 经典模运算 = 除法. Barrett约化 = 2次特殊的除法 + 2次较特殊的乘法 ...

最新文章

  1. 简单的 基于seajs一个base基础库
  2. 情感分析之电影评论分析-基于Tensorflow的LSTM
  3. 如何简单的在 ASP.NET Core 中集成 JWT 认证?
  4. python如何创建一个类_python 3——自定义一个类、object类
  5. Native方式运行Fabric(非Docker方式)
  6. linux下加载so文件
  7. 软件设计模式学习总结
  8. 【Android音视频开发】【007】SurfaceView实现H264播放器
  9. Shell中IF大于等于小于
  10. PyTorch深度学习(B站刘二大爷)第八讲作业——Kaggle网站泰坦尼克号Titanic
  11. Docker容器之Consul部署
  12. pygame创建透明背景
  13. python提示unmatched_Python: Unmatched group exception
  14. 飞思卡尔 I.MX6Q-高分辨率(1080P)视频采集编码
  15. plt.scatter 中cmap参数详解
  16. FPG-超越FPN/NAS-FPN的表现 | Feature Pyramid Grids
  17. 上海30K*16和深圳22K*14的offer同时揽下,真的是行情不好吗?
  18. 突发!IBM 中国研究院倒闭了,码农:又少了一个上岸养老的地方,搞科研的打不过搞996的...
  19. 电路板焊接技巧实践(没有电烤箱条件下)
  20. 大幅面柔性印刷线路板缺陷在线视觉检测系统设计

热门文章

  1. win10 戴尔电脑 禁用触摸板
  2. 苏宁有货:为“轻创业”而来
  3. 小程序上传图片加水印
  4. 生产者消费者问题实验java,java实现:《操作系统实验一》:模拟管程解决解决生产者-消费者...
  5. 关于java的http请求的工具类
  6. 十大热门编程语言优缺点对比
  7. 透过表象看本质!?之三——Kalman滤波
  8. matlab x轴特殊符号,matlab中的特殊符号
  9. 常用上市公司控制变量数据集
  10. 改变一个ppt所有的幻灯片的背景色和字体颜色