4

iPhone から他の関係者に公開鍵を渡そうとしていますが、iOS からの出力を使用できません。

let parameters: [String: Any] = [
    kSecAttrKeySizeInBits as String: 384,
    kSecAttrKeyType as String: kSecAttrKeyTypeEC,
    kSecPrivateKeyAttrs as String: [
        kSecAttrIsPermanent as String: false
    ]
]

var error: Unmanaged<CFError>?
let privateKey = SecKeyCreateRandomKey(parameters as CFDictionary, &error)
let publicKey = SecKeyCopyPublicKey(privateKey!)

let pub = SecKeyCopyExternalRepresentation(publicKey!, &error)
let pubData = pub as Data?
print(pubData!.base64EncodedString())

出力例:

BJSCZtBatd2BYEHtyLB0qTZNlphKf3ZTGI6Nke3dSxIDpyP9FWMZbG0zcdIXWENyndskfxV0No/yz369ngL2EHZYw6ggNysOnZ5IQSPOLFFl44m1aAk0o0NdaRXTVAz4jQ==

Python(私のセカンドパーティがある場所)には、次のものがあります。

from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import serialization

pub_key = serialisation.load_pem_public_key(
    data=xcode_data.encode(),
    backend=default_backend()
)

私が得るエラーはValueError: Could not deserialize key data.

したがってSecKeyCopyExternalRepresentation、ドキュメントで説明されているように、の出力は正確には何ですか:

このメソッドは、RSA キーの PCKS #1 形式でデータを返します。楕円曲線公開鍵の場合、形式は ANSI X9.63 標準に従い、04 || のバイト文字列を使用します。X || Y. 楕円曲線秘密鍵の場合、出力は、秘密スカラーのビッグ エンディアン エンコーディング、つまり 04 || と連結された公開鍵としてフォーマットされます。X || え || K. これらの表現はすべて、必要に応じて先行ゼロを含め、一定サイズの整数を使用します。

フォーマットをどのように説明しX6.93ますか?そして、それをPythonコードで使用できるものに変換するにはどうすればよいですか?

-----BEGIN PUBLIC KEY-----PS xcode出力などにヘッダーを追加しようとしました。

4

3 に答える 3

1

第三者を利用できない方の為にお答えします。

フォーマットの出力は04 ||です。X || はい [ || K]多くの外部システムが期待する EC ヘッダー識別子なし。他のプラットフォーム用にエクスポートするときに、そのヘッダーを追加する必要があります。次に例を示します。

let fullKeyData = CFDataCreateMutable(kCFAllocatorDefault, CFIndex(0))
if fullKeyData != nil
{
    //Fixed schema header per key size in bits
    //var headerBytes256r1: [UInt8] = [0x30, 0x59, 0x30, 0x13, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x03, 0x01, 0x07, 0x03, 0x42, 0x00] //uncomment if you use 256 bit EC keys
    var header384r1: [UInt8] = [0x30, 0x76, 0x30, 0x10, 0x06, 0x07, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x02, 0x01, 0x06, 0x05, 0x2B, 0x81, 0x04, 0x00, 0x22, 0x03, 0x62, 0x00] //384 bit EC keys
    //var header521r1: [UInt8] = [0x30, 0x81, 0x9B, 0x30, 0x10, 0x06, 0x07, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x02, 0x01, 0x06, 0x05, 0x2B, 0x81, 0x04, 0x00, 0x23, 0x03, 0x81, 0x86, 0x00] // For 521 bit EC keys
    let headerSize = CFIndex(header384r1.count)

    CFDataAppendBytes(fullKeyData, &header384r1, headerSize)
    CFDataAppendBytes(fullKeyData, CFDataGetBytePtr(pub), CFDataGetLength(pub)) //pub = data you got from SecKeyCopyExternalRepresentation

    var pem = ""
    //pem.append("-----BEGIN PUBLIC KEY-----\n") //uncomment if needed
    pem.append((fullKeyData as Data?)?.base64EncodedString() ?? "")
    //pem.append("\n-----END PUBLIC KEY-----\n") //uncomment if needed

    //do something with pem
}
于 2020-04-24T17:34:03.783 に答える