OpenSSL密码库算法笔记——第2.1章 经典模运算

本文深入解析了经典模运算的原理及应用,对比了BN_mod与BN_nnmod两个关键函数的区别,前者计算最小可负剩余,后者计算非负最小剩余。文章详细介绍了这两个函数的输入输出、返回值及实现方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

经典模运算是用除法(见§1.3)计算出商和余数,其中的余数即为所求。该方法对被模数x不加任何限制(Barrett约化和Montgomery约化对被模数x是有限制的)。

由§1.3给出的除法算法知,除法运算需要做预运算(将被除数标准化)和事后运算(将余数去标准化)。不过这个标准化和去标准化的过程比较简单——通常标准化就是将被除数左移某个比特,而去标准化就是将余数右移相同的比特。

有关经典模运算的思想请参见§1.3,这里就不多做介绍了。下面介绍一下经典模运算所涉及的相关函数。

先来看两个容易混淆的函数(宏定义)BN_mod和 BN_nnmod。

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

#define BN_mod(BIGNUM * rem, BIGNUM * m, BIGNUM * d)

功能:    模运算【计算最小可负剩余】

输入:    m【被模数】,d【模数】

输出:    rem = m mod d

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

出处:    bn.h

备注:    宏定义。#define BN_mod(rem,m,d) BN_div(NULL,(rem),(m),(d))

               用除法来完成模运算,所以 且rem的符号=m的符号。

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

只有这个模运算的结果可能为负数,别的模运算或者是与模相关的运算都是计算最小非负剩余,结果都为零或者正数。

结果可正可负,用起来不太顺手,所以有了另外一个使用方便的函数BN_nnmod——计算非负最小剩余。

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

int BN_nnmod(BIGNUM *r, const BIGNUM *m, const BIGNUM *d)

功能:    模运算【计算非负最小剩余】

输入:    m【被模数】,d【模数】

输出:    r = m mod d

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

出处:    bn_mod.c

备注:    用除法来完成模运算。。

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

请大家注意区分宏定义BN_mod和函数BN_nnmod。两者的思想相差不多,都是用除法来完成经典模运算;但是输出结果的范围不同,BN_mod得到的结果是,而BN_nnmod的结果为。另外,后面的函数几乎都是调用BN_nnmod,而不是BN_mod。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值