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

2023-10-28 18:38

本文主要是介绍OpenSSL密码库算法笔记——第 2.2.4章 Barrett模数与相关函数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

为了便于使用Barrett约化,专门定义了一个结构体,我们将它称作Barrett模数。结构体的定义如下:

struct bn_recp_ctx_st

        {

        BIGNUM N; 

        BIGNUM Nr;

        int num_bits;

        int shift;

        int flags;

        };

typedef struct bn_recp_ctx_st BN_RECP_CTX;

其中:

  • N                    模数;
  • Nr                   模数的“逆”,即B2k/N;
  • num_bits        模数的二进制长度;
  • shift                移位数,正常情况下等于num_bits【?????】;
  • flags                       Barrett模数的属性,和大整数的属性类似。

为了方便对这种新的结构体进行操作与管理,定义了许多相关的基本函数来做实现一些基本的功能——初始化、新建、释放、设置模数、设置倒数。

首先看看怎样新建和释放一个Barrett模数。这一点与大整数的新建和释放(见§0.2.1)是非常相似的。同样是两种方法都可以新建一个Barrett模数。

  1. 方法1:先定义再初始化:

BN_RECP_CTX recp;

BN_RECP_CTX_init(&recp);

  1. 方法2:新建一个指向Barrett模数的指针,再调用新建函数。

BIGNUM * recp;

recp = BN_RECP_CTX_new();

Barrett模数的释放也和大整数相同。

  1. 用方法1——BN_RECP_CTX_init新建的Barrett数,无法人为地释放。只有当该大整数所在的函数执行完毕后,才能同别的数据类型一起被释放。
  2. 用方法2——BN_RECP_CTX_new新建的Barrett数,可以人为地释放。调用专门的释放函数BN_RECP_CTX_free即可:

BN_RECP_CTX_free(recp);

下面简要介绍下上面涉及到的三个函数。方法1用到的初始化函数:

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

void BN_RECP_CTX_init(BN_RECP_CTX *recp)

功能:    初始化Barrett模数

输入:    recp【Barrett模数】

输出:    -

返回:    -

出处:    bn_recp.c

备注:    让recp信息全部置零

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

方法2用到的新建函数:

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

BN_RECP_CTX *BN_RECP_CTX_new(void)

功能:    新建一个Barrett模数

输入:    -

输出:    -

返回:    Barrett模数的地址

出处:    bn_recp.c

备注:    新建Barrett模数的内部信息全部为零。

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

释放Barrett模数用到的函数:

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

void BN_RECP_CTX_free(BN_RECP_CTX *recp)

功能:    释放Barrett模数

输入:    recp

输出:    -

返回:    -

出处:    bn_recp.c

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

设置Barrett模数。设置Barrett模数又分成设置结构体中的模数N和设置结构体中的逆Nr。设置模数N的函数如下。

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

int BN_RECP_CTX_set(BN_RECP_CTX *recp, const BIGNUM *d)

功能:    利用给定大数设置Barrett模数

输入:    d【大数】

输出:    recp【Barrett模数】

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

出处:    bn_recp.c

备注:    设置Barrett模数的相关信息:

               recp->N←d,recp->Nr←0,recp->num_bits←d的二进制长度,recp->shift←0;

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

这个函数只设置模数N和模数的长度num_bits。模数的逆Nr留给BN_reciprocal去设置。所谓模数的逆就是计算Barrett约化算法中提到的。

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

int BN_reciprocal(BIGNUM *r, const BIGNUM *m, int len)

功能:    计算模数的逆

输入:    len【分子的指数】,m【模数】

输出:    r【模数的倒数】

返回:    len【正常】or -1【出错】

出处:    bn_recp.c

备注:    ,即Barrett约化中的。用除法实现该函数。

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

注意:程序中所用的B=2,这和Barrett的思想有一点出入。但是这并不影响大局,其产生的影响仅仅是可能使得减法的次数增加而已。

这篇关于OpenSSL密码库算法笔记——第 2.2.4章 Barrett模数与相关函数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

hdu1171(母函数或多重背包)

题意:把物品分成两份,使得价值最接近 可以用背包,或者是母函数来解,母函数(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v) 其中指数为价值,每一项的数目为(该物品数+1)个 代码如下: #include<iostream>#include<algorithm>

sqlite3 相关知识

WAL 模式 VS 回滚模式 特性WAL 模式回滚模式(Rollback Journal)定义使用写前日志来记录变更。使用回滚日志来记录事务的所有修改。特点更高的并发性和性能;支持多读者和单写者。支持安全的事务回滚,但并发性较低。性能写入性能更好,尤其是读多写少的场景。写操作会造成较大的性能开销,尤其是在事务开始时。写入流程数据首先写入 WAL 文件,然后才从 WAL 刷新到主数据库。数据在开始

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

poj 3974 and hdu 3068 最长回文串的O(n)解法(Manacher算法)

求一段字符串中的最长回文串。 因为数据量比较大,用原来的O(n^2)会爆。 小白上的O(n^2)解法代码:TLE啦~ #include<stdio.h>#include<string.h>const int Maxn = 1000000;char s[Maxn];int main(){char e[] = {"END"};while(scanf("%s", s) != EO

【测试】输入正确用户名和密码,点击登录没有响应的可能性原因

目录 一、前端问题 1. 界面交互问题 2. 输入数据校验问题 二、网络问题 1. 网络连接中断 2. 代理设置问题 三、后端问题 1. 服务器故障 2. 数据库问题 3. 权限问题: 四、其他问题 1. 缓存问题 2. 第三方服务问题 3. 配置问题 一、前端问题 1. 界面交互问题 登录按钮的点击事件未正确绑定,导致点击后无法触发登录操作。 页面可能存在

秋招最新大模型算法面试,熬夜都要肝完它

💥大家在面试大模型LLM这个板块的时候,不知道面试完会不会复盘、总结,做笔记的习惯,这份大模型算法岗面试八股笔记也帮助不少人拿到过offer ✨对于面试大模型算法工程师会有一定的帮助,都附有完整答案,熬夜也要看完,祝大家一臂之力 这份《大模型算法工程师面试题》已经上传CSDN,还有完整版的大模型 AI 学习资料,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费