GmSSL相遇(1)


最近想要使用国密算法写一些工具,不知不觉遇到了GmSSL,先试试看。

1. 安装GmSSL

参考官网的快速上手,我的目标主机是没有管理员权限的Linux,故而编译源码安装到自己的目录下,下载源码

$ unzip -q GmSSL-master.zip # -q 解压时不打印列表
$ cd GmSSL-master
$ mkdir -p ~/apps/GmSSL
$ ./config --prefix=/home/xflm/apps/GmSSL # 大约3s
$ make -j8 # 启用8个进程编译,根据实际主机的特点进行选择,大约2.5分钟
$ make install # 大约2.5分钟
$ cd ~/apps/GmSSL
$ ls
bin/ include/ lib/ share/ ssl/

简单总结一下这些文件:

文件描述
bin/gmssl这个文件即gmssl命令程序
include/openssl/这个目录下是使用gmssl库会用到的头文件
lib/gmssl的动态库、静态库文件
share/帮助文档
ssl/gmssl配置文件等

2. 命令行运行GmSSL

由于不是通过管理员安装到系统目录,故而./bin/gmssl执行会失败,需要使用下面语句执行:

# GmSSL有自己的命令行
$ LD_LIBRARY_PATH=~/apps/GmSSL/lib ./bin/gmssl
GmSSL>q # q 退出
# 也可直接进行密码运算
$ echo -en "1" | LD_LIBRARY_PATH=~/apps/GmSSL/lib ./bin/gmssl sm3
(stdin)= cbddd......

若以后需要在命令行使用,在~/.bashrc中添加一行:

alias gmssl='LD_LIBRARY_PATH=~/apps/GmSSL/lib ~/apps/GmSSL/bin/gmssl'

然后重新加载~/.bashrc

$ . ~/.bashrc

3. 脚本运行GmSSL

脚本中alias行不通,执行LD_LIBRARY_PATH=~/apps/GmSSL/lib ~/apps/GmSSL/bin/gmssl也不行,需要这样做:

gmssl.sh

#!/bin/bash

export LD_LIBRARY_PATH=~/apps/GmSSL/lib # 必须导出LD_LIBRARY_PATH到环境变量,脚本运行在子bash中,不会污染当前bash环境
GMSSL=~/apps/GmSSL/bin/gmssl # 定义个变量,下面多次引用时就不用写这么长了
echo -en "$1" | $GMSSL sm3

执行:

$ chmod +x gmssl.sh
$ ./gmssl.sh 1
(stdin)= cbdddb......

4. C程序使用GmSSL

main.c

#include <stdio.h>
#include "openssl/sm3.h"

int main(int argc, char *argv)
{
	(void)argc;
	(void)argv;
	sm3_ctx_t sm3[1];
	uint8_t digest[32];
	int i;

	sm3_init(sm3);
	sm3_update(sm3, (uint8_t *)"1", 1);
	sm3_final(sm3, digest);

	printf("SM3: ");

	for(i = 0; i < 32; i++)
	{
		printf("%02X", digest[i]);
	}

	puts("");

	return 0;
}

4.1 链接动态库

# 因为libcrypto.a和libcrypto.so在同一目录,gcc优先链接.so
# 链接动态库时,main.c的位置可以在-lcrypto之后
# 此处~表示用户目录,-I和~之间必须有空格,若~换成/home/xflm则可以没有空格
$ gcc -I ~/apps/GmSSL/include -L ~/apps/GmSSL/lib -lcrypto main.c
# 由于动态库不在系统搜索路径内,需要指定到LD_LIBRARY_PATH中
$ LD_LIBRARY_PATH=~/apps/GmSSL/lib ./a.out
SM3: CBDDDB......
# 可执行文件较小
$ du -bs a.out
7226 a.out

4.2 链接静态库

# 因为libcrypto.a和libcrypto.so在同一目录,需强制gcc链接静态库,注意此处写法
# 链接静态库时,main.c的位置必须在-l:libcrypto.a之前
$ gcc main.c -I/home/xflm/GmSSL/include -L/home/xflm/GmSSL/lib -l:libcrypto.a
# 直接指定静态库文件也是可以的,注意顺序
$ gcc main.c -I/home/xflm/GmSSL/include ~/apps/GmSSL/lib/libcrypto.a
# 静态连接直接运行即可
$ ./a.out
SM3: CBDDDB......
# 可执行文件较大
$ du -bs a.out
18513 a.out

5. python调用GmSSL

最近在学习python但还是菜鸡一个,摸了半天整了个能用的:

test.py

#!/bin/env python

from ctypes import *

class sm3_ctx_t(Structure):
	_fields_ = [
		('digest', c_uint * 8),
		('nblocks', c_longlong),
		('block', c_ubyte * 64),
		('num', c_int)
	]

crypto = CDLL('/home/xflm/apps/GmSSL/libcrypto.so')

sm3 = sm3_ctx_t()
msg = c_char_p(b'1')
digest = create_string_buffer(32)

crypto.sm3_init(byref(sm3))
crypto.sm3_update(byref(sm3), msg, len(msg.value))
crypto.sm3_final(byref(sm3), byref(digest))
print('SM3 =', digest.raw.hex())

执行一下试试:

$ py test.py # 由于系统的python版本比较低,我在自己的目录下安装了python 3.8.6,此处我用这个版本的pyhon来执行
SM3 = cbdddb......

6. gmssl程序链接静态库

由于安装在自己的目录下,gmssl命令需要动态库,会比较麻烦,最近发现可以解决这个问题。
执行完./config --prefix=/home/xflm/apps/GmSSL后,打开Makefile,搜索apps/gmssl,找到其链接的位置,将libssl.so libcrypto.so改为libssl.a libcrypto.a,然后编译安装,最终编译的gmssl命令将不再需要指定动态库了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
GMSSL 是一种用于处理SSL/TLS通信的开源加密库,是国密算法标准的实现之一。它在GitHub上有自己的官方仓库,用于提供代码和文档的版本控制和共享。 GMSSL 的官方GitHub仓库是一个非常有用的资源,它包含了GMSSL的源代码、使用手册、示例程序等。通过GitHub,我们可以方便地查看、下载和使用最新的GMSSL版本。 在GitHub上,我们可以找到GMSSL的完整源代码,这为我们深入研究GMSSL的实现细节提供了便利。我们可以阅读其中的代码注释,并了解GMSSL中使用的算法、协议和加密方式。这有助于我们更好地理解国密算法标准,并在需要的时候进行修改和定制。 此外,GMSSL的GitHub仓库还提供了使用手册和文档,这些文档详细介绍了GMSSL的功能、接口和使用方法。对于初次接触GMSSL的开发者来说,这些文档是宝贵的学习资源。我们可以根据文档中的指导,使用GMSSL构建安全通信应用程序,保护数据的机密性和完整性。 GitHub作为一个开源社区,还可以让我们与其他GMSSL开发者进行交流和合作。我们可以通过提交问题、提出建议或者参与讨论,与其他使用GMSSL的开发者分享经验和解决问题的方法。这种交流有助于我们学习和成长,也有助于GMSSL的持续改进和发展。 总之,GMSSL的GitHub仓库为我们提供了一个方便、开放和透明的平台,使我们可以更好地了解、使用和贡献国密算法标准的开源实现。在这个仓库中,我们可以获取最新的GMSSL版本,学习和分享GMSSL的知识,参与GMSSL社区的建设和发展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值