课设总结报告
个人报告(20201325夏俊睿)
1. 个人贡献
本人在这四周贡献了OpenSSL、Gmlib、snowland-smx、Node.js+gm-crypto和sm-crypto五个国密算法库的安装、配置和使用。
第一周进度:搭建OpenEuler系统环境,配置可视化界面和jdk、python安装等
第二周:OpenSSL、Gmlib、snowland-smx
第二周所做算法库博客链接如下
C语言
C语言
python
第三周:Node.js + gm-crypto、sm-crypto
第三周所做算法库博客链接如下
JavaScript
JavaScript
第四周:GmSSL、tjfoc-gm、bouncycastle
第四周所做算法库博客链接如下
C语言
go语言
java
2.所遇问题及解决办法
(1)在配置Node.js的过程中遇到了一些问题
配置环境变量之后发现使用node和npm指令仍然显示找不到指令,后面经过网上搜索后发现,每次修改/etc/profile文件之后都要使用source /ect/profile
进行导入文件才行
(2)Linux指令失效
在进行搭建sm-crypto的过程中发现了一个让我很难受的问题:linux系统指令全部找不到,ls、cd、pwd、vim全部失效。
后面在网上搜了一些教程说使用:
export PATH=/bin:/usr/bin:$PATH
但是我发现我连export都用不了后通过一篇博客了解到可以使用
[/bin/vi /etc/profile]()
进行修改环境变量,但是这样的做法在下一次启动终端时仍然会出现指令失效的情况,这治标不治本的放法让我有点头疼,并且openeuler可视化界面也卡住了,我在一步步找资料后知道这是由于环境变量没有导入导致系统找不到指令。
解决方法:
除了要在/etc/profile中配置系统环境变量,还要在~/.bashrc
中加
export PATH=/bin:/usr/bin:$PATH
这样才从根本上解决了这个问题。
(3)Snowland-smx算法SM4实现报错
在使用Snowland-smx实现SM4算法加密的时候发生了报错
我们可以看到报错信息中:
File "<stdin>", line 1, in <module> TypeError: sm4_crypt_ecb() missing 1 required positional argument: 'input_data'
可以清晰的看到他说传入input_data发生了争议,但是我们在执行的时候并未传参进入sm4_crypt_ecb(),所以我们将input_data传入看看
这时候报的错误更多了,但是这时候我们细看错误会发现 其错误原因是发生在路径为
/usr/local/lib/python3.9/site-packages/pysmx/SM4/_SM4.py
的SM4.py文件
随后我们使用cat指令查看这个文件
cat /usr/local/lib/python3.9/site-packages/pysmx/SM4/_SM4.py
我们可以看到input_data数组应该至少为16位。
随后我们将input_data改为了
input_data = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]
然后我们再执行以下语句
msg = sm4.sm4_crypt_ecb(input_data)
就成功了
对于这个问题为什么是16位,我也在想设计者的角度和想法以及这个算法本身,才知道sm4算法分组长度为128位,即16字节,那就能说通了,一个数字一个字节,刚好就至少需要16个数字。通过实践发现传入的数据必须是16的整数倍,这也说明了推断是正确的。
(4)Gmlib如何编译目标文件
在网上了解到Gmlib为一个基于C语言的密码算法库,但是跟随者github教程走完创建demo小程序后却不知如何编译运行对应的sm2、sm3、sm4目标文件,后面在网上学习和了解了一些此库编译方法CMake的一些知识。CMake是开源、跨平台的构建工具,可以让我们通过编写简单的配置文件去生成本地的Makefile,这个配置文件是独立于运行平台和编译器的,这样就不用亲自去编写Makefile了,而且配置文件可以直接拿到其它平台上使用,无需修改,非常方便。
为了简单弄清CMake的使用方法和一些原理这里也找到了一个比较好的博客链接:
(41条消息) Linux下CMake简明教程_爱就是恒久忍耐的博客-CSDN博客_linux cmake
举个小例子来学习CMake:
cmake_minimum_required (VERSION 2.8)
project (demo)
add_executable(main main.c)
比如上述代码它的意思就是:
第一行代表cmake的最低版本要求是2.8,第二行表示本工程的信息也就是工程的名字叫做demo,第三行才是这段代码的核心,他表示要生成的可执行文件叫做main(对应第一个参数),要是用的源文件是main.c(对应第二个参数)。然后我们查看此代码库里面的末尾代码会发现有个类似的代码语句。
add_executable(test demo/test.c )
target_link_libraries(test gmlib)
那要达到我们的目的就很清楚了,只需将add_executable中的test和demo/test.c改为
gmlib-sm2_crypt demo/demo_sm2_crypt.c
但是现在运行还是会报错,因为target_link_libraries函数的参数没改。后面通过学习了解到此函数是一个动态链接库的函数,它会将目标文件夹下的所有子文件夹的文件都include其中,他的第一个参数是对应add_executable的第一个参数,是可执行文件名字,两个函数的第一个参数应该相同,不然会报错。
然后就可以成功运行出结果了。
(5)Bouncycastle实现时IDEA导出的jar包无法执行
我在导出包的时候发生了一个很严重的问题,发生了找不到主类的情况,但是我们从pom.xml
依赖中明显可以看出我设置了mainclass为sm2.sm2_demo,随后我们用360压缩打开jar包看一下
我发现没有Main-Class字段,所以我就加上了
Main-Class: sm2.sm2_demo
但是还是不如意,它发生了如下报错
错误: 无法初始化主类 sm2.sm2_demo
原因:java.lang.NoClassDefFoundError:org/bouncycastle/jce
/provider/BouncyCastleProvider
这到底是怎么回事?我在网上搜了这个报错原因,网上有人说是在Terminal端执行没有idea中导入的bouncycastle相关包,那么问题又回到了原点,我需要下载bouncycastle包,但是我进不去官方网站,并且我在jdk18的jre文件夹下找不到ext文件夹,这个文件夹是存放拓展包的,我没有就算下载下来也不知道放哪,这个问题牵涉着我要换jdk,要重新配idea,重新导出包,意味着从头再来。但是我没有放弃,在后面一篇博客中了解到mvn package执行完之后会生成两个jar包,如下:
而我只有一个sm2test.jar,那我就将问题的研究方向变为了怎么生成dependencies包,我也跟网上找了很多方法都没有作用,后面我决定换一个pom.xml文件,具体如下:
<build>
<finalName>sm2test</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.5.5</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<archive>
<manifest>
<mainClass> sm2.sm2_demo </mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>
jar-with-dependencies
</descriptorRef>
</descriptorRefs>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
从这个pom.xml文件就可以看出来,我加了一项
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
然后就成功生成了 jar-with-dependencies.jar
后面在网上也了解学习到了此插件的一些知识:
此插件使用内置的Assembly Descriptor
要使用maven-assembly-plugin,需要指定至少一个要使用的assembly descriptor 文件。默认情况下,maven-assembly-plugin内置了几个可以用的assembly descriptor:
bin : 类似于默认打包,会将bin目录下的文件打到包中;
jar-with-dependencies : 会将所有依赖都解压打包到生成物中;
src :只将源码目录下的文件打包;
project : 将整个project资源打包。
(6)Tjfoc-gm无法生成sum文件和无法连接github
自己也遇到了小组成员未遇到过的问题——sum文件生成和github连接不上这两个问题,具体原因也没有找出来是为什么,一开始发现跟着他们的博客走得很顺利,后面突然报错让我有点难以置信,但好在自己也静下心来认真看了程序返回的错误,然后上网去查找了相关资料发现要生成sum文件需要执行go mod tidy指令才行,然后置于连接不上github是因为外服可能会阻止我们访问,所以需要进行切换代理服务,具体指令如下:
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.io,direct