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

相关文章

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法

MySQL8 密码强度评估与配置详解

《MySQL8密码强度评估与配置详解》MySQL8默认启用密码强度插件,实施MEDIUM策略(长度8、含数字/字母/特殊字符),支持动态调整与配置文件设置,推荐使用STRONG策略并定期更新密码以提... 目录一、mysql 8 密码强度评估机制1.核心插件:validate_password2.密码策略级

GO语言中函数命名返回值的使用

《GO语言中函数命名返回值的使用》在Go语言中,函数可以为其返回值指定名称,这被称为命名返回值或命名返回参数,这种特性可以使代码更清晰,特别是在返回多个值时,感兴趣的可以了解一下... 目录基本语法函数命名返回特点代码示例命名特点基本语法func functionName(parameters) (nam

Python Counter 函数使用案例

《PythonCounter函数使用案例》Counter是collections模块中的一个类,专门用于对可迭代对象中的元素进行计数,接下来通过本文给大家介绍PythonCounter函数使用案例... 目录一、Counter函数概述二、基本使用案例(一)列表元素计数(二)字符串字符计数(三)元组计数三、C

Python中的filter() 函数的工作原理及应用技巧

《Python中的filter()函数的工作原理及应用技巧》Python的filter()函数用于筛选序列元素,返回迭代器,适合函数式编程,相比列表推导式,内存更优,尤其适用于大数据集,结合lamb... 目录前言一、基本概念基本语法二、使用方式1. 使用 lambda 函数2. 使用普通函数3. 使用 N

MySQL中REPLACE函数与语句举例详解

《MySQL中REPLACE函数与语句举例详解》在MySQL中REPLACE函数是一个用于处理字符串的强大工具,它的主要功能是替换字符串中的某些子字符串,:本文主要介绍MySQL中REPLACE函... 目录一、REPLACE()函数语法:参数说明:功能说明:示例:二、REPLACE INTO语句语法:参数

MySQL设置密码复杂度策略的完整步骤(附代码示例)

《MySQL设置密码复杂度策略的完整步骤(附代码示例)》MySQL密码策略还可能包括密码复杂度的检查,如是否要求密码包含大写字母、小写字母、数字和特殊字符等,:本文主要介绍MySQL设置密码复杂度... 目录前言1. 使用 validate_password 插件1.1 启用 validate_passwo

python中update()函数的用法和一些例子

《python中update()函数的用法和一些例子》update()方法是字典对象的方法,用于将一个字典中的键值对更新到另一个字典中,:本文主要介绍python中update()函数的用法和一些... 目录前言用法注意事项示例示例 1: 使用另一个字典来更新示例 2: 使用可迭代对象来更新示例 3: 使用

Python学习笔记之getattr和hasattr用法示例详解

《Python学习笔记之getattr和hasattr用法示例详解》在Python中,hasattr()、getattr()和setattr()是一组内置函数,用于对对象的属性进行操作和查询,这篇文章... 目录1.getattr用法详解1.1 基本作用1.2 示例1.3 原理2.hasattr用法详解2.

Python lambda函数(匿名函数)、参数类型与递归全解析

《Pythonlambda函数(匿名函数)、参数类型与递归全解析》本文详解Python中lambda匿名函数、灵活参数类型和递归函数三大进阶特性,分别介绍其定义、应用场景及注意事项,助力编写简洁高效... 目录一、lambda 匿名函数:简洁的单行函数1. lambda 的定义与基本用法2. lambda