国密算法实践经历(一)

  不久前接到了单位的任务,内容是采用国密算法实现数据的加密操作。作为一个之前在加密算法经验基本为零的小白,从刚开始接到需求一脸迷茫到后来逐渐理出一些头绪。一路做下来有一些心得和体会,特写下此文记录一下这次新的尝试。文章计划从GmSSL库的编译、SM2签名/验签/加密、SM3-HMAC、SM4的CBC/ECB加密等方面进行算法基础与代码实现的记录。由于经验尚浅,有不对的地方还望各位看官不吝赐教。


  对于一个从来没有做过的东西,第一反应当然是在网络上进行搜索啦。经过一番搜索(以及付出了上百的CSDN积分T.T),最终决定通过GmSSL加密库来实现。

关于GmSSL
GmSSL是一个开源的密码工具箱,支持SM2/SM3/SM4/SM9等国密(国家商用密码)算法、SM2国密数字证书及基于SM2证书的SSL/TLS安全通信协议,支持国密硬件密码设备,提供符合国密规范的编程接口与命令行工具,可以用于构建PKI/CA、安全通信、数据加密等符合国密标准的安全应用。GmSSL项目是OpenSSL项目的分支,并与OpenSSL保持接口兼容。因此GmSSL可以替代应用中的OpenSSL组件,并使应用自动具备基于国密的安全能力。GmSSL项目采用对商业应用友好的类BSD开源许可证,开源且可以用于闭源的商业应用。GmSSL项目由北京大学关志副研究员的密码学研究组开发维护,项目源码托管于GitHub。自2014年发布以来,GmSSL已经在多个项目和产品中获得部署与应用,并获得2015年度“一铭杯”中国Linux软件大赛二等奖(年度最高奖项)与开源中国密码类推荐项目。GmSSL项目的核心目标是通过开源的密码技术推动国内网络空间安全建设。

  按照官网的使用指南,在源代码下载完成后先将其解压至工作目录(笔者是直接下载到桌面)
  注:编译环境:Xcode9.1/GmSSL版本:GmSSL 2.0 - OpenSSL 1.1.0d 26 Jan 2017

$ cd desktop
$ unzip GmSSL-master.zip
$ cd GmSSL-master

  进行编译配置

$ ./Configure ios-cross

  在这里笔者是需要编译出用于iOS平台使用的工程文件,所以选择了这样的配置。而且由于需要支持armv7/arm64/x86_64指令集,进行了多次的尝试后发现如需编译armv7的静态库,需要配置为iphoneos-cross。如果需要获得其他支持的编译配置,可以这样查看:

$ ./Configure  --help

  配置完成后,可以在工程目录下找到一个名为Makefile的文件,打开后进行修改(可直接搜索"cc= "找到需要修改的位置)。修改的地方有两处:

  • CC 直接对等号后的内容进行替换。这里的路径是笔者Mac上的Xcode路径,编译的平台是arm64
CC=/Applications/XCode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -arch arm64
  • CFLAGS(就在CC的下一行) 只对-isysroot $(CROSS_TOP)/SDKs/$(CROSS_SDK) -fno-common 这段内容进行修改。修改的路径同样为笔者Mac上的Xcode路径,使用的SDK是写文章时最新的Xcode9.1 release版本iPhoneOS11.1.sdk,这个可以根据个人的编译器及SDK版本进行修改
CFLAGS=-DDSO_DLFCN -DHAVE_DLFCN_H -DNDEBUG -DOPENSSL_THREADS -DOPENSSL_NO_STATIC_ENGINE -DOPENSSL_PIC -DOPENSSL_BN_ASM_MONT -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DVPAES_ASM -DECP_NISTZ256_ASM -DPOLY1305_ASM -DOPENSSLDIR=""$(OPENSSLDIR)"" -DENGINESDIR=""$(ENGINESDIR)"" -O3 -D_REENTRANT -arch arm64 -mios-version-min=7.0.0 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.1.sdk

  修改完成后保存并退出文件编辑,继续进行编译

$ make

  在这里如果是使用和笔者一样的Xcode9.1 iPhoneOS11.1.sdk环境编译的话,应该也会遇到错误如下:

test/specktest.c:59:3: error: 'system' is unavailable: not available on iOS
system("pause");
^
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.1.sdk/usr/include/stdlib.h:195:6: note:
'system' has been explicitly marked unavailable here
int system(const char *) __DARWIN_ALIAS_C(system);
^
test/specktest.c:65:3: error: 'system' is unavailable: not available on iOS
system("pause");
^
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.1.sdk/usr/include/stdlib.h:195:6: note:
'system' has been explicitly marked unavailable here
int system(const char *) __DARWIN_ALIAS_C(system);
^
2 errors generated.
make[1]: *** [test/specktest.o] Error 1
make: *** [all] Error 2

  这是因为在iOS 11中已经将'system'头文件及其方法禁用,按照报错信息将test/specktest.c中调用注释掉重新编译即可(测试代码不影响)。之后执行安装指令:

$ sudo make install

  至此我们已经完成了GmSSL的编译,但由于iOS应用需要同时兼顾armv7/arm64/x86_64等指令集,所以还需要对源代码进行基于其他指令集的编译(ios-cross对应armv7、ios64-cross对应arm64、darwin-i386-cc对应i386,这里x86_64和i386的编译也可直接按照官方的Linux编译方式)。将对应指令集所需的libssl.a、libcrypto.a提取出来之后,直接删除刚刚编译好的工程文件夹(make clean指令清除不够彻底),即可进行再次编译。编译过程中可能会遇到如下报错:

/bin/sh: /usr/local/share/man/man3/hmac.3: Too many levels of symbolic links
make: *** [install_man_docs] Error 1

  根据提示的路径/usr/local/share将share文件夹删除,重新编译即可。然后将编译出的静态库进行合成,用于iOS平台的GmSSL的编译就完成了

lipo -create libssl_armv7.a libssl_armv7s.a libssl_arm64.a libssl_x86.a -output libssl.a
lipo -info libssl.a
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容