Cra*_*0ek 4 python cryptography public-key swift public-key-exchange
我试图将公钥从我的 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())
Run Code Online (Sandbox Code Playgroud)
示例输出:
BJSCZtBatd2BYEHtyLB0qTZNlphKf3ZTGI6Nke3dSxIDpyP9FWMZbG0zcdIXWENyndskfxV0No/yz369ngL2EHZYw6ggNysOnZ5IQSPOLFFl44m1aARXQ==TVAzjda
在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()
)
Run Code Online (Sandbox Code Playgroud)
我得到的错误是 ValueError: Could not deserialize key data.
那么SecKeyCopyExternalRepresentation文档所描述的输出究竟是什么:
该方法以 PCKS #1 格式返回 RSA 密钥的数据。对于椭圆曲线公钥,格式遵循ANSI X9.63标准,使用字节串04 || X|| Y. 对于椭圆曲线私钥,输出格式为公钥与秘密标量的大端编码连接,或 04 || X|| 是|| K. 所有这些表示都使用固定大小的整数,根据需要包括前导零。
人们将如何描述这种X6.93格式?我将如何将它转换为我可以在 python 代码中使用的东西?
PS 我曾尝试将标头添加-----BEGIN PUBLIC KEY-----到 xcode 输出中。
我还没有完全找到问题的答案,因为我仍然不知道 Apple 提供的输出究竟是什么,但是,我想出了在这个关键的导入导出管理器中找到的解决方案。
let parameters: [String: Any] = [
kSecAttrKeySizeInBits as String: 384,
kSecAttrKeyType as String: kSecAttrKeyTypeEC,
kSecPrivateKeyAttrs as String: [
kSecAttrIsPermanent as String: false
]
]
var pubKey: SecKey?
var priKey: SecKey?
var error: Unmanaged<CFError>?
let keyPair = SecKeyGeneratePair(parameters as CFDictionary, &pubKey, &priKey)
let publicKeyData = SecKeyCopyExternalRepresentation(pubKey!, &error)
// Code from the library
let ieManager = CryptoExportImportManager()
if let exportPEM = ieManager.exportPublicKeyToPEM(publicKeyData as Data!, keyType: kSecAttrKeyTypeEC as String, keySize: 384) {
print(exportPEM)
} else {
print("Error exporting to PEM")
}
Run Code Online (Sandbox Code Playgroud)
示例输出:
Exporting EC raw key: 97 bytes -----BEGIN PUBLIC KEY----- MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEFpCnTrJFQq0mZBvy+vzl9noKLZ4/s1cf I6hygug6s8dvBreMhabAcAbbhSa1losjCxV450nq92W9ZymonYasaAuhshDWjmvx 2qTXHEpVEVb9GawqX6XqpWtIBf+meHKS -----END PUBLIC KEY-----
使用密码学在python中实现
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import serialization
xcode = '-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEFpCnTrJFQq0mZBvy+vzl9noKLZ4/s1cf\nI6hygug6s8dvBreMhabAcAbbhSa1losjCxV450nq92W9ZymonYasaAuhshDWjmvx2\nqTXHEpVEVb9GawqX6XqpWtIBf+meHKS\n-----END PUBLIC KEY-----'
pub_key = serialization.load_pem_public_key(xcode.encode(), default_backend())
xcode
Run Code Online (Sandbox Code Playgroud)
输出以下内容:
<cryptography.hazmat.backends.openssl.ec._EllipticCurvePublicKey object at 0x7fb4f6f50e10>
请注意,您必须自己在 python 中添加新行才能使这一切正常工作。
更新
SecKeyCopyExternalRepresentationECC 密钥的输出是密钥的 X9.62 或 X9.63 格式(未压缩形式)。这与 DER 和 PEM 编码非常不同。
编码04 || X || Y用于公钥和04 || X || Y || K私钥。04是此格式的固定字节。的X,Y和任选K值是定义该键的曲线点或坐标。更多关于这里的信息。
| 归档时间: |
|
| 查看次数: |
2576 次 |
| 最近记录: |