返回

iOS 中如何加载 RSA-PSS 公钥?

IOS

iOS 中使用 SecKeyCreateWithData 加载 RSA-PSS 公钥

问题:RSA-PSS 公钥加载失败

在 iOS 中使用 SecKeyCreateWithData() 加载使用 RSA-PSS 签名算法生成的公钥时,可能会遇到错误。这是因为使用 kSecAttrKeyTypeRSA 常量,它适用于标准 RSA 公钥,而对于 RSA-PSS 公钥,需要使用 kSecAttrKeyTypeRSASSA-PSS 常量。

解决方法:使用正确的密钥常量

要加载 RSA-PSS 公钥,需要在 createKey() 函数中将 kSecAttrKeyTypeRSA 替换为 kSecAttrKeyTypeRSASSA-PSS

func createKey(publicKeyData: Data, logPrefix: String) {
    let attributes: [NSObject : NSObject] = [
            kSecAttrKeyType: kSecAttrKeyTypeRSASSA-PSS, // 使用 RSA-PSS 公钥常量
            kSecAttrKeyClass: kSecAttrKeyClassPublic,
        ]
}

数据类型:Base64、DER 和 ASN1

公钥可以从 Base64、DER 或 ASN1 数据加载。

  • Base64: 从 Base64 编码的公钥字符串加载:
let publicKeyPEMBase64 = "YOUR_PUBLIC_KEY_IN_BASE64"
guard let publicKeyPEMData = Data(base64Encoded: publicKeyPEMBase64) else { return }
createKey(publicKeyData: publicKeyPEMData, logPrefix: "(1)")
  • DER: 从 DER 编码的公钥数据加载:
let publicKeyDerRawBytes = [...YOUR_DER_ENCODED_PUBLIC_KEY...]
let publicKeyDerData = Data(publicKeyDerRawBytes)
createKey(publicKeyData: publicKeyDerData, logPrefix: "(2)")
  • ASN1: 从 ASN1 编码的公钥数据加载:
let publicKeyAsn1RawBytes = [...YOUR_ASN1_ENCODED_PUBLIC_KEY...]
let publicKeyAsn1Data = Data(publicKeyAsn1RawBytes)
createKey(publicKeyData: publicKeyAsn1Data, logPrefix: "(3)")

结论

通过使用正确的密钥常量并根据数据类型加载公钥,可以在 iOS 应用中成功加载 RSA-PSS 公钥。

常见问题解答

1. 为什么使用不同的密钥常量?

不同的密钥常量对应不同的公钥算法。RSA-PSS 公钥使用 RSA-PSS 算法,因此需要使用 kSecAttrKeyTypeRSASSA-PSS 常量。

2. 为什么从不同数据类型加载公钥?

公钥可以使用不同的编码格式存储。Base64、DER 和 ASN1 都是常见的选择。

3. 如何获取 RSA-PSS 公钥?

可以使用 OpenSSL 等工具生成 RSA-PSS 公钥。命令可以是:

openssl genpkey -algorithm rsa-pss -pkeyopt rsa_keygen_bits:2048 -out your_public_key.pem

4. 使用 SecKeyCreateWithData() 加载公钥还有什么需要注意的吗?

确保公钥数据是有效的且未损坏。否则,加载可能会失败。

5. 除了加载公钥,使用 RSA-PSS 公钥还有什么其他用例?

RSA-PSS 公钥可用于验证 RSA-PSS 签名,这是数字签名的一种形式。