2021-06-25


GMSSL引擎

gmssl中包含SDF与SKF两种设备引擎,但并未给出源码,只能通过库进行调用
本文主要阐述两种引擎的使用,以及一些代码方面的分析


SKF引擎命令:

目前gmssl2.5.4版本的skf引擎共支持以下内容
gmssl skf -help
Usage: skf [options]
Valid options are:
-help Display this summary
-lib val Vendor SKF dynamic library
-vendor val Vendor name
-listdevs List installed devices
-dev val Device name
-devinfo Print device information
-label val Set new device label
-transmit val Transmit raw data packet
-authkey val Device authentication key in Hex
-newauthkey val Set new device authentication key in Hex
-listapps List applications
-newapp val Create a new application with name
-delapp val Delete an applicaiton by name
-app val Application name
-changepass Change application user or admin passw-phrase
-admin Open application as administrator
-pass val Application user or admin pass-phrase source
-newpass val Application user or admin new ass-phrase source
-adminpass val Application admin pass-phrase source
-unblock Unblock application user pass-phrase
-listobjs List data objects
-importobj val Import data object with name
-exportobj val Export data object by name
-delobj val Delete data object by name
-obj val Data object name
-listcontainers List containers
-newcontainer val Create container with name
-algorithm val Container public key algorithm - SM2 or RSA
-delcontainer val Delete container by name
-container val Container name
-importenckey Import encryption private key into container
-keypass val Private key encryption pass-phrase
-exportsignkey Export signing public key from container
-exportenckey Export encryption public key from container
-printkeys Print public keys in container
-importcert Import certificate into container
-exportsigncert Export signing certificate from container
-exportenccert Export encryption certificate from container
-in infile File to be imported from
-out outfile File to be exported to
-inform format Input format - DER or PEM
-outform PEM|DER Output format - DER or PEM


SKF引擎的使用:

这里以龙脉公司的GM3000为例
1、 使用 -lib命令明确指定厂商的SKF动态库
2、 通过-listdevs指令可以枚举主机中已经插入的所有该供应商的设备,如下所示,其中输出的DEVICE为供应商SKF动态库为设备指定的设备名称。在这里插入图片描述

3、 通过-dev [设备名称] 指令可以对当前连接下的任一设备进行操作
查询设备信息查询某一设备信息
4、出错地方
该引擎使用时必须通过设备认证密钥,无论是应用还是容器该认证密钥都不可或缺,但是在UK的实际使用中,代码编写过程中从未使用过设备认证密钥这一函数。编写了相应的设备认证密钥修改代码:

   ulRslt = SKF_DevAuth(hdev, szEncryptedData,    ulEncryptedDataLen);
	ERROR_THROW(ulRslt)
	printf("Authentication successful.\n");
	//Change device authentication
	strcpy(new_auth_key, "12345678123456781234567812345678");
	ulRslt = SKF_ChangeDevAuthKey(hdev, (BYTE *)new_auth_key, 16);
	ERROR_THROW(ulRslt)
	printf("Change authentication successful.\n");

将认证密钥修改为gmssl中默认的16字节长度的认证密钥
在这里插入图片描述
在查看应用列表时首先提示出错的是SKF_DevAuth函数,也就是认证密钥函数,查看该段代码仅为调用暂未得出为何报错的结论,由于每个功能函数的调用中认证密钥都是必选项,因此剩余函数测试暂未完成。
通过实际编程来看,暂未发现认证密钥出现的必要性,因此若作自实现建议绕过该函数


SKF Dummy引擎分析:

1、 全部SKF接口规范中涉及的函数均已在gmssl中出现,虽然通过-help可以发现如随机数生成等几项调用未留对外调用接口,但是通过skf_lib.c的分析中可知该函数可被调用
2、引擎主要通过SKF_LoadLibrary加载不同厂商库达成兼容不同厂商UK的效果

SKF Engine引擎分析:

