iOS Elliptic curve cryptography (ECC)

kSecAttrTokenIDSecureEnclave

https://developer.apple.com/documentation/security/ksecattrtokenidsecureenclave
Secure Enclave 支持的唯一钥匙串项是 256 位椭圆曲线私钥(密钥类型为 kSecAttrKeyTypeEC 的私钥)。 此类密钥必须使用 SecKeyGeneratePair(::_:) 函数直接在 Secure Enclave 上生成,并将参数字典中的 kSecAttrTokenID 密钥设置为 kSecAttrTokenIDSecureEnclave。

  • 无法将预先存在的密钥导入 Secure Enclave。
  • 无法导出使用 kSecAttrTokenIDSecureEnclave 生成的 Private Key。

Secure Enclave

https://support.apple.com/en-ng/guide/security/sec59b0b31ff/web
Secure Enclave 是集成到 Apple 系统 (SoC) 芯片 中的专用安全子系统。 Secure Enclave 与主处理器隔离,以提供额外的安全层,即使在应用处理器内核受到威胁时也能确保敏感用户数据的安全。 它遵循与 SoC 相同的设计原则——用于建立硬件信任根的引导 ROM、用于高效和安全加密操作的 AES 引擎以及受保护的内存。 虽然 Secure Enclave 不包括存储,但它有一种机制可以将信息安全地存储在附加存储上,该存储与应用处理器和操作系统使用的 NAND 闪存分开。

kSecAttrKeyTypeECSECPrimeRandom

SecKeyCopyExternalRepresentation(::)

# OC:
CFDataRef _Nullable SecKeyCopyExternalRepresentation(SecKeyRef key, CFErrorRef *error)
API_AVAILABLE(macos(10.12), ios(10.0), tvos(10.0), watchos(3.0));

# Swift:
func SecKeyCopyExternalRepresentation(
    _ key: SecKey,
    _ error: UnsafeMutablePointer?>?
) -> CFData?

导出密钥的格式取决于密钥的类型:
* kSecAttrKeyTypeRSA PKCS#1 format
* kSecAttrKeyTypeECSECPrimeRandom ANSI X9.63 format (04 || X || Y [ || K])

按格式导出 Public Key: https://github.com/DigitalLeaves/CryptoExportImportManager
or:

func createSubjectPublicKeyInfo(rawPublicKeyData: Data) -> Data {
    let secp256r1Header = Data(bytes: [
        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
        ])
    return secp256r1Header + rawPublicKeyData
}

// Usage
let rawPublicKeyData = SecKeyCopyExternalRepresentation(...)!
let publicKeyDER = createSubjectPublicKeyInfo(rawPublicKeyData: rawPublicKeyData)
write(publicKeyDER, to: "public_key.der")

// Test with OpenSSL
// openssl ec -pubin -in public_key.der -text -inform der

Python 接收 SecKeyCopyExternalRepresentation 导出的 Public Key Base64:

$ pip install cryptography

import base64
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import ec

remote_key_base64_str = "" # input your own public key base64 str
remote_key_bytes = base64.b64decode(remote_key_base64_str) # to byts
remote_public_key = ec.EllipticCurvePublicKey.from_encoded_point(curve=ec.SECP256R1(),data=remote_key_bytes)
print(remote_public_key)

kSecKeyAlgorithmECDSASignatureMessageX962SHA256

ECDSA 算法,签名采用 DER x9.62 编码,SHA-256 摘要由调用的函数从任意大小的输入数据自动生成。

Python 接收 kSecKeyAlgorithmECDSASignatureMessageX962SHA256 签名 Base64:

original_str = "测试签名"
remote_sign_base64_str = "" # 换为自己的签名

remote_sign_bytes = base64.b64decode(remote_sign_base64_str) # to bytes

# if verify error, will throw an exception
remote_verify_Result = remote_public_key.verify(signature=remote_sign_bytes, 
                                                data=original_str.encode('utf-8'),
                                                signature_algorithm=ec.ECDSA(hashes.SHA256()))  

