我正在尝试生成一对RSA密钥,然后将X.509证书添加到公钥头部。为此,我使用SwiftyRSA库。
问题在于当我将X.509证书添加到头部时,无法解析公钥。在此之后,当我打印公钥时,它仍然与没有证书时相同。
但是,当我打印字节时,它显示不同的字节。没有证书时,它显示270个字节,有证书时,它显示294个字节。这意味着它正在添加证书,但未使用证书进行解析。
在深入阅读SwiftyRSA库后,它说:
我仍在寻找解决方案,但找不到任何解决方案。我尝试实现的代码如下:
我如何使用 x509 证书解析公钥? 我会感激任何帮助。
问题在于当我将X.509证书添加到头部时,无法解析公钥。在此之后,当我打印公钥时,它仍然与没有证书时相同。
但是,当我打印字节时,它显示不同的字节。没有证书时,它显示270个字节,有证书时,它显示294个字节。这意味着它正在添加证书,但未使用证书进行解析。
在深入阅读SwiftyRSA库后,它说:
如果值得一提,甚至还有仍然开放的案例。警告:使用SwiftyRSA的方法存储(或创建)PublicKey实例将自动剥离密钥头。有关更多信息,请参见上面的Under the hood。
我仍在寻找解决方案,但找不到任何解决方案。我尝试实现的代码如下:
if let password = passwordTextField.text {
//Generate RSA
guard let keyPair = try? SwiftyRSA.generateRSAKeyPair(sizeInBits: 2048),
let privateKeyPem = try? keyPair.privateKey.pemString(),
let publicKeyPem = try? keyPair.publicKey.pemString()
else {
return
}
/// Generate Certificate in format X.509 from Public Key
let publicKey = try! PublicKey(data: keyPair.publicKey.data())
let publicKeyData = try! keyPair.publicKey.data()
let publicKey_with_X509_header = try! SwiftyRSA.prependX509KeyHeader(keyData: publicKeyData)
let publicKey509 = try! PublicKey(data: publicKey_with_X509_header)
print(try! publicKey.pemString()) // Without Certificate
print(try! publicKey509.pemString()) // With Certificate
// These two print results are completely the same, but it should be different.
// Encrypt private key
let salt = String.random(length: 32)
let aesKey = Array(String((password + salt).prefix(32)).utf8)
let iv = [UInt8](String(salt.prefix(16)).utf8)
guard let aes = try? AES(key: aesKey, blockMode: CBC(iv: iv), padding: .pkcs7),
let inputData = privateKeyPem.data(using: .utf8),
let encryptedBytes = try? aes.encrypt(inputData.bytes)
else {
return
}
let encryptedData = NSData(bytes: encryptedBytes, length: encryptedBytes.count)
let base64String = encryptedData.base64EncodedString(options: NSData.Base64EncodingOptions(rawValue: 0))
// Print keys and salt
print(try! publicKey509.pemString())
print(base64String)
print(salt)
}
我如何使用 x509 证书解析公钥? 我会感激任何帮助。