GitHub找的各种轮子,就是跟后台无法协商秘钥。就很nice。后台说:安卓都调通了,iOS怎么不行。 … 那就找出不行的原因。
核心:Java默认使用的jdk的加密对象生成的公钥 是有一个固定开头信息,iOS 生成的没有需要自己手动拼开头信息。
开头信息:标准 ASN.1 OID 的标头 着重参考:https://developer.apple.com/forums/thread/8030?page=2 官方问答
只需要头部固定拼接26 byte信息(官方问答那篇文章也有提到)
其他: 1.iOS用的ECDH的轮子https://github.com/ricmoo/GMEllipticCurveCrypto/。 楼主由于项目需要不适用官方common库(另外官方的还需要存keychain再从内存读,)。 2.官方的小哥写的demo(swift)https://github.com/hfossli/EskimoKeys/tree/master。
还有问题,多看几遍https://developer.apple.com/forums/thread/8030?page=2 官方问答 。
iOS用轮子GMEllipticCurveCrypto里的publicKeyBase64方法被改成下面的样子 生成的数据和后台就可以通信。
-(NSString*)publicKeyBase64
{
// return [self.publicKey base64EncodedStringWithOptions:0];
// NSString*str = base64StringFromData(self.publicKey);
// return str;
NSMutableData *pubData = [NSMutableData dataWithData:self.publicKey];
Byte byte[] = {
0x30,0x59,0x30,0x13,0x06,0x07,0x2a,0x86,0x48,0xce,0x3d,0x02,0x01,0x06,0x08,0x2a,
0x86,0x48,0xce,0x3d,0x03,0x01,0x07,0x03,0x42,0x00
};
NSMutableData *headerData = [NSMutableData dataWithBytes:byte length:sizeof(byte)];
[headerData appendData:pubData];
NSString*str = base64StringFromData(headerData);
return str;
}
解决问题看的一些文章: 链接: 密钥交换(密钥协商)算法及其原理 链接: 使用ECDH的一些感慨 链接: OpenSSL ECC 算法 链接: 国密SM2算法的GitHub 这个轮子设置kDefaultEllipticCurveType = NID_sm2是国密的。里面的OpenSSL有比特币用的加密类型"NID_secp256k1",没看到有 “NID_secp256r1” 。为什么没有?难道secp256r1 是默认的 ”NID_undef“那个? 还是别的原因。有知道的人还请帮忙解答一下。
链接: iOS 中的椭圆曲线加密 链接:官方问答2 椭圆曲线密码术 链接:官方问答3(官方竟然被diss了) ECDH 共享密钥不匹配. 链接: ECC算法推荐参数(256k1和256r1) 因为iOS的轮子里有声明secp256r1(对应curve25519)用的”点“信息。我在这里怀疑跟大小端序有关,验证确认 没关系。
链接: 非对称加密以及使用secp256k1进行数字签名(ECDSA) 这里去看Java后台初始化设置的参数 secp256r1。我们后台只设置 ”EC“ & “256” 两个参数我让他们改成博客里的样式。验证确认 EC&256 对等 secp256r1
链接: ECC椭圆曲线加密算法:介绍 如果你更有兴趣看看这个文章,当初没学好的数学知识 总需要还回来。以后我孩子就选数学专业了。
链接: 一个简单的轮子sever&client
|