Как я могу использовать обмен ключами Diff ie -Hellman для шифрования и дешифрования сообщений?
Я могу генерировать общие ключи (как для Боба, так и для Алисы), но SecKeyCopyKeyExchangeResult
возвращает меня данных ... как я могу заставить SecKey использовать с SecKeyCreateDecryptedData
и SecKeyCreateEncryptedData
?
Так что я думаю, что мне следует каким-то образом извлечь SecKey из общих данных, чтобы я мог сделать симметричное шифрование / дешифрование.
Код на данный момент:
let bob_shared_secret: NSData = generateSharedKey_ecdh(publicKey: alicePublicKey, privateKey: bobPrivateKey)!
let alice_shared_secret: NSData = generateSharedKey_ecdh(publicKey: bobPublicKey, privateKey: alicePrivateKey)!
print("equals? \(bob_shared_secret == alice_shared_secret)!") //true
let clearText = "Hello From Alice"
let algorithm: SecKeyAlgorithm = .eciesEncryptionCofactorVariableIVX963SHA256AESGCM
let cipherTextData: Data? = SecKeyCreateEncryptedData(alicePublicKey, algorithm,
clearTextData as CFData,
&error) as Data?
let clearTextData = SecKeyCreateDecryptedData(???? as SecKey, //what to put here??
algorithm,
cipherTextData as CFData,
&error) as Data?
private func generateSharedKey_ecdh(publicKey: SecKey, privateKey: SecKey) -> NSData?
{
var error: Unmanaged<CFError>?
let keyPairAttr:[String : Any] = [
kSecAttrKeySizeInBits as String: 256, //retro compatibility
kSecAttrKeyType as String: kSecAttrKeyTypeECSECPrimeRandom, //Elliptic curve algorithm.
kSecPrivateKeyAttrs as String: [kSecAttrIsPermanent as String: false],
kSecPublicKeyAttrs as String:[kSecAttrIsPermanent as String: false],
SecKeyKeyExchangeParameter.requestedSize.rawValue as String: 256
]
let algorithm:SecKeyAlgorithm = SecKeyAlgorithm.ecdhKeyExchangeStandardX963SHA256
let shared:CFData? = SecKeyCopyKeyExchangeResult(privateKey, algorithm, publicKey, keyPairAttr as CFDictionary, &error)
return shared
}
Генерация пары ключей ... пара ключей Это класс, который я создал, чтобы содержать ключи
class KeyPair {
var publicKey: SecKey
var privateKey: SecKey
init(publicKey: SecKey, privateKey: SecKey) {
self.publicKey = publicKey
self.privateKey = privateKey
}
}
private func generateKeyPair() -> KeyPair? {
let attributes: [String: Any] = [kSecAttrKeySizeInBits as String: 256,
kSecAttrKeyType as String: kSecAttrKeyTypeECSECPrimeRandom,
kSecPrivateKeyAttrs as String: [kSecAttrIsPermanent as String: false],
kSecPublicKeyAttrs as String:[kSecAttrIsPermanent as String: false]]
var error: Unmanaged<CFError>?
if let privateKey = SecKeyCreateRandomKey(attributes as CFDictionary, &error),
let publicKey = SecKeyCopyPublicKey(privateKey){
return KeyPair(publicKey: publicKey, privateKey: privateKey)
}
return nil
}