SC@SDUSC
1.项目描述
这是一个某公司委托的预研项目。
该公司主要产品之一是基于硬件芯片的加密卡/加密机。考虑到虽然当前政策倾向于批准基于硬件的加密设备,但是下一步可能会放开其他类型的实现形式,比如使用GPU加速运算的加密设备和服务,因此要预研使用CUDA/GPU加速的密码运算技术。
工作计划是在GMSSL(一个开源的密码算法和SSL库以支持国产密码SM系列算法为特色)中,使用GPU实现RSA、SM2等公钥算法。RSA的GPU实现可以参考libgpucrypto(一个使用CUDA的RSA开源实现项目)。具体工作需要改进libgpucrypto项目,并把改进成果应用到GMSSL中去。
本项目可以锻炼GPGPU编程能力,加深对密码原理和技术的了解,成果可以用在企业安全、云虚拟安全等环境。
GPU硬件使用NVIDIA GTX系列显卡,提供校园网上的远程访问和使用环境。
注1:如果不熟悉C而惯于使用Java,则可以把GMSSL换成OpenJDK,参考使用JCUDA(一个Java bindings for CUDA的开源实现)等实现。
注2:如果想做GPU相关,但是不想做密码技术,可以改题目内容为使用GPU的机器学习和/或大数据处理等等。可行性、具体内容另外讨论。
2.核心任务
使用cuda加速rsa或ecdsa/sm2,核心是加速计算X^Y mod Z。然后把rsa或sm2中需要计算X^Y mod Z的地方调用GPU计算。
3.核心代码
我负责分析的部分:
1、rsa,sm2,ecc算法的数学基础
2、gmssl中的rsa和sm2算法
3、libgpucrypto中的rsa算法
4、libgpucrypto中的cuda快速幂取模算法
5、ecdsa、ecc算法
本项目队友韦潇负责分析的核心代码是:
1.CUDA中SHA、AES、RSA在CPU和GPU性能对比以及线索分析
2.CUDA GPU中SM2算法设计
4.环境配置
在环境配置的过程中走了不少弯路,把这个曲折的过程分享出来
4.1需要的环境
linux上的cuda环境
4.2我的硬件环境
dell inspiron 7591
win10系统
bios版本:1.6
显卡型号:gtx1650
4.3 legecy u盘启动linux(失败)
失败原因:我的电脑不支持legecy启动
4.3.1 在vmware上安装ubuntu
新建虚拟机 选择典型(自定义应该也可以,感觉区别不大)
安装程序镜像文件
输入用户名密码
虚拟机名称和位置
分配磁盘空间
完成创建
4.3.2将ubuntu安装在
启动ubuntu虚拟机
选择中文在这里插入图片描述
选择暂时不连接wifi,也可连接wifi
选择安装第三方软件
选择其他选项
进入到下面自行分区界面后,可根据U盘大小可分出哪个是需要安装ubuntu系统的U盘,把提前分好的4个分区逐一通过减号删除,再点击删除分区后腾出的空闲重新新建,按照下表格重新新建号分区类别和格式(注意,要删除一个新建一个,逐个逐个来)
修改后的分区
安装启动引导器的设备选择需要安装系统的U盘,然后点击“现在安装”
点击“继续”
地区选择上海\台北\新加坡(东八区)
选择语言
输入用户名密码
安装完成重启选择u盘启动即可,由于我的电脑不支持这种方法所以我尝试了其他方法
4.4 ventoy实现uefi启动(失败)
ventoy官网介绍
Ventoy 简介
简单来说,Ventoy是一个制作可启动U盘的开源工具。有了Ventoy你就无需反复地格式化U盘,你只需要把 ISO/WIM/IMG/VHD(x)/EFI等类型的文件拷贝到U盘里面就可以启动了,无需其他操作。你可以一次性拷贝很多个不同类型的镜像文件,Ventoy 会在启动时显示一个菜单来供你进行选择 (参见 截图)。Ventoy 安装之后,同一个U盘可以同时支持 x86 Legacy、BIOS、IA32 UEFI、x86_64
UEFI、ARM64 UEFI 和 MIPS64EL UEFI 模式。Ventoy 支持大部分常见类型的操作系统
(Windows/WinPE/Linux/ChromeOS/Unix/VMware/Xen …) 目前已经测试了各类超过 730+
个镜像文件。 支持 网站上收录的 90%+ 的操作系统。
Ventoy 特点
100% 开源 (许可证)
使用简单 (使用说明)
快速 (拷贝文件有多快就有多快)
可以安装在 U盘/本地硬盘/SSD/NVMe/SD卡等设备上
直接从 ISO/WIM/IMG/VHD(x)/EFI 文件启动,无需解开
ISO/WIM/IMG/VHD(x)/EFI 文件在磁盘上无需连续
支持MBR和GPT分区格式
同时支持 x86 Legacy BIOS 以及 IA32/x86_64/ARM64/MIPS64 UEFI
UEFI 模式支持安全启动 (Secure Boot) 说明
支持数据持久化 说明
支持Windows系统的自动安装部署 说明
支持 RHEL7/8/CentOS7/8/SUSE/Ubuntu Server/Debian 等Linux系统的自动安装部署 说明
镜像分区支持 FAT32/exFAT/NTFS/UDF/XFS/Ext2(3)(4) 文件系统
支持超过4GB的ISO文件
保留ISO原始的启动菜单风格(Legacy & UEFI)
支持大部分常见操作系统, 已测试730+ 个ISO文件
不仅仅是启动,而是完整的安装过程
菜单可以在列表模式和目录树模式之间实时、动态切换 说明
提出 “Ventoy Compatible” 概念
支持插件扩展
Linux vDisk(vhd/vdi/raw…) 启动解决方案
支持向运行环境中插入文件
动态替换ISO文件中的原始启动配置文件
高度可定制化的主题风格和菜单
启动过程中支持U盘设置写保护
不影响U盘日常普通使用
版本升级时数据不会丢失
无需跟随操作系统升级而升级Ventoy
4.4.1安装ventoy
下载链接 /ventoy/Ventoy/releases
点击安装即可
4.4.2 linux vdisk(失败)
失败原因还没有搞清楚,具体表现为使用vhd进入ubuntu系统实际上启动的是本机的win10系统,应该是某个细节出问题了
Ventoy 使用此插件来支持在物理机上直接启动安装了 Linux系统的 vdisk 文件 (vhd/vdi/raw 等)。这种模式的优点有:
系统是在真实物理机上运行,并不是在虚拟机里运行,没有性能损失。同一个 vhd/vdi 文件既可以在 Legacy BIOS 模式下启动,也可以在 UEFI 模式下启动。Linux系统无需独占一个磁盘或者分区,相当于把一个完整的Linux系统放在一个文件里。 比如,你的主系统是 C 盘里的 Windows 系统,你可以在D盘里放一些
Deepin、UOS、Ubuntu、Arch 等系统的 VHD 文件,想启动哪个选哪个,不用了就把对应的 VHD 文件删除即可。 支持的 vdisk 格式 固定大小的 vhd (注意只能是vhd, 不支持vhdx)固定大小的 vdiRaw Disk 镜像格式 支持的 Linux 发行版 (持续更新中)
理论上,其他使用 dracut/initramfstool/mkinitcpio 作为 initramfs 构建工具的发行版也支持。只是没有实际进行测试。
使用说明 安装 Linux 系统到 vdisk创建固定大小的 vhd/vdi,注意只支持静态大小的,不支持动态扩展类型的。然后把支持的 Linux 系统安装到 vhd/vdi 中即可。
安装过程和普通安装没有任何差别,可以借助 VirtualBox 来完成(创建硬盘时可以选择 vdi或vhd)。
注意:虚拟硬盘必须是全新创建的,不要使用之前用过的。![img](https://img-/img_convert/95b39b983457841ccc30a25e8ea2d36c.png
注意,为了最终的 vhd/vdi 文件既能在 Legacy BIOS 模式下启动,也能在 UEFI 模式下启动。
安装系统时,VirtualBox 必须设置为 UEFI 模式!
安装系统时,VirtualBox 必须设置为 UEFI 模式!
安装系统时,VirtualBox 必须设置为 UEFI 模式!
!!! 注意 !!!
有一些系统安装完之后还需要再额外安装一个 grub 的包才可以,否则最终的 vhd/vdi 文件只能在 UEFI 模式下启动,无法在 Legacy BIOS 模式下启动。
对于这种,在前面表格最后的 “备注” 一栏有说明,没有特殊说明的就不需要。比如,对于 Deepin 系统,需要安装 grub-pc-bin_xxxx.deb 包。以 deepin-desktop-community-1010-amd64.iso 为例, 需要安装 grub-pc-bin_2.02.24.3-1+eagle_amd64.deb 这个包,它位于 ISO文件的 /pool/main/g/grub2/ 目录下,可以直接使用 dpkg -i 命令来安装。
另外,如果缺少这个包,在运行下面的 vtoyboot.sh 脚本时也会打印一个提示信息。当然,如果你只需要在 UEFI 模式下启动这个 vdisk 文件,不需要在 Legacy BIOS 模式下启动,那就不需要管它了。
注意,系统安装完之后不能对虚拟机创建快照,否则会导致 vdi/vhd 无法识别。
在系统下执行 vtoyboot 脚本
安装完成并启动到 Linux 系统中之后,执行 vtoyboot 脚本。这一步是为了在系统中做一些处理,以支持Ventoy启动。
vtoyboot 是配套 Ventoy 开发的一个项目,单独发布。从 /ventoy/vtoyboot/releases 下载压缩包即可。
下载到 Linux 系统中,解压,然后以root权限执行里面的脚本sudo sh vtoyboot.sh
脚本执行完之后,使用poweroff
命令关机。
注意 vtoyboot 会经常更新以支持更多的 Linux 版本以及修复 BUG,所以请使用最新版本。
拷贝到U盘,改后缀名为 .vtoy 然后用 Ventoy 启动
完成前面2步之后,就可以把 vdi/vhd 文件拷贝到 U盘中,重启电脑,然后通过Ventoy启动它了。
为了便于识别和处理,这里统一要求把文件后缀名改为 .vtoy
推荐保留原来的后缀名,同时增加一个 .vtoy 后缀。比如:CentOS7.vhd.vtoy
ubuntu20.04.vdi.vtoy
Manjaro.vhd.vtoy
关于启动后的系统升级
vDisk文件在物理机环境下启动之后,普通软件的安装、升级可以正常操作,没有限制。如果是对内核、驱动进行了升级、或者类似于通过 dnf update 命令进行了系统的大升级之后, 建议再重新执行一次 vtoyboot 脚本,防止下次重启之后vDisk文件无法启动。
使用Ventoy启动本地硬盘上的 vDisk
上面的使用说明是针对把 vdisk 文件拷贝到 Ventoy U盘中启动的场景。也可以把 vdisk 文件放在本地硬盘中,使用 Ventoy 的自定义菜单来启动它。
关于自定义启动菜单 ventoy_grub.cfg 的说明,请参考 Ventoy 自定义菜单插件
在上述 ventoy_grub.cfg 中增加如下一个菜单用于启动 vdisk 文件,只需要把my_vdisk_path
设置为实际文件的绝对路径即可(从所在分区的根目录开始)。
menuentry "Boot My Linux VHD" { set my_vdisk_path="/VhdDir/Ubuntu.vhd.vtoy"if search -n -s vdiskhd -f "$my_vdisk_path"; thenvtoyboot_common_func "($vdiskhd)$my_vdisk_path"elseecho "$my_vdisk_path not found"fi}
在这个例子中,my_vdisk_path 被设置为/VhdDir/Ubuntu.vhd.vtoy
你可以按照你实际的路径修改,(比如set my_vdisk_path="/images/LinuxMint.vdi.vtoy"
)。
你不需要像 hd0/hd1 这样指定到具体哪个硬盘,因为脚本里会使用search
命令去遍历所有磁盘搜索这个文件。
你只需要确保这个路径是唯一的即可。比如,你有一个C:\VhdDir\Ubuntu.vhd.vtoy
同时还有一个D:\VhdDir\Ubuntu.vhd.vtoy
这种情况可能会找错文件。
注意以下格式都是错误的:
set my_vdisk_path="(hd1,1)/VhdDir/Ubuntu.vhd.vtoy"
set my_vdisk_path="E:\VhdDir\Ubuntu.vhd.vtoy"
set my_vdisk_path="\VhdDir\Ubuntu.vhd.vtoy"
使用其他 bootloader 启动 vDisk 文件
通过前面的说明我们知道,Ventoy 可以启动 Ventoy 所在的磁盘上的 vdisk 文件,也可以启动非 Ventoy 盘(本地磁盘)上的 vdisk 文件。 但是这两者都必须要通过 Ventoy 才可以启动。 实际上 vdisk 启动这个功能是可以独立出来的。 可以集成到其他 bootloader 中来启动,比如grub4dos/grub2/rEFInd/Systemd-boot
等。
唯一的要求是 vdisk 文件所在的分区文件系统只能是 FAT32/NTFS/exFAT/XFS/Ext2/Ext3/Ext4/UDF 中的一种。使用方法如下:
================== i386-pc ======================GRUB4DOS:kernel /ipxe.krn vdisk=/MyVdiskDir/Deepin.vdi.vtoyinitrd /vdiskchainGRUB2:linux16 (hd0,1)/test123/ipxe.krn vdisk=/MyVdiskDir/Deepin.vdi.vtoyinitrd16 (hd0,1)/test123/vdiskchain================== x86-64-efi ======================GRUB2:chainloader (hd0,1)/test123/vdiskchain vdisk=/MyVdiskDir/Deepin.vdi.vtoyrEFInd:loader /vdiskchain vdisk=/MyVdiskDir/Deepin.vdi.vtoySystemd-boot:efi /vdiskchain vdisk=/MyVdiskDir/Deepin.vdi.vtoy
这里的 ipxe.krn 和 vdiskchain 是两个文件,需要从 /ventoy/vdiskchain/releases 下载最新版本。 vdisk 参数和上面的 my_vdisk_path 参数是一样的含义和要求。
已知问题:
i386-pc (Legacy BIOS) 模式下,grub4dos/grub2 必须是用磁盘启动的才可以 chainload 成功,从光驱启动的无法 chainload 成功。
4.5 Ventoy 数据持久化插件(成功)
很多发行版本(比如 Ubuntu、MX、LinuxMint 等)都提供了数据持久化的支持。这样你就可以在Live环境中保存一些数据,比如用户密码、IP参数等等。这些数据在你下次启动的时候就可以直接使用了,无需再重新配置。正常情况下,我们一般是单独创建一个分区来保存持久化数据,不是非常灵活。
现在Ventoy提供了一个新的功能。你无需再单独创建分区、也无需添加 persistent 启动参数,只需要在第一个分区里面放一个数据文件,然后通过json配置和对应ISO关联上就可以了。对于第1个分区的格式没有要求,NTFS/exFAT等都可以。
你可以同时放很多个不同的数据文件,分别关联到不同的ISO文件上。你也可以同一个数据文件关联到不同的ISO文件上,只要ISO内的系统支持就行。甚至你还可以为一个ISO文件同时指定多个数据文件,在启动时 Ventoy会提供一个菜单,你可以选择本次启动是否使用数据文件以及使用哪一个数据文件。
支持的发行版
Arch/Ubuntu以及基于它的衍生版本。实际测试过的发行版如下表所示:
Json 配置
关于 ventoy.json 的位置以及相关说明,请首先参考 插件入口(*必读)
在镜像分区/ventoy/ventoy.json
中定义了一个persistence
的数组来配置持久化插件。
{"persistence": [{"image": "/ISO/MX-19.1_x64.iso","backend": "/persistence/MX-19.1_x64.dat"},{"image": "/ISO/ubuntu-20.04-desktop-amd64.iso","backend": ["/persistence/ubuntu_20.04_1.dat","/persistence/ubuntu_20.04_2.dat","/persistence/ubuntu_20.04_3.dat"],"autosel": 2}, {"image": "/linuxmint-19.3-xfce-64bit.iso","backend": "/persistence/linuxmint_19.03.dat","autosel": 1 }]}
多模式选项
支持。可以分别针对 x86 Legacy BIOS、IA32 UEFI、x86_64 UEFI 和 ARM64 UEFI 模式做不同的设置。详细说明请参考 多模式选项
持久化数据文件
持久化数据文件其实就是一个磁盘镜像文件。你可以直接下载已创建好的模板使用或者自己使用脚本创建。
直接下载
你可以直接从 /ventoy/backend/releases 下载已经创建好的镜像文件使用。
新创建
这里提供了一个 CreatePersistentImg.sh 脚本用来创建持久化镜像文件。
把它下载下来,在Linux shell中执行sudo sh CreatePersistentImg.sh
(默认会创建一个 1GB 大小的 persistence.dat 文件,ext4文件格式,label为 casper-rw)。
sh CreatePersistentImg.sh [ -s SIZE_IN_MB ] [ -t FSTYPE ] [ -l LABEL ] [ -c CFG ] 例如:sh CreatePersistentImg.sh ----> persistence.dat, 1GB 大小, ext4 文件系统, label 为 casper-rwsh CreatePersistentImg.sh -l MX-Persist ----> persistence.dat, 1GB 大小, ext4 文件系统, label 为 MX-Persistsh CreatePersistentImg.sh -s 2048 ----> persistence.dat, 2GB 大小, ext4 文件系统, label 为 casper-rwsh CreatePersistentImg.sh -s 4096 -t xfs ----> persistence.dat, 4GB 大小, xfs 文件系统 (当前只支持 ext2/ext3/ext4/xfs), label 为 casper-rwsh CreatePersistentImg.sh -l persistence -c persistence.conf ----> persistence.dat, 1GB 大小, ext4 文件系统, label 为 persistence 最后还会在 persistence.dat里面会创建一个persistence.conf 文件,文件内容只有一行,为 "/ union" 对于有一些发行版有这种要求,比如 Debian、KALI、CloneZilla等。
在生成数据文件以及拷贝文件到U盘时,注意使用sync把数据完全写入磁盘。不同的发行版本使用的默认Label不同,可以通过 -l 参数指定,比如ubuntu默认为casper-rw, MX Linux默认为 MX-Persist等。持久化数据文件必须放在镜像分区中,可以是根目录下,也可以是其他子目录下。另外并不需要和对应iso文件放在同一目录下。持久化数据文件制作好后,可以作为一个模板,压缩后保存在电脑上(压缩后非常小),这样就无需每次都新建一个。 扩展持久化数据文件
有些情况下,可能在使用一段时间之后发现持久化空间不足。如果使用一个新的持久化数据文件,又需要备份恢复原有数据,比较耗时。
这里提供了一个 ExtendPersistentImg.sh 脚本用来无损扩展持久化数据文件。 把它下载下来,在 Linux shell 中按照说明执行即可。
sudo sh ExtendPersistentImg.sh datfile extend_size_mb 例如:sudo sh ExtendPersistentImg.sh persistent.dat 2048表示把 persistent.dat 文件扩展 2048MB,即如果原始 persistent.dat 文件大小是 1GB,则扩展之后变成 3GB
启动前的提示 (1.0.12+)
在启动配置了数据持久化的ISO文件时会显示一个提示菜单。你可以选择本次启动是否使用持久化以及使用哪一个持久化数据文件。
我的目录结构
iso中放置镜像文件
persistence中放置持久化文件在 /ventoy/backend/releases 中下载
ventoy中放置配置文件ventoy.json