Предположим, я создаю пару ключей x25519 с помощью openssl, она выводит 64-байтовый закрытый ключ и соответствующий 44-байтовый открытый ключ, закодированный в Base64, который будет выглядеть так:
-----BEGIN PRIVATE KEY-----
MC4CAQAwBQYDK2VuBCIEIMBF8S7zUco4bRrMiIuyTcSYU/rAVlNtE8SMYWphUatw
-----END PRIVATE KEY-----
-----BEGIN PUBLIC KEY-----
MCowBQYDK2VuAyEAE0eiiP0PKjy9AVM/0z2ZIZn453WSJNemrQ58HAXDaX0=
-----END PUBLIC KEY-----
Swift CryptoKit принимает только 32 байта для каждой инициализации закрытого и открытого ключа.
Если я правильно понял, закрытый ключ размером 64 байта является начальным числом, где первые 32 байта являются фактическим закрытым ключом.
Тем не менее, использование того же принципа для открытого ключа не работает (не очень удивительно)
Теперь возникает вопрос: как преобразовать открытый ключ в 32 байта, необходимых для Swift CryptoKit?
Вот неработающий пример использования первых 32 байт декодированного открытого ключа base64.
let base64PublicKey = Data(base64Encoded: "MCowBQYDK2VuAyEAE0eiiP0PKjy9AVM/0z2ZIZn453WSJNemrQ58HAXDaX0=")!.dropLast(12)
let publicKey = try! Curve25519.KeyAgreement.PublicKey(rawRepresentation: rawPublicKey)