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

2023-10-28 18:38

本文主要是介绍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,则rilen×32
  • RR                  R2 mod N,在将大整数转化到Montgomery整数时用。R2riBlen
  • 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模数与相关函数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/295162

相关文章

使用雪花算法产生id导致前端精度缺失问题解决方案

《使用雪花算法产生id导致前端精度缺失问题解决方案》雪花算法由Twitter提出,设计目的是生成唯一的、递增的ID,下面:本文主要介绍使用雪花算法产生id导致前端精度缺失问题的解决方案,文中通过代... 目录一、问题根源二、解决方案1. 全局配置Jackson序列化规则2. 实体类必须使用Long封装类3.

Springboot实现推荐系统的协同过滤算法

《Springboot实现推荐系统的协同过滤算法》协同过滤算法是一种在推荐系统中广泛使用的算法,用于预测用户对物品(如商品、电影、音乐等)的偏好,从而实现个性化推荐,下面给大家介绍Springboot... 目录前言基本原理 算法分类 计算方法应用场景 代码实现 前言协同过滤算法(Collaborativ

Kotlin运算符重载函数及作用场景

《Kotlin运算符重载函数及作用场景》在Kotlin里,运算符重载函数允许为自定义类型重新定义现有的运算符(如+-…)行为,从而让自定义类型能像内置类型那样使用运算符,本文给大家介绍Kotlin运算... 目录基本语法作用场景类对象数据类型接口注意事项在 Kotlin 里,运算符重载函数允许为自定义类型重

解决tomcat启动时报Junit相关错误java.lang.ClassNotFoundException: org.junit.Test问题

《解决tomcat启动时报Junit相关错误java.lang.ClassNotFoundException:org.junit.Test问题》:本文主要介绍解决tomcat启动时报Junit相... 目录tomcat启动时报Junit相关错误Java.lang.ClassNotFoundException

CentOS和Ubuntu系统使用shell脚本创建用户和设置密码

《CentOS和Ubuntu系统使用shell脚本创建用户和设置密码》在Linux系统中,你可以使用useradd命令来创建新用户,使用echo和chpasswd命令来设置密码,本文写了一个shell... 在linux系统中,你可以使用useradd命令来创建新用户,使用echo和chpasswd命令来设

Pandas中统计汇总可视化函数plot()的使用

《Pandas中统计汇总可视化函数plot()的使用》Pandas提供了许多强大的数据处理和分析功能,其中plot()函数就是其可视化功能的一个重要组成部分,本文主要介绍了Pandas中统计汇总可视化... 目录一、plot()函数简介二、plot()函数的基本用法三、plot()函数的参数详解四、使用pl

Maven中引入 springboot 相关依赖的方式(最新推荐)

《Maven中引入springboot相关依赖的方式(最新推荐)》:本文主要介绍Maven中引入springboot相关依赖的方式(最新推荐),本文给大家介绍的非常详细,对大家的学习或工作具有... 目录Maven中引入 springboot 相关依赖的方式1. 不使用版本管理(不推荐)2、使用版本管理(推

Python的time模块一些常用功能(各种与时间相关的函数)

《Python的time模块一些常用功能(各种与时间相关的函数)》Python的time模块提供了各种与时间相关的函数,包括获取当前时间、处理时间间隔、执行时间测量等,:本文主要介绍Python的... 目录1. 获取当前时间2. 时间格式化3. 延时执行4. 时间戳运算5. 计算代码执行时间6. 转换为指

Windows 上如果忘记了 MySQL 密码 重置密码的两种方法

《Windows上如果忘记了MySQL密码重置密码的两种方法》:本文主要介绍Windows上如果忘记了MySQL密码重置密码的两种方法,本文通过两种方法结合实例代码给大家介绍的非常详细,感... 目录方法 1:以跳过权限验证模式启动 mysql 并重置密码方法 2:使用 my.ini 文件的临时配置在 Wi

Python正则表达式语法及re模块中的常用函数详解

《Python正则表达式语法及re模块中的常用函数详解》这篇文章主要给大家介绍了关于Python正则表达式语法及re模块中常用函数的相关资料,正则表达式是一种强大的字符串处理工具,可以用于匹配、切分、... 目录概念、作用和步骤语法re模块中的常用函数总结 概念、作用和步骤概念: 本身也是一个字符串,其中