ANSI (American National Standards Institute)

ANSI(美国国家标准协会)是支持美国技术标准发展的主要组织。 ANSI 与行业团体合作,是国际标准化组织 (ISO) 和国际电工委员会 (IEC) 的美国成员。

ANSI 负责监督几个历史悠久的计算机标准的工作,包括美国信息交换标准代码 (ASCII) 和小型计算机系统接口 (SCSI)。

HTTPS 证书

HTTPS 证书是一种文件。其内容遵循 RFC 5280 定义的格式。这些定义以 ASN.1 表示

ASN.1 Abstract Syntax Notation One,缩写为 ASN.1

是一种描述抽象类型和值的符号。一种用于定义文件格式或(等效)数据结构的语言。
例如,在 C 中你可以这样写:

struct point {
  int x, y;
  char label[10];
};

在 Go 中你会写:

type point struct {
  x, y int
  label string
}

在 ASN.1 中你会写:

Point ::= SEQUENCE {
  x INTEGER,
  y INTEGER,
  label UTF8String
}

BER, Basic Encoding Rules 基本编码规则

BER 描述了如何将每个 ASN.1 类型的值表示或编码为八位八位字节的字符串

DER,Distinguished Encoding Rules 可分辨编码规则

ASN.1 的可分辨编码规则,缩写为 DER,是 BER 的一个子集,并给出了一种将任何 ASN.1 值表示为八位字节字符串的方法。DER 适用于需要唯一八位字节字符串编码的应用程序,例如在 ASN.1 值上计算数字签名时的情况。DER 在 X.509 的第 8.7 节中定义。

ASN.1 的主要序列化格式是“可分辨编码规则”(DER)。它们是添加了规范化的“基本编码规则”(BER) 的变体。例如,如果类型包含 SET OF,则必须对成员进行排序以进行 DER 序列化。

PEM

以 DER 表示的证书通常会进一步编码为 PEM,它使用 base64 将任意字节编码为字母数字字符(以及“+”和“/”)并添加分隔线(“-----BEGIN CERTIFICATE----- " 和 “-----END CERTIFICATE-----")。PEM 很有用,因为它更容易复制粘贴。

ANSI X9.62

ANSI X9.62-2005: Public Key Cryptography for the Financial Services Industry, The Elliptic Curve Digital Signature Standard (ECDSA)
ANSI X9.62-2005:金融服务行业的公钥密码学,椭圆曲线数字签名标准( ECDSA )(未在线提供)。

ANSI X9.62-2005 是由金融服务认可标准委员会 X9为美国国家标准协会开发的。ANSI X9.62 定义了使用椭圆曲线数字签名算法 (ECDSA)生成和验证数字签名的方法。生成和验证数字签名期间使用的域参数的生成规范也包含在 ANSI X9.62 中。ECDSA 是DSA的椭圆曲线模拟。

ANSI X9.63

ANSI X9.63-2011 (R2017) Public Key Cryptography For The Financial Services Industry - Key Agreement And Key Transport Using Elliptic Curve Cryptography
金融服务行业的公钥密码学 - 使用椭圆曲线密码学的密钥协议和密钥传输

X.509

X.509是密码学里公钥证书的格式标准。X.509证书已应用在包括TLS/SSL在内的众多网络协议里,同时它也用在很多非在线应用场景里,比如电子签名服务。X.509证书里含有公钥、身份信息(比如网络主机名,组织的名称或个体名称等)和签名信息(可以是证书签发机构CA的签名,也可以是自签名)。

X.509还附带了证书吊销列表和用于从最终对证书进行签名的证书签发机构直到最终可信点为止的证书合法性验证算法。X.509是ITU-T标准化部门基于他们之前的ASN.1定义的一套证书标准。

引用:
A Layman's Guide to a Subset of ASN.1, BER, and DER
A Warm Welcome to ASN.1 and DER
ASN.1 vs DER vs PEM vs x509 vs PKCS#7 vs ....

你可能感兴趣的:(iOS Elliptic curve cryptography (ECC))