1、 由于SKF引擎默认不编译,因此从源代码安装SKF引擎需要在配置中显式启用SKF引擎。通过

./config enable-skfeng;

进行编译,但是其中e_skf.c缺少,无法实现编译,由于gmssl中不提供该引擎的编译代码,因此无法实现代码编译
2、gmssl目前仅有SKF引擎动态库(与厂商动态库不同),但是在编译安装结束后未发现引擎动态库位置,因此暂时无法继续完成测试。

SDF引擎:

1、 sdf引擎与skf引擎整体类似,通过-help首先查看gmssl中显示得功能
Valid options are:
-help Display this summary
-lib val Vendor’s SDF dynamic library
-vendor val Vendor name
-printdevinfo Print device information
-printsm2sign val Print SM2 signing key with key index
-printsm2enc val Print SM2 encryption key with key index
-printrsasign val Print RSA signing key with key index
-printrsaenc val Print RSA encryption key with key index
-accesskey val Access private key with the key index number
-pass val Passphrase source for accessing private key
-importobj val Import data object into device
-exportobj val Export data object from device
-delobj val Delete data object from device
-in infile File to be imported from
-out outfile File to be exported to
2、sdf同样通过-lib指定厂商库,以此方式找到对应厂商设备
在这里插入图片描述
查看插入设备的设备信息

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
使用python中的pymsql完成如下:表结构与数据创建 1. 建立 `users` 表和 `orders` 表。 `users` 表有用户ID、用户名、年龄字段,(id,name,age) `orders` 表有订单ID、订单日期、订单金额,用户id字段。(id,order_date,amount,user_id) 2 两表的id作为主键,`orders` 表用户id为users的外键 3 插入数据 `users` (1, '张三', 18), (2, '李四', 20), (3, '王五', 22), (4, '赵六', 25), (5, '钱七', 28); `orders` (1, '2021-09-01', 500, 1), (2, '2021-09-02', 1000, 2), (3, '2021-09-03', 600, 3), (4, '2021-09-04', 800, 4), (5, '2021-09-05', 1500, 5), (6, '2021-09-06', 1200, 3), (7, '2021-09-07', 2000, 1), (8, '2021-09-08', 300, 2), (9, '2021-09-09', 700, 5), (10, '2021-09-10', 900, 4); 查询语句 1. 查询订单总金额 2. 查询所有用户的平均年龄,并将结果四舍五入保留两位小数。 3. 查询订单总数最多的用户的姓名和订单总数。 4. 查询所有不重复的年龄。 5. 查询订单日期在2021年9月1日至9月4日之间的订单总金额。 6. 查询年龄不大于25岁的用户的订单数量,并按照降序排序。 7. 查询订单总金额排名前3的用户的姓名和订单总金额。 8. 查询订单总金额最大的用户的姓名和订单总金额。 9. 查询订单总金额最小的用户的姓名和订单总金额。 10. 查询所有名字中含有“李”的用户,按照名字升序排序。 11. 查询所有年龄大于20岁的用户,按照年龄降序排序,并只显示前5条记录。 12. 查询每个用户的订单数量和订单总金额,并按照总金额降序排序。
06-03
这里是使用 Python 的 PyMySQL 完成上述任务的代码: ```python import pymysql # 连接数据库 conn = pymysql.connect(host='localhost', port=3306, user='root', password='123456', database='test') # 创建游标 cur = conn.cursor() # 创建 users 表 cur.execute(''' CREATE TABLE users ( id INT PRIMARY KEY, name VARCHAR(20), age INT ) ''') # 创建 orders 表 cur.execute(''' CREATE TABLE orders ( id INT PRIMARY KEY, order_date DATE, amount INT, user_id INT, FOREIGN KEY (user_id) REFERENCES users(id) ) ''') # 插入数据 users_data = [ (1, '张三', 18), (2, '李四', 20), (3, '王五', 22), (4, '赵六', 25), (5, '钱七', 28) ] orders_data = [ (1, '2021-09-01', 500, 1), (2, '2021-09-02', 1000, 2), (3, '2021-09-03', 600, 3), (4, '2021-09-04', 800, 4), (5, '2021-09-05', 1500, 5), (6, '2021-09-06', 1200, 3), (7, '2021-09-07', 2000, 1), (8, '2021-09-08', 300, 2), (9, '2021-09-09', 700, 5), (10, '2021-09-10', 900, 4) ] for user in users_data: cur.execute('INSERT INTO users VALUES (%s, %s, %s)', user) for order in orders_data: cur.execute('INSERT INTO orders VALUES (%s, %s, %s, %s)', order) # 提交事务 conn.commit() # 查询语句 # 1. 查询订单总金额 cur.execute('SELECT SUM(amount) FROM orders') print(cur.fetchone()[0]) # 2. 查询所有用户的平均年龄,并将结果四舍五入保留两位小数。 cur.execute('SELECT ROUND(AVG(age), 2) FROM users') print(cur.fetchone()[0]) # 3. 查询订单总数最多的用户的姓名和订单总数。 cur.execute(''' SELECT users.name, COUNT(*) AS total_orders FROM users JOIN orders ON users.id = orders.user_id GROUP BY users.id ORDER BY total_orders DESC LIMIT 1 ''') print(cur.fetchone()) # 4. 查询所有不重复的年龄。 cur.execute('SELECT DISTINCT age FROM users') print([row[0] for row in cur.fetchall()]) # 5. 查询订单日期在2021年9月1日至9月4日之间的订单总金额。 cur.execute('SELECT SUM(amount) FROM orders WHERE order_date BETWEEN "2021-09-01" AND "2021-09-04"') print(cur.fetchone()[0]) # 6. 查询年龄不大于25岁的用户的订单数量,并按照降序排序。 cur.execute(''' SELECT users.name, COUNT(*) AS total_orders FROM users JOIN orders ON users.id = orders.user_id WHERE age <= 25 GROUP BY users.id ORDER BY total_orders DESC ''') print(cur.fetchall()) # 7. 查询订单总金额排名前3的用户的姓名和订单总金额。 cur.execute(''' SELECT users.name, SUM(amount) AS total_amount FROM users JOIN orders ON users.id = orders.user_id GROUP BY users.id ORDER BY total_amount DESC LIMIT 3 ''') print(cur.fetchall()) # 8. 查询订单总金额最大的用户的姓名和订单总金额。 cur.execute(''' SELECT users.name, SUM(amount) AS total_amount FROM users JOIN orders ON users.id = orders.user_id GROUP BY users.id ORDER BY total_amount DESC LIMIT 1 ''') print(cur.fetchone()) # 9. 查询订单总金额最小的用户的姓名和订单总金额。 cur.execute(''' SELECT users.name, SUM(amount) AS total_amount FROM users JOIN orders ON users.id = orders.user_id GROUP BY users.id ORDER BY total_amount ASC LIMIT 1 ''') print(cur.fetchone()) # 10. 查询所有名字中含有“李”的用户,按照名字升序排序。 cur.execute('SELECT * FROM users WHERE name LIKE "%李%" ORDER BY name ASC') print(cur.fetchall()) # 11. 查询所有年龄大于20岁的用户,按照年龄降序排序,并只显示前5条记录。 cur.execute('SELECT * FROM users WHERE age > 20 ORDER BY age DESC LIMIT 5') print(cur.fetchall()) # 12. 查询每个用户的订单数量和订单总金额,并按照总金额降序排序。 cur.execute(''' SELECT users.name, COUNT(*) AS total_orders, SUM(amount) AS total_amount FROM users JOIN orders ON users.id = orders.user_id GROUP BY users.id ORDER BY total_amount DESC ''') print(cur.fetchall()) # 关闭游标和连接 cur.close() conn.close() ``` 注意:在运行代码之前,需要先安装 PyMySQL 模块,可以使用以下命令进行安装: ``` pip install pymysql ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值