本文主要是介绍OpenSSL密码库算法笔记——第2.3.3章 Montgomery模数与相关函数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
为了便于使用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:先定义再初始化:
BN_MONT_CTX mont;
BN_MONT_CTX_init (&mont);
- 方法2:新建一个指向Montgomery模数的指针,再调用新建函数。
BIGNUM * mont;
mont=BN_MONT_CTX_new();
Montgomery模数的释放也和大整数相同。
- 用方法1——BN_MONT_CTX_init新建的Montgomery数,无法人为地释放。只有当该大整数所在的函数执行完毕后,才能同别的数据类型一起被释放。
- 用方法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模数与相关函数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!