Другой общий секрет, полученный при попытке реализовать обмен ключами Диффи-Хеллмана между Swift и C#.C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Другой общий секрет, полученный при попытке реализовать обмен ключами Диффи-Хеллмана между Swift и C#.

Сообщение Anonymous »

Я пытаюсь заставить обмен ключами Диффи Хеллмана работать между моим приложением iOS (swift) и моим веб-сервером ASP.NET 8 Core, но несмотря на все, что я пробовал до сих пор, общие секреты, полученные на каждой платформе, по-прежнему различны.
Что я пробовал:
  • Убедился, что открытый ключ отправляется с iOS соответствие приложения и веб-сервера при получении и обработке.
  • Также убедитесь, что открытый ключ, отправленный с веб-сервера в приложение iOS, совпадает при получении и обработке.
  • (Может быть неправильно), но я убедился, что форматы ключей совпадают. одинаково в обеих средах.
Мой рабочий процесс описан ниже:
  • Приложение iOS генерирует новую пару ключей и отправляет ее открытый ключ веб-сервер
  • Веб-сервер получает общий секрет и отправляет обратно свой открытый ключ приложению.
  • Приложение iOS затем получает общий секрет, используя серверный pkИ эти производные общие секреты не совпадают
Swift-код (использует CryptoKit и в настоящее время протестирован на iOS 17.6+):

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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»