当前位置: 首页 > news >正文

【easily-openJCL】要尝试下用 显卡 做数据对称加密吗?

easily-openJCL 要尝试下用 显卡 做数据对称加密吗?

开源技术栏

本文演示了一个案例,使用显卡进行数据加密哦,加密方法是 XOR

目录

文章目录

  • easily-openJCL 要尝试下用 显卡 做数据对称加密吗?
    • 目录
    • 开始
      • 导入项目库
      • 加密操作
      • 解密操作
    • 性能如何

在这里插入图片描述

开始

导入项目库

从 1.0.3 版本之后,easily-openJCL 支持了 XOR 的加密与解密操作,我们可以直接引入此版本的依赖库文件,下面是坐标!

    <dependencies><!-- https://mvnrepository.com/artifact/io.github.BeardedManZhao/easily-openJCL --><dependency><groupId>io.github.BeardedManZhao</groupId><artifactId>easily-openJCL</artifactId><version>1.0.3</version></dependency></dependencies>

加密操作

package org.example;import io.github.BeardedManZhao.easilyJopenCL.EasilyOpenJCL;
import io.github.BeardedManZhao.easilyJopenCL.MemSpace;
import io.github.BeardedManZhao.easilyJopenCL.kernel.LengthKernelSource;
import org.jocl.Pointer;
import org.jocl.Sizeof;public class Main {public static void main(String[] args0) {// 准备一个 easilyOpenJCL 操作对象final EasilyOpenJCL easilyOpenJCL = EasilyOpenJCL.initOpenCLEnvironment(// 为对象装载两个计算组件 分别是 XOR 加密和解密使用的组件LengthKernelSource.ARRAY_ENCODE_XOR_ARRAY_CHAR2,LengthKernelSource.ARRAY_DECODE_XOR_ARRAY_CHAR2);// 准备两个 char 数组 a b 分别代表的是被加密的数据和加密使用的密钥final char[] a = "this is a data!!!".toCharArray(), b = "349567456456".toCharArray();// 准备一个数值 代表结果的长度 需要在内存空间对象中设置,用来开辟内存final long resLen = a.length;// 使用内存空间对象将 a 和 b 进行封装MemSpace memSpace = easilyOpenJCL.createMemSpace(// 两个 char 数组的指针,用来读取数据Pointer.to(a), Pointer.to(b),// 两个指针的空间 以及 结果需要的空间 还有每个元素需要的字节数a.length, b.length, resLen, Sizeof.cl_char2,// 指定当前内存空间要用来做哪个计算 这里是加密LengthKernelSource.ARRAY_ENCODE_XOR_ARRAY_CHAR2);// 调用 easilyOpenJCL 开始操作加密任务easilyOpenJCL.calculate(bf -> {for (int i = 0; i < resLen; i++) {// 在这里打印出来加密的结果 为了避免出现不可识别的字符,直接转换成数值System.out.print((int) bf.getChar(i * Sizeof.cl_char2) + " ");}}, memSpace, true);}
}

上面代码的计算结果如下所示!其中每个数值都是一个字符的 ASCII 形式

71 92 80 70 22 94 71 21 87 20 81 87 71 85 24 20 23 

解密操作

在上面我们已经对于一个字符串进行了加密操作,并将加密之后的每个字符的ASCII统计了出来,下面我们要对加密之后的 71 92 80 70 22 94 71 21 87 20 81 87 71 85 24 20 23 进行 解密操作。

package org.example;import io.github.BeardedManZhao.easilyJopenCL.EasilyOpenJCL;
import io.github.BeardedManZhao.easilyJopenCL.MemSpace;
import io.github.BeardedManZhao.easilyJopenCL.kernel.LengthKernelSource;
import org.jocl.Pointer;
import org.jocl.Sizeof;public class Main {public static void main(String[] args0) {// 准备加密之后的数据char[] chars = {71, 92, 80, 70, 22, 94, 71, 21, 87, 20, 81, 87, 71, 85, 24, 20, 23};// 准备解密的密钥 需要和加密的一致,否则解析之后就不同了char[] key = "349567456456".toCharArray();// 设置解密之后的数组长度,应该是和 chars 一致!final long l = chars.length;// 准备一个 easilyOpenJCL 操作对象final EasilyOpenJCL easilyOpenJCL = EasilyOpenJCL.initOpenCLEnvironment(// 为对象装载两个计算组件 分别是 XOR 加密和解密使用的组件LengthKernelSource.ARRAY_ENCODE_XOR_ARRAY_CHAR2,LengthKernelSource.ARRAY_DECODE_XOR_ARRAY_CHAR2);// 封装内存空间 解密时候的操作数分别是 加密之后的数据chars 以及 加密时使用的keyMemSpace memSpace = easilyOpenJCL.createMemSpace(Pointer.to(chars), Pointer.to(key),chars.length, key.length, l, Sizeof.cl_char2,LengthKernelSource.ARRAY_DECODE_XOR_ARRAY_CHAR2);// 直接开始解密操作easilyOpenJCL.calculate(byteBuffer -> {for (int i = 0; i < l; i++) {System.out.print(byteBuffer.getChar(i * Sizeof.cl_char2));}}, memSpace, true);}
}

在下面就是计算结果,可以看到它成功的将数据还原了出来!

this is a data!!!

性能如何

使用 GPU 进行加密操作,相较于CPU,速度会快许多,下面是我们的一个基准测试代码,以及测试结果,其将非常庞大的字符数组进行了加密和解密操作!

CPUGPU
i7-12700RX550

有趣的是,GPU远远落后于CPU工艺的情况下,CPU的计算速度比 GPU 的慢

在这里插入图片描述


http://www.mrgr.cn/news/75199.html

相关文章:

  • P8692 [蓝桥杯 2019 国 C] 数正方形:结论,组合数学
  • 数据结构及算法--排序篇
  • 【设计模式】代理模式
  • Qt文件目录操作
  • 基于yolov8、yolov5的行人检测识别系统(含UI界面、训练好的模型、Python代码、数据集)
  • 二叉树路径相关算法题|带权路径长度WPL|最长路径长度|直径长度|到叶节点路径|深度|到某节点的路径非递归(C)
  • Netty之EventLoop自定义任务
  • 自动驾驶系列—从数据采集到存储:解密自动驾驶传感器数据采集盒子的关键技术
  • Ubuntu 的 ROS 操作系统 turtlebot3 导航仿真
  • 输出1~100内的所有偶数C++
  • SpringSecurity入门
  • ubuntu连接orangepi-zero-2w桌面的几种方法
  • 深入浅出C#编程语言
  • 速盾:高防 CDN 的缓存机制是什么?
  • 优选算法 - 3 ( 位运算 模拟 分治 11000 字详解 )
  • docker .vhdx文件压缩
  • LeetCode297.二叉树的序列化和反序列化
  • 搜维尔科技:SenseGlove触觉反馈手套开箱+场景测试
  • IDL脚手架遇到的cwgo问题
  • 黑马智数Day8
  • 机器学习 ---模型评估、选择与验证(1)
  • cache中命中率和平均访问时间
  • RK3568平台开发系列讲解(platform虚拟总线驱动篇)platform总线模型
  • Shell脚本的使用
  • CPLD架构
  • KPaaS洞察|统一管理模式下跨系统用户权限修改流程详解