当前位置:   article > 正文

再看iOS如何使用SM2/SM3/SM4/SM9 方法二:使用http://gmssl.org这个开源密码箱来实现从编译到使用

ios如何使用sm2/sm3/sm4/sm9

当时要是知道有下面这个网站,之前也不用那么辛苦了

网上流传的c语言国密核心算法好像至少两种,两种一起使用的话还会出现问题。所以如果某个功能已经有sm算法了,可以直接使用(可以让其提供调用方法名称,或hopper自己看)。

之前写的是一种方法。

今天再看看这个。

编译与安装中含有 编译iPhone OS目标文件 的代码

  1. export CC=clang
  2. export CROSS_TOP=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer
  3. export CROSS_SDK=iPhoneOS.sdk
  4. export PATH="/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin:$PATH"
  5. ./Configure ios64-cross no-shared --prefix=/usr/local/openssl-ios64
  6. make

步骤1 先下载源码GitHub - guanzhi/GmSSL: 支持国密SM2/SM3/SM4/SM9/ZUC/SSL的OpenSSL分支

步骤2.命令行cd到代码解压后的目录,输入上面的编译代码

然后出现了问题 

  1. Undefined symbols for architecture arm64:
  2. "_EC_GFp_sm2z256_method", referenced from:
  3. _curve_list in libcrypto.a(ec_curve.o)
  4. ld: symbol(s) not found for architecture arm64
  5. clang: error: linker command failed with exit code 1 (use -v to see invocation)
  6. make[2]: *** [link_app.] Error 1
  7. make[1]: *** [apps/gmssl] Error 2
  8. make: *** [all] Error 2
  9. yyy@YYY GmSSL-master %

这里有解决办法x86_64环境下生成arm64库失败的问题 · Issue #710 · guanzhi/GmSSL · GitHub

  1. 摘抄
  2. 方法1
  3. ./Configure 时 加上 no-asm
  4. 方法2
  5. ./Configure后, 打开Makefile,找到CFLAGS,加上-DGMSSL_NO_TURBO
  6. 其实,这个问题,打开源代码找一下_EC_GFp_sm2z256_method在哪调用,很快就明白了。

方法1就是将代码改成这个  ./Configure ios64-cross no-asm no-shared   --prefix=/usr/local/openssl-ios64  

  1. yyy@YYY GmSSL-master % ./Configure ios64-cross no-shared  no-asm --prefix=/usr/local/openssl-ios64  
  2. Configuring GmSSL version 2.5.4 (0x1010004fL)
  3. target already defined - ios64-cross (offending arg:  no-asm)

报错。

试试方法2 

步骤3 成功

可是编译成的文件在哪

参考 文章正在审核中... - 简书 如何合并静态库

步骤4

sudo make install

然后这两个就是

头文件好像是 include文件夹

如何使用呢

新建工程 ,导入,

添加测试代码

测试代码在下载的源码目录下  /GmSSL-master/test/sm2test.c  和 sm2_lcl.h

自己建一个sm2test.h

编译报错

参考 《ios 如何导入openssl库 解决 'openssl/bn.h' file not found》ios 如何导入openssl库 解决 'openssl/bn.h' file not found - 简书

再解决一些小的引用问题后运行成功

以sm2p256test为例,把加密方法拆出来

  1. //加密
  2. static int yyy_sm2_en(const EC_GROUP *group, const EVP_MD *md,const char *xP, const char *yP, const char *M, const char *k, char **CCCC){
  3. int ret = 0;
  4. EC_KEY *pub_key = NULL;
  5. EC_KEY *pri_key = NULL;
  6. SM2CiphertextValue *cv = NULL;
  7. unsigned char *tbuf = NULL;
  8. long tlen;
  9. unsigned char mbuf[128] = {0};
  10. unsigned char cbuf[sizeof(mbuf) + 256] = {0};
  11. size_t mlen, clen;
  12. unsigned char *p;
  13. if (!(pub_key = new_ec_key(group, NULL, xP, yP))) {
  14. goto end;
  15. }
  16. change_rand(k);
  17. if (!(cv = SM2_do_encrypt(md, (unsigned char *)M, strlen(M), pub_key))) {
  18. goto end;
  19. }
  20. p = cbuf;
  21. if ((clen = i2o_SM2CiphertextValue(group, cv, &p)) <= 0) {
  22. goto end;
  23. }
  24. NSLog(@"密文是%@ ",[NSData dataWithBytes:cbuf length:clen ] );
  25. end:
  26. ERR_print_errors_fp(stderr);
  27. restore_rand();
  28. EC_KEY_free(pub_key);
  29. EC_KEY_free(pri_key);
  30. SM2CiphertextValue_free(cv);
  31. OPENSSL_free(tbuf);
  32. return ret;
  33. }

调用方法

  1. yyy_sm2_en(sm2p256test, EVP_sm3(), "435B39CCA8F3B508C1488AFC67BE491A0F7BA07E581A0E4849A5CF70628A7E0A",
  2. "75DDBA78F15FEECB4C7895E2C1CDF5FE01DEBB2CDBADF45399CCF77BBA076A42",
  3. "encryption standard",
  4. "4C62EEFD6ECFC2B95B92FD6C3D9575148AFA17425546D49018E5388D49DD7B4F", &c_c);

打印结果

2020-08-06 15:48:17.949882+0800 sm[3006:514579] 密文是{length = 116, bytes = 0x04245c26 fb68b1dd ddb12c4b 6bf9f2b6 ... 285e0748 0653426d } 

示例代码

https://download.csdn.net/download/qq_15509071/33471425

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/139593?site
推荐阅读
相关标签
  

闽ICP备14008679号