Что я пробовал:
- Убедился, что открытый ключ отправляется с iOS соответствие приложения и веб-сервера при получении и обработке.
- Также убедитесь, что открытый ключ, отправленный с веб-сервера в приложение iOS, совпадает при получении и обработке.
- (Может быть неправильно), но я убедился, что форматы ключей совпадают. одинаково в обеих средах.
- Приложение iOS генерирует новую пару ключей и отправляет ее открытый ключ веб-сервер
- Веб-сервер получает общий секрет и отправляет обратно свой открытый ключ приложению.
- Приложение iOS затем получает общий секрет, используя серверный pkИ эти производные общие секреты не совпадают
class HandshakeHelper
{
// CreateKeyPairs: Generates a private-public key pair
static func createKeyPairs() -> [String]
{
let privateKey = P256.KeyAgreement.PrivateKey()
let privateKeyBase64 = privateKey.derRepresentation.base64EncodedString()
let publicKeyBase64 = privateKey.publicKey.derRepresentation.base64EncodedString() // DER-encoded (X.509 format)
return [privateKeyBase64, publicKeyBase64]
}
// DeriveSharedSecret: Derives a shared secret using our private key and the other party's public key
static func deriveSharedSecret(ourPrivateKeyBase64: String, receivedPublicKeyBase64: String) -> String?
{
guard let privateKeyData = Data(base64Encoded: ourPrivateKeyBase64),
let receivedPublicKeyData = Data(base64Encoded: receivedPublicKeyBase64) else
{
print("Invalid key data")
return nil
}
do
{
// Reconstruct our private key and the received public key
let privateKey = try P256.KeyAgreement.PrivateKey(derRepresentation: privateKeyData)
let receivedPublicKey = try P256.KeyAgreement.PublicKey(derRepresentation: receivedPublicKeyData) // DER-encoded
// Derive the shared secret
let sharedSecret = try privateKey.sharedSecretFromKeyAgreement(with: receivedPublicKey)
// Return the shared secret as a base64 string
return sharedSecret.withUnsafeBytes { Data($0).base64EncodedString() }
} catch
{
print("Error deriving shared secret: \(error)")
return nil
}
}
}
Код .NET 8 (использует System.Security.Cryptography):
public class HandshakeHelper
{
// CreateKeyPairs: Generates a private-public key pair
public static List CreateKeyPairs()
{
using var ecdh = ECDiffieHellman.Create(ECCurve.NamedCurves.nistP256);
var privateKey = Convert.ToBase64String(ecdh.ExportECPrivateKey()); // PKCS#8 format
var publicKey = Convert.ToBase64String(ecdh.ExportSubjectPublicKeyInfo()); // X.509 format
File.WriteAllText("ecdh_priv.key", privateKey);
File.WriteAllText("ecdh_pub.key", publicKey);
return new List { privateKey, publicKey };
}
// DeriveSharedSecret: Derives a shared secret using our private key and the other party's public key
public static string DeriveSharedSecret(string ourPrivateKeyBase64, string receivedPublicKeyBase64)
{
var privateKeyBytes = Convert.FromBase64String(ourPrivateKeyBase64);
var receivedPublicKeyBytes = Convert.FromBase64String(receivedPublicKeyBase64);
using var ecdh = ECDiffieHellman.Create(ECCurve.NamedCurves.nistP256);
ecdh.ImportECPrivateKey(privateKeyBytes, out _); // Import our private key
using var receivedPublicKey = ECDiffieHellman.Create();
receivedPublicKey.ImportSubjectPublicKeyInfo(receivedPublicKeyBytes, out _); // Import the received public key
// Derive the shared secret
var sharedSecret = ecdh.DeriveKeyMaterial(receivedPublicKey.PublicKey);
return Convert.ToBase64String(sharedSecret); // Return shared secret in Base64 format
}
}
Подробнее здесь: https://stackoverflow.com/questions/793 ... n-key-exch