首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用ECDH快速生成共享密钥

使用ECDH快速生成共享密钥
EN

Stack Overflow用户
提问于 2021-10-01 08:18:40
回答 2查看 344关注 0票数 0

我正在试图加密一条消息到服务器。为此,我生成一个公钥和私钥。我将我的公钥发送到服务器并从它接收它的公钥。

代码语言:javascript
复制
func generatePair() {
    if let crypto = GMEllipticCurveCrypto.generateKeyPair(for: GMEllipticCurveSecp256r1) {
        crypto.compressedPublicKey = false
        curveCrypto = crypto
        if let publicKey = crypto.publicKey {
            let pub = Data(publicKey[1...publicKey.count-1])
            self.publicKey = pub.base64EncodedString()
            self.privateKey = crypto.privateKeyBase64
        }
    }
}

收到后,我尝试生成一个共享密钥来加密数据。

代码语言:javascript
复制
func generateSecret(withKey key: String) {
    guard let crypto = curveCrypto else {
        return
    }
    print("generateSecret \(key)")
    sharedKey = crypto.sharedSecret(forPublicKeyBase64: key)
}

但是我得到了一行错误(sharedKey = crypto.sharedSecret(forPublicKeyBase64: key))

*终止应用程序的原因是:“公钥{长度= 64,字节= 0xace3000d e1483ed9 82d88432 9397c716…d64e0fe1 47920d9f }无效”

我的公钥和服务器密钥的长度相同。

我做错什么了?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-10-19 14:15:43

我终于找到了解决办法。

从服务器接收公钥后,我应该这样做:

代码语言:javascript
复制
private func getPublicKey(publicKey: String) -> String? {
    if let publicKeyData = Data(base64Encoded: publicKey) {
        var newKeyData = publicKeyData
        newKeyData.insert(0x04, at: 0)
        if let compressKeyData = curveCrypto?.compressPublicKey(newKeyData) {
            return compressKeyData.base64EncodedString()
        } else {
            print("PUB KEY ERROR: compressKeyData")
            return nil
        }
    } else {
        print("PUB KEY ERROR: b64")
        return nil
    }
}

这个公钥应该用于生成共享密钥。

票数 0
EN

Stack Overflow用户

发布于 2021-10-06 07:44:59

我相信你在用GMEllipticCurveCrypto

此框架在内部使用压缩密钥。这就是为什么它总是失败的原因,因为输入键(65)的长度与压缩键(33)的预期长度不匹配。

注意,函数sharedSecret(forPublicKeyBase64:)将在内部调用sharedSecret(forPublicKey:)。因此,最后的解决方案是在将密钥传递给sharedSecret(forPublicKey:)之前再次压缩它。您可以选择在头文件中公开compressPublicKey函数,或者使用下面的解决方案在.m文件中更新该函数。

原件:

代码语言:javascript
复制
// Prepare the public key
- (NSData*)sharedSecretForPublicKey: (NSData*)otherPublicKey {
    [...]
    uint8_t l_other_public[_bytes + 1];
    if ([otherPublicKey length] != _bytes + 1) {
        [NSException raise:@"Invalid Key" format:@"Public key %@ is invalid", otherPublicKey];
    }
    [...]
}

修正:

代码语言:javascript
复制
- (NSData*)sharedSecretForPublicKey: (NSData*)otherPublicKey {
    NSData* compressedKey = [self compressPublicKey:otherPublicKey];
    [...]
    // Prepare the public key
    uint8_t l_other_public[_bytes + 1];
    if ([compressedKey length] != _bytes + 1) {
        [NSException raise:@"Invalid Key" format:@"Public key %@ is invalid", compressedKey];
    }
    [compressedKey getBytes:&l_other_public length:[compressedKey length]];
    [...]
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69402678

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档