muzipiao/GMObjC

carthage编译的gmobjc动态度里面的引用可以单独引用用其自身的openssl

Closed this issue · 14 comments

image 目前的报错,sm2_plaintext_size 找不到,是因为引用了项目自身使用的低版本了,因为该项目是RN项目,自身集成了openssl,无法移出及对其升级
image 当前默认集成的openssl库的版本
image 怎么能够使他们两个共存,不至于引发冲突呢

同一个APP中兼容不同版本的库就是比较麻烦。这样操作可以让两个不同版本的 OpenSSL 共存,互不影响:

  1. 先下载最新 GMObjC 主工程解压并命名为GMObjC,删除GMObjC/XCFrameworks/openssl.xcframework动态库;
  2. 下载 GMOpenSSL 的最后一个静态库版本GMOpenSSL-V2.2.9
  3. 解压GMOpenSSL-2.2.9.zip文件,找到GMOpenSSL-2.2.9/GMFrameworks/openssl.xcframework,将openssl.xcframework静态库拖动到 GMObjC 主工程的GMObjC/XCFrameworks/文件夹下;
  4. 打开终端cd /xxx/GMObjC切换到GMObjC 文件夹下,执行carthage build --no-skip-current --use-xcframeworks编译;
  5. 编译完成得到GMObjC/Carthage/Build/GMObjC.xcframework,将GMObjC.xcframework拖入项目使用即可。

原理是直接 Link 静态库 OpenSSL 到动态库 GMObjC 中,动态库 GMObjC 内部会使用自己 Link 的 OpenSSL。

感谢大神,兼容的问题完美解决了,现在还有一个问题就是,Java端的加解密 在IOS端无法使用了,不知道哪个地方需要修改下,使用Java解析的SM2https://github.com/AllenDengMs/sm2_encrypt/blob/main/src/main/java/demo/Sm2Tool.java,IOS加密的 JAVa 也解析不出来,后端使用的 公私钥private: 42219fa13ad160367c3d4a9c6b7e793ce22c118348f1f33cea86fd7be211a318
publick: 04c4558b8abd74587b9a1688bac4c849d644b7e3d8d4801e7757688dde3d06e0d33d75d44944a56e112e547a7a488b149231773434579a249477bac94d04caf3a1

看Readme文档,ASN1 编码解码、公钥或者密文04开头、椭圆曲线是不是 NID_SM2 等

image 椭圆曲线是 NID_SM2,公钥带04 ,密文不带,ASN1 编码解码,由于对IOS不是很懂,所以这块搞不明白,

劳烦大神闲余时间,帮忙看看,公钥,私钥 private: 42219fa13ad160367c3d4a9c6b7e793ce22c118348f1f33cea86fd7be211a318
publick: 04c4558b8abd74587b9a1688bac4c849d644b7e3d8d4801e7757688dde3d06e0d33d75d44944a56e112e547a7a488b149231773434579a249477bac94d04caf3a1
感激涕零不尽

java端 加密 String encryptString = Sm2Tool.encrypt(data,publicKey);
解密 String encryptString = Sm2Tool.decrypt(data,privateKey);
data 是明文字符串

  • (void)testSM2
    {
    // 明文字符串
    NSString *text = @"F679AC7F123EF17C";

    NSString *enResult = @"c1f44448cf7e1243cbdf99d5157abf1576c7fc1596603c9e32074c0b2e6995156b0c912f8f1951bdb0450f8f0732506ee77c076558fd9815a8ab216b62533285060e8095125b57abccde384c5b88b300bad7829647597f4fc3ae70107efb07075a2be93352c2934ace9f43d68df29aa7";
    NSString *publickey = @"044b2eda9117b92cf236c9576bfb5fcdabbf028d60d129f944ec56965b465009a414f17f4ae1f01f1a416497ad517fdcc1456155d98fbb3f1f3012d3e534d8ffcc";
    NSString *privatekey = @"8d9976e3691dbc25ed7f5933aa926ee410ac75b1cf03a0e8ab41d57a45f38ec7";
    NSString *asn1Result = [GMSm2Utils asn1EncodeWithC1C3C2:enResult];
    NSString *deResult1 = [GMSm2Utils decryptToText:asn1Result privateKey:privatekey];
    NSLog(@"========== GW deResult1:%@", deResult1);
    }刚才经过测试发现,JAVA加密的结果需要先转ASN1,然后在decryptToText,这样就互通了,IOS的解出来了,那么如果加密的话是不是要将顺序反过来,即现encrypt,然后转ASN1,最后ASN1转C1C3C2 就是java需要的加密串了

iOS端加密过程我现在改成

NSString *enResult1 = [GMSm2Utils encryptText:plaintext publicKey:pubKey];
NSString *c1c3c2Result1 = [GMSm2Utils asn1DecodeToC1C3C2:enResult1]; // 解码为 c1c3c2字符串

是否正确,这样写以后JAVA还是解不出来,不知道为啥,这样生成的C1C3C2字符串字母都是大写,javaSm2Tool.encrypt返回的是小写,不是很明白JAVA加密的IOS可以解出来,现在IOS加密的,JAVA解不出来了,这是不是加密的过程中还是缺少问么造成的

  1. OpenSSL 加解密默认都是 ASN1 编码格式,解码为 C1C3C2,是为了其他平台方便;
  2. 客户端解密,后端传过来的如果不是 ASN1,必须先转码为 ASN1 格式再进行解密;
  3. Java端解密,如果 Java 端可以直接解密 ASN1 结果,你不解码,把enResult1丢给后台就可以了;
  4. Java端解密,如果 Java 端需要 C1C3C2 格式,你转码给他就行,协商一致即可,注意Java端可能需要前缀04;
  5. 客户端和Java端都可以用在线网站相互验证,例如https://the-x.cn/cryptography/Sm2.aspx,协商一致就没问题了。

点在大神!谢谢不吝赐教,问题解决了