赞
踩
其实到三已经完结了,领导在openssl上一顿命令操作:openssl ecparam -genkey -name SM2 -out privtest.key
openssl ec -in privtest.key -pubout -out pubtest.key
生成了privtest.key和pubtest.key两个文件,给了命令就是想办法把这俩文件里的密钥读出来,来实现加密解密,不然生成的都是不可见字符,没办法实现双方密钥交换。
这可就犯了难了,直接阅读openssl的源码非常困难,并没找到经过怎样的过程将xykey三个不可见字符变成大概是base64编码的一个东西,也尝试将文件中的大概是base64编码的密钥进行反编码,结果除了让人看不懂之外还是看不懂。在csdn上也没有文章指出这些命令生成的文件究竟是什么格式,也咨询过相关大佬
直到最后意外的发现这个文件的格式为pem格式文件,顺着这个线索摸索下去,先是找到了openssl的读取pem文件的函数,但是因为我是基于gmssl实现的,参考着openssl找到了gmssl里的读取pem格式的函数,sm2_public_key_info_from_pem,名字很清楚,sm2从pem中读取公钥,而读取公钥使用sm2_private_key_from_pem函数,代码参考的大概这个样子
- void main() {
-
- SM2_KEY sm2_key;
- FILE* pubkeyfp = NULL;
- FILE* prikeyfp = NULL;
- int ret = 0;
- memset(&sm2_key, 0x00, sizeof(sm2_key));
-
-
- //sm2_key_generate(&sm2_key);
- //printf("私钥=[%#x],公钥x=[%#x],y=[%#x]\n", sm2_key.private_key,sm2_key.public_key.x,sm2_key.public_key.y);
- if (!(pubkeyfp = fopen("pubtest.key", "rb"))) {
- printf("pubkey file open fail\n");
- ret = -1;
- goto end;
- }
- if (sm2_public_key_info_from_pem(&sm2_key, pubkeyfp) != 1) {
- printf("pubkey get fail\n");
- ret = -1;
- goto end;
- }
- if (!(prikeyfp = fopen("privtest.key", "rb"))) {
- printf("privkey file open fail\n");
- ret = -1;
- goto end;
- }
- //sm2_private_key_info_decrypt_from_pem
- //sm2_private_key_from_pem
- if (sm2_private_key_from_pem(&sm2_key, prikeyfp) != 1) {
- printf("privkey get fail\n");
- ret = -1;
- goto end;
- }
- end:
- if (pubkeyfp != NULL) {
- fclose(pubkeyfp);
- pubkeyfp = NULL;
- }
- if (prikeyfp != NULL) {
- fclose(prikeyfp);
- prikeyfp = NULL;
- }
- return ret;
- }
但其实还是存在一个问题,就是私钥文件读取的时候-----BEGIN EC PARAMETERS-----是无法识别的,在删除PARAMETERS之后两个文件的公私钥能够正常读取且能够完成加签验签操作
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。