OpenSSL密码库算法笔记——第1.1.1章 绝对值加减法

粗略的说,两个大整数a、b做绝对值加法r=|a|+|b|就是从低字到高字分别做带进位的加法。具体说来就是:

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

算法:    绝对值加法

step 1.     做低n个字的齐字加法,其中n=min(a的字长,b的字长),最终进位记为carry。

step 2.     将余下的高位字复制到r的相应字。

step 3.     如果carry不为零,则对应的字加上这个进位。

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

step1中低n个字的齐字加法即:

BN_ULONG bn_add_words(BN_ULONG *r, const BN_ULONG *a, const BN_ULONG *b, int n)函数实现,其中的n控制a、b的字长,它必须小于等于a、b的实际长度。

绝对值加法的函数为:

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

int BN_uadd(BIGNUM *r, const BIGNUM *a, const BIGNUM *b)

功能:    绝对值加法

输入:    a,b

输出:    r=|a|+|b|

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

出处:    bn_add.c

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

两个大整数a、b做绝对值减法r=|a|-|b|就是从低字到高字分别做带借位的减法。为了保证正确性,要求|a| > |b|。

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

算法:    绝对值减法

step 1.     做低n个字的齐字减法,其中n为b的字长,最终借位记为borrow。

step 2.     将a余下的高位字复制到r的相应字。

step 3.     如果borrow不为零,则对应的字减去这个进位。

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

step1中低n个字的齐字减法即:

BN_ULONG bn_sub_words(BN_ULONG *r, const BN_ULONG *a, const BN_ULONG *b, int n)函数实现,其中的n控制a、b的字长,它必须小于等于a、b的实际字长。

绝对值加法的函数为:

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

int BN_usub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b)

功能:    绝对值减法

输入:    a,b

输出:    r=|a|-|b|

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

出处:    bn_add.c

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

你可能感兴趣的:(openssl,密码,密码技术与应用)