iOS ECDH协商秘钥和Java后台通信

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

后台协商秘钥可以了。下一步是客户端协商秘钥

从后台渠道的公钥需要处理

//因为后台给我的公钥是91位,依旧有一个固定开头,所以把前面的截掉。
NSData *serverPublicCData = [serverPublicCKeyData subdataWithRange:NSMakeRange(27, serverPublicCKeyData.length-27)];
//再补一个0x04 表示未压缩
Byte byte[] = {0x04};
NSMutableData *headerData = [NSMutableData dataWithBytes:byte length:sizeof(byte)];
[headerData appendData:serverPublicCData];

最终:headerData 是轮子需要用的33位公钥。1位 0x04 + 32位公钥内容。

解密的出来的数据,gzip解压 又tm失败了。我继续看…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值