OpenSSL密码库算法笔记——第0.2.3章 逻辑判断和逻辑移位

本文详细介绍了大整数运算中的逻辑判断与移位操作,包括比较大小、判断奇偶、判断是否为零、左移与右移等功能函数的使用方法与应用场景。

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

首先介绍几个简单的大整数逻辑判断函数——比较两个大整数的大小,判断大整数是否为奇数,判断大整数是否为零,判断大数的某一位是否为0或者1。

        最简单最常用的大整数比较函数为:

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

int BN_cmp(const BIGNUM *a, const BIGNUM *b)

功能:    比较两个大整数大小

输入:    a,b

输出:    -

返回:    1【a大】或者0【相等】或者-1【b大】

出处:    bn_lib.c

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

上面介绍的大整数比较是要考虑符号的,如果不考虑符号的话,即只比较两个大整数的绝对值大小,就需要用到下面这个函数:

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

int BN_ucmp(const BIGNUM *a, const BIGNUM *b)

功能:    比较两个大整数绝对值的大小

输入:    a,b

输出:    -

返回:    正数【a大】或者0【相等】或者 负数【b大】

出处:    bn_lib.c

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

        如果要判断一个大整数是否为零,需要用到:

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

#define BN_is_zero(BIGNUM *a)

功能:    判断大整数是否为零

输入:    a

输出:    -

返回:    0 【a≠0】或者 1【a=0】

出处:    bn.h

备注:    宏定义。#define BN_is_zero(a)  ((a)→top = = 0)

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

如果要判断一个大整数是否为奇数,需要用到:

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

#define BN_is_odd(BIGNUM *a)       

功能:    判断大整数是否为奇数

输入:    a

输出:    -

返回:    1【奇数】或者 0【偶数】

出处:    bn.h

备注:    宏定义。#define BN_is_odd(a) (((a)->top > 0) && ((a)->d[0] & 1))

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

关于大数的逻辑判断就暂时介绍以上这些,下面看看大整数的逻辑移位——向左移位和向右移位。

大整数左移函数如下:

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

int BN_lshift(BIGNUM *r, const BIGNUM *a, int n)

功能:    大整数左移

输入:    a,n【左移比特数】

输出:    r ← a<<n

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

出处:    bn_shift.c

备注:    程序内会做必要的扩展,以保证高位信息不丢失。

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

        左移过程中可能会涉及到的大整数的扩展——如果大整数的长度不够的话就进行扩展以保证能容纳下扩展后的大整数。关于扩展请参见§0.2.5bn_wexpandbn_expand

        特殊地,当左移比特数n1时,上述函数变成:

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

int BN_lshift1(BIGNUM *r, const BIGNUM *a)

功能:    将大数左移1

输入:    a

输出:    r a << 1

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

出处:    bn_mod.c

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

大整数右移就不会涉及扩展。

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

int BN_rshift(BIGNUM *r, const BIGNUM *a, int n)

功能:    大整数右移

输入:    a,n【右移位数】

输出:    r ← a>>n

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

出处:    bn_shift.c

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

特殊地,当右移比特数n1时,上述函数变成:

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

int BN_rshift1(BIGNUM *r, const BIGNUM *a)

功能:    将大数右移1

输入:    a

输出:    r a >>1

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

出处:    bn_shift.c

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

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值