carthage编译的gmobjc动态度里面的引用可以单独引用用其自身的openssl
Closed this issue · 14 comments
同一个APP中兼容不同版本的库就是比较麻烦。这样操作可以让两个不同版本的 OpenSSL 共存,互不影响:
- 先下载最新 GMObjC 主工程解压并命名为GMObjC,删除
GMObjC/XCFrameworks/openssl.xcframework
动态库; - 下载 GMOpenSSL 的最后一个静态库版本GMOpenSSL-V2.2.9;
- 解压GMOpenSSL-2.2.9.zip文件,找到
GMOpenSSL-2.2.9/GMFrameworks/openssl.xcframework
,将openssl.xcframework
静态库拖动到 GMObjC 主工程的GMObjC/XCFrameworks/
文件夹下; - 打开终端
cd /xxx/GMObjC
切换到GMObjC 文件夹下,执行carthage build --no-skip-current --use-xcframeworks
编译; - 编译完成得到
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 等
劳烦大神闲余时间,帮忙看看,公钥,私钥 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解不出来了,这是不是加密的过程中还是缺少问么造成的
- OpenSSL 加解密默认都是 ASN1 编码格式,解码为 C1C3C2,是为了其他平台方便;
- 客户端解密,后端传过来的如果不是 ASN1,必须先转码为 ASN1 格式再进行解密;
- Java端解密,如果 Java 端可以直接解密 ASN1 结果,你不解码,把enResult1丢给后台就可以了;
- Java端解密,如果 Java 端需要 C1C3C2 格式,你转码给他就行,协商一致即可,注意Java端可能需要前缀04;
- 客户端和Java端都可以用在线网站相互验证,例如https://the-x.cn/cryptography/Sm2.aspx,协商一致就没问题了。
点在大神!谢谢不吝赐教,问题解决了