openssl-aes-ctr使用openmp加速
openssl-aes-ctr使用openmp加速
- openssl-aes-ctr
- openmp omp for
openssl-aes-ctr
本文采用openssl-1.1.1w进行开发验证开发;因为aes-ctr加解密模式中,不依赖与上一个模块的加/解密的内容,所以对于aes-ctr加解密模式是比较适合进行并行加速的算法。
其代码如下
void CRYPTO_ctr128_encrypt(const unsigned char *in, unsigned char *out,size_t len, const void *key,unsigned char ivec[16],unsigned char ecount_buf[16], unsigned int *num,block128_f block) {...while (len >= 16) {(*block) (ivec, ecount_buf, key); // encryptctr128_inc_aligned(ivec); // ivec = ivec + 1for (n = 0; n < 16; n += sizeof(size_t)) // out = in ^ ecount_buf*(size_t_aX *)(out + n) =*(size_t_aX *)(in + n)^ *(size_t_aX *)(ecount_buf + n);len -= 16;out += 16;in += 16;n = 0;}...}
从代码不难看出,每层循环,以16字节为一组进行加密;组与组之间不存在关联,下一组变更的只有ivec,所以对其进行加速处理,可以考虑并行处理的方式进行并行处理。
可以提前计算好ivec,ivec+1,ivec+2,…,ivec+255;此处因为单次加解密的长度是4096,所以函数内最长为256组会在一次函数调用中进行加解密。
openmp omp for
参考OpenMP并行编程
使用#pragma omp parallel for 对加密过程进行并行加速处理,处理过程中,在进入for循环前,首先将ivec的值都计算好
int loop = len / 16;
unsigned char * new_ivec[4096]; // 此处有待优化,实际调用长度可能会超过4096
memcpy(new_ivec, ivec, 16);
for (int i = 1; i < loop; i++) {memcpy(new_ivec + 16*i, new_ivec + 16*i - 16, 16);ctr128_inc_aligned(new_ivec + 16*i);
}
然后就是对分组进行并行加密处理
#pragma omp parallel for num_threads (16) private(n)
for (int i = 0; i < loop; i++) {unsigned char current_ecount_buf[16] = {0};(*block) (new_ivec + 16*i, current_ecount_buf, key);unsigned char * current_in = in + 16*i;unsigned char * current_out = out + 16*i;for (n = 0; n < 16; n += sizeof(size_t))*(size_t_aX *)(current_out + n) =*(size_t_aX *)(current_in + n)^ *(size_t_aX *)(current_ecount_buf + n);}
修改过后的函数如下:
void CRYPTO_ctr128m_encrypt(const unsigned char *in, unsigned char *out,size_t len, const void *key,unsigned char ivec[16],unsigned char ecount_buf[16], unsigned int *num,block128_f block)
{unsigned int n;size_t l = 0;n = *num;#if !defined(OPENSSL_SMALL_FOOTPRINT)if (16 % sizeof(size_t) == 0) { /* always true actually */do {while (n && len) {*(out++) = *(in++) ^ ecount_buf[n];--len;n = (n + 1) % 16;}# if defined(STRICT_ALIGNMENT)if (((size_t)in | (size_t)out | (size_t)ecount_buf)% sizeof(size_t) != 0)break;
# endifint loop = len / 16;unsigned char * new_ivec[4096];memcpy(new_ivec, ivec, 16);for (int i = 1; i < loop; i++) {memcpy(new_ivec + 16*i, new_ivec + 16*i - 16, 16);ctr128_inc_aligned(new_ivec + 16*i);}#pragma omp parallel for num_threads (16) private(n)for (int i = 0; i < loop; i++) {unsigned char current_ecount_buf[16] = {0};(*block) (new_ivec + 16*i, current_ecount_buf, key);unsigned char * current_in = in + 16*i;unsigned char * current_out = out + 16*i;for (n = 0; n < 16; n += sizeof(size_t))*(size_t_aX *)(current_out + n) =*(size_t_aX *)(current_in + n)^ *(size_t_aX *)(current_ecount_buf + n);}len -= loop * 16;out += loop * 16;in += loop * 16;n = 0;if (len) {(*block) (ivec, ecount_buf, key);ctr128_inc_aligned(ivec);while (len--) {out[n] = in[n] ^ ecount_buf[n];++n;}}*num = n;return;} while (0);}/* the rest would be commonly eliminated by x86* compiler */
#endifwhile (l < len) {if (n == 0) {(*block) (ivec, ecount_buf, key);ctr128_inc(ivec);}out[l] = in[l] ^ ecount_buf[n];++l;n = (n + 1) % 16;}*num = n;
}
经过以上处理后,需要进行测试,本文采用给openssl,增加enc子命令的方式进行处理,通过增加aria-128-ctrm的方式,而后进行测试验证。
从测试结果看,确实能提高一定的性能,但效果不是很显著,大概可能和加解密时长,占openssl enc整个命令调用时长的占比不是很高,所以没有显著的性能提升。
尽管效果不是很明显,也算是针对openmp和openssl-aes-ctr的一次结合应用。
相关文章:

openssl-aes-ctr使用openmp加速
openssl-aes-ctr使用openmp加速 openssl-aes-ctropenmp omp for openssl-aes-ctr 本文采用openssl-1.1.1w进行开发验证开发;因为aes-ctr加解密模式中,不依赖与上一个模块的加/解密的内容,所以对于aes-ctr加解密模式是比较适合进行并行加速的…...

PHP+MySQL开发语言 在线下单订水送水小程序源码及搭建指南
随着互联网技术的不断发展,在线下单订水送水服务为人们所需要。分享一款 PHP 和 MySQL 搭建一个功能完善的在线订水送水小程序源码及搭建教程。这个系统将包含用户端和管理端两部分,用户可以在线下单、查询订单状态,管理员可以处理订单、管理…...

计算机网络第1章(上):网络组成与三种交换方式全解析
目录 一、计算机网络的概念二、计算机网络的组成和功能2.1 计算机网络的组成2.2 计算机网络的功能 三、电路交换、报文交换、分组交换3.1 电路交换(Circuit Switching)3.2 报文交换(Message Switching)3.3 分组交换(Pa…...

Android studio进阶开发(七)---做一个完整的登录系统(前后端连接)
我们已经讲过了okhttp和登录系统的使用,我们今天做一个完整的登录系统,后端用springmybatis去做 数据库内容 -- 创建学生信息表 CREATE TABLE student_info (id SERIAL PRIMARY KEY, -- 添加自增主键name VARCHAR(255) NOT NULL,number INT NOT NULL,…...

计算机网络第1章(下):网络性能指标与分层模型全面解析
目录 一、计算机网络的性能指标1.1 性能指标1:速率1.2 性能指标2:带宽1.3 性能指标3:吞吐量1.4 性能指标4:时延1.5 性能指标5:时延带宽积1.6 性能指标6:往返时延1.7 性能指标7:信道利用率 二、计…...

恶意软件清理工具,让Mac电脑安全更简单
你的Mac最近是不是开始表演"电子迷惑行为"?浏览器主页突然变成澳门赌场,风扇转得比直升机螺旋桨还猛......恭喜你!可能中奖获得"恶意软件大礼包"!别慌,今天就教你用恶意软件清理工具化身数字特工…...

HackMyVM-Jabita
信息搜集 主机发现 ┌──(kali㉿kali)-[~] └─$ nmap -sn 192.168.43.0/24 Starting Nmap 7.95 ( https://nmap.org ) at 2025-06-01 05:20 EDT Nmap scan report for 192.168.43.1 Host is up (0.020s latency). MAC Address: C6:45:66:05:91:88 (Unknown) Nmap scan repo…...

112 Gbps 及以上串行链路的有效链路均衡
通道均衡已成为当今高速串行链路的关键机制。目前有许多均衡方案,例如发射机加重均衡、接收机CTLE(连续时间线性均衡器)、FFE(前馈均衡器)、DFE(判决反馈均衡器)和FEC(前向纠错&…...
Mac 版不能连接华为 GaussDB 吗?我看 Windows 版可以连接?
🧑💻 GaussDB 用户 Mac 版不能连接华为 GaussDB 吗?我看Windows 版可以连接。 🧑🔧 官方技术中心 由于 GaussDB 数据库本身未支持 macOS 系统,所以在 macOS 上的 Navicat 中也未支持该数据库。 &…...

Python-13(永久存储)
创建并打开文件 open(file,mode)函数 该函数用于打开一个文件并返回对应的文件对象。 file参数指定的是文件路径和文件名,如果没有添加路径,那么默认将文件创建在python的主文件夹里面。mode参数指定的是打开的模式,r表示读取(…...
《关于有序推动绿电直连发展有关事项的通知》核心内容
《关于有序推动绿电直连发展有关事项的通知》(发改能源〔2025〕650 号)由国家发展改革委和国家能源局于 2025 年 5 月 21 日联合印发,旨在明确绿电直连项目的适用范围、规划引导、运行管理、交易与价格机制以及组织保障等内容。 适用范围与原…...
数据结构-排序(1)
一,排序的基本概念 1.排序的定义 核心概念: 给定一个包含 n 个元素的序列 (R1, R2, ..., Rn) 和一个关键码 Ki(通常是记录 Ri 的一个属性),排序的目标是找到一个排列 (p1, p2, ..., pn),使得关键码序列 (K…...

记录一次session安装应用recyclerview更新数据的bug
首先抛出异常日志,在 先说结论:因为session安装监听是在点击事件里面,所以会保留旧的对象数据 直接上代码,原有的逻辑是点击时执行session安装,并注册监听回调 private fun installApk(position: Int) {val packageIns…...

大数据-274 Spark MLib - 基础介绍 机器学习算法 剪枝 后剪枝 ID3 C4.5 CART
点一下关注吧!!!非常感谢!!持续更新!!! 大模型篇章已经开始! 目前已经更新到了第 22 篇:大语言模型 22 - MCP 自动操作 FigmaCursor 自动设计原型 Java篇开…...

力扣面试150题--二叉树的锯齿形层序遍历
Day 56 题目描述 思路 锯齿形就是一层是从左向右,一层是从右向左,那么我们可以分析样例,对于第奇数层是从左向右,第偶数层是从右向左,于是可以采取一个计数器,采取链表方式,从左向右就是正常插…...

如何在 CentOS / RHEL 上修改 MySQL 默认数据目录 ?
MySQL 是一个广泛使用的开源关系数据库管理系统(RDBMS),为无数的 web 应用程序和服务提供支持。默认情况下,MySQL 将其数据存储在预定义的目录中,这可能并不总是适合您的需求。您可能希望将数据目录移动到另一个位置以获得更好的性能和安全性…...
网页前端开发(基础进阶2)
前面学习了html与css,接下来学习JS(JavaScript与Java无关)。 web标准(网页标准)分为3个部分: 1.html主要负责网页的结构(页面的元素和内容) 2.css主要负责网页的表现(…...

简历制作要精而不简
不得不说,不管是春招,还是秋招,我们在求职时,第一步便是制作一份简历。不得不承认,好的简历,就像一块敲门砖,能让面试官眼前一亮,让应聘成功的概率增添一分。 对于一个初次求职者来…...

SPA-RL:通过Stepwise Progress Attribution训练LLM智能体
SPA-RL:通过Stepwise Progress Attribution训练LLM智能体 在大语言模型(LLM)驱动智能体发展的浪潮中,强化学习(RL)面临着延迟奖励这一关键挑战。本文提出的SPA-RL框架,通过创新的分步进度归因机…...

【深度学习】9. CNN性能提升-轻量化模型专辑:SqueezeNet / MobileNet / ShuffleNet / EfficientNet
SqueezeNet / MobileNet / ShuffleNet / EfficientNet 一、背景与动机 随着深度神经网络在图像识别任务上取得巨大成功,它们的结构越来越深、参数越来越多。然而在移动端或嵌入式设备中: 存储资源有限推理计算能力弱能耗受限 因此,研究者…...

Relational Algebra(数据库关系代数)
目录 What is an “Algebra” What is Relational Algebra? Core Relational Algebra Selection Projection Extended Projection Product(笛卡尔积) Theta-Join Natural Join Renaming Building Complex Expressions Sequences of Assignm…...
【C/C++】面试常考题目
面试中最常考的数据结构与算法题,适合作为刷题的第一阶段重点。 ✅ 分类 & 推荐题目列表(精选 70 道核心题) 一、数组 & 字符串(共 15 题) 题目类型LeetCode编号两数之和哈希表#1盛最多水的容器双指针#11三数…...

Chorme如何对于youtube视频进行画中画背景播放?
画中画可以让你小窗播放,然后浏览器放后台还可以做点别的事情。 B站直接可以选择小窗播放,游览器最小化就可以,但是youtube的小窗播放游览器一切换就不显示了。 其实是因为youtube的小窗播放不是真的小窗播放。要想真的实现需要在youtube视…...

017搜索之深度优先搜索——算法备赛
深度优先搜索 如果说广度优先搜索是逐层扩散,那深度优先搜索就是一条道走到黑。 深度优先遍历是用递归实现的,预定一条顺序规则(如上下左右顺序) ,一直往第一个方向搜索直到走到尽头或不满足要求后返回上一个叉路口按…...
从单机到集群,再到分布式,再到微服务
我会尽量详细讲解,从单机到集群,再到分布式和微服务每个层次的概念、特点和应用场景。同时也会探讨C是否适合做微服务项目。 一、从单机到集群,再到分布式,再到微服务——详细解析 1. 单机(Single Machine)…...
关于ios点击分享自动复制到粘贴板的问题
前言 Android 系统没有什么特别的要求,实现这个也比较容易。但ios在某些情况下就会出现问题。 如果ios是点击之后,请求接口,再把接口的内容赋值给粘贴板肯定行不通,会被ios系统拦截,导致赋值失败或者赋值为空。建议使…...
Hive的JOIN操作如何优化?
Hive的JOIN操作优化是提升查询性能的关键,尤其是在处理大数据量时。以下是详细的JOIN优化策略和实现方法: 一、MapJoin(小表广播优化) 核心原理 将小表全量加载到每个MapTask的内存中,避免Shuffle,直接在…...
React Native 实现抖音式图片滑动切换浏览组件-媲美抖音体验的滑动式流畅预览组件
写在前面 “如何让用户像刷抖音一样浏览我们的图片列表?” —— 这个需求背后隐藏着性能、体验和交互设计的多重挑战。本文将带你从零实现一个高性能的React Native图片浏览器,支持分页预加载、横向滑动预览、文字展示和缓存优化,打造媲美原…...

睿抗机器人开发者大赛CAIP-编程技能赛-历年真题 解题报告汇总 | 珂学家
前言 汇总 睿抗机器人开发者大赛CAIP-编程技能赛-历年真题 解题报告汇总 2024年 2024 睿抗机器人开发者大赛CAIP-编程技能赛-本科组 (国赛) 解题报告 2024 睿抗机器人开发者大赛CAIP-编程技能赛-本科组(省赛)解题报告 2024 睿抗机器人开发者大赛CAI…...

【c++】【数据结构】AVL树
目录 AVL树的定义AVL树的部分模拟实现平衡因子的引入平衡因子的向上调整旋转算法单旋算法右单旋左单旋 双旋算法左右双旋右左双旋 AVL树的定义 AVL树本质是一种搜索二叉树,传统的二叉搜索树我们都有所了解,其在理想情况下也就是接近满二叉树时拥有极高的…...