经过长时间的研究,我刚刚实现了自己的解决方案,而不是使用库并不理解其中的情况。了解发生的事情总是很好的,而在这种情况下并不是特别复杂。
在iOS上,如果您想要加密/解密,您需要使用存储在密钥链上的密钥。如果在我的情况下,我已经收到了公钥,我可以导入它,并且我也可以对私钥执行相同的操作。请查看我的HelperClass 这里。
然后,仅限iOS 10及以上版本,您可以调用这两个方法进行加密和解密。
let error:UnsafeMutablePointer<Unmanaged<CFError>?>? = nil
let plainData = "A Plain text...".data(using: .utf8)
if let encryptedMessageData:Data = SecKeyCreateEncryptedData(publicSecKey, .rsaEncryptionOAEPSHA256, plainData! as CFData,error) as Data?{
print("We have an encrypted message")
let encryptedMessageSigned = encryptedMessageData.map { Int8(bitPattern: $0) }
print(encryptedMessageSigned)
if let decryptedMessage:Data = SecKeyCreateDecryptedData(privateSecKey, .rsaEncryptionOAEPSHA256, encryptedMessageData as CFData,error) as Data?{
print("We have an decrypted message \(String.init(data: decryptedMessage, encoding: .utf8)!)")
}
else{
print("Error decrypting")
}
}
else{
print("Error encrypting")
}
此外,如果您使用的是 iOS 10 之前的版本,则可以使用以下功能:
func SecKeyEncrypt(_ key: SecKey,
_ padding: SecPadding,
_ plainText: UnsafePointer<UInt8>,
_ plainTextLen: Int,
_ cipherText: UnsafeMutablePointer<UInt8>,
_ cipherTextLen: UnsafeMutablePointer<Int>) -> OSStatus
而且
func SecKeyDecrypt(_ key: SecKey,
_ padding: SecPadding,
_ cipherText: UnsafePointer<UInt8>,
_ cipherTextLen: Int,
_ plainText: UnsafeMutablePointer<UInt8>,
_ plainTextLen: UnsafeMutablePointer<Int>) -> OSStatus
但是这些选项较少且受到相当多的限制。
值得一提的是,我的公钥和私钥是在Android上生成的。
public static String createStringFromPublicKey(Key key) throws Exception {
X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(key.getEncoded());
return new String(Base64.encode(x509EncodedKeySpec.getEncoded(), Base64.NO_WRAP), "UTF-8");
}
以及
public static String createStringFromPrivateKey(Key key) throws Exception {
PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(key.getEncoded());
return new String(Base64.encode(pkcs8EncodedKeySpec.getEncoded(), Base64.NO_WRAP), "UTF-8");
}
rsaEncryptionOAEPSHA256
的SecKeyCreateEncryptedData
。如果它能够直接使用并且你知道如何使用它,那很好。 如果需要更多帮助,则超出了我在StackOverflow答案中所能做的范围,可能需要在iOS上编写非平凡代码(许多加密算法仅在macOS上受支持)。 如果没有其他人可以指导你完成它,并且你有一些预算,我很乐意讨论咨询协议。请注意,这里的标准算法是SHA-1,并且得到了更广泛的支持。如果可以更改服务器,那可能会对您有所帮助。 - Rob Napier