Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 如何在macOS上使用Security.framework解密数据?_Swift_Macos_Encryption_Rsa_Security.framework - Fatal编程技术网

Swift 如何在macOS上使用Security.framework解密数据?

Swift 如何在macOS上使用Security.framework解密数据?,swift,macos,encryption,rsa,security.framework,Swift,Macos,Encryption,Rsa,Security.framework,我需要在macOS上使用RSApublic密钥解密数据,通过谷歌搜索,我知道我们可以使用SecKeyCreateDecryptedData的Security.framework方法来实现这一点,但它会导致两个问题: SecKeyCreateDecryptedData接受private密钥来执行解密,但在我的情况下,数据在服务器端用私钥加密,需要在客户端用public密钥解密 我试图从RSApublic密钥字符串创建SecKey,但失败了 我的代码: 导入基础 func getPublicKe

我需要在
macOS
上使用RSA
public
密钥解密数据,通过谷歌搜索,我知道我们可以使用
SecKeyCreateDecryptedData
Security.framework
方法来实现这一点,但它会导致两个问题:

  • SecKeyCreateDecryptedData
    接受
    private
    密钥来执行解密,但在我的情况下,数据在服务器端用私钥加密,需要在客户端用
    public
    密钥解密

  • 我试图从RSA
    public
    密钥字符串创建
    SecKey
    ,但失败了

  • 我的代码:

    <代码>导入基础 func getPublicKey(来自数据:data)抛出->SecKey{ 变量错误:非托管?=nil 让publicKeyMaybe=SecKeyCreateWithData( 数据作为NSData, [ kSecAttrKeyType:kSecAttrKeyTypeRSA, ksecatterkeyclass:ksecatterkeyclasspublic ]作为一本词典, &(错误) guard let publicKey=publicKey可能还有其他{ 抛出错误!.takeRetainedValue()作为错误 } 返回公钥 } func decrypt(key:SecKey,data cipherTextData:data)->data?{ let算法:SecKeyAlgorithm=.eciseEncryptionCofactorVariableIVX963SHA256AESGCM guard SecKeyIsAlgorithmSupported(密钥、.解密、算法)else{ 打印(“无法解密。不支持算法。”) 归零 } 变量错误:非托管?=nil 让clearTextData=SecKeyCreateDecryptedData(密钥, 算法, cipherTextData作为CFData, &错误)作为数据? 如果let error=error{ 打印(“无法解密.%@”,(错误。错误为takeRetainedValue()).localizedDescription) 归零 } guard clearTextData!=无其他{ 打印(“无法解密。没有生成的cleartextData。”) 归零 } 打印(“解密数据”) 返回clearTextData } func testDecrypt(){ 让rawString=“0ed3a2c57f5dEJgqXT9760269b8cc5cd76f3afcf” 让decodedData=Data.init(base64Encoded:rawString,选项:[])! let pubKey=try!getPublicKey(from:kPubKey.data(使用:.utf8)!)//错误:从数据创建RSA公钥失败 让decryptedData=decrypt(密钥:pubKey,数据:decodedData)! 让decrypted=String.init(数据:decryptedData,编码:.utf8)! 打印(“>>>解密字符串:\(解密)”) } testDecrypt() 使用
    Kazunori Takaishi
    的方法,我测试了所有算法,没有一个是受支持的:

    func decrypt(key:SecKey,data-cipherTextData:data)->data?{
    let算法:[SecKeyAlgorithm]=[
    .签名人劳先生,
    .rsSignatureDigestPKCS1v15raw,
    .rsAssignatureDigestPKCS1v15sha1,
    .rsaSignatureDigestPKCS1v15SHA224,
    .rsAssignatureDigestPKCS1V15SHA256,
    .rsSignatureDigestPKCS1V15SHA384,
    .rsAssignatureDigestPKCS1v15sha512,
    .rsaSignatureMessagePKCS1v15SHA1,
    .rsaSignatureMessagePKCS1v15SHA224,
    .rsaSignatureMessagePKCS1v15SHA256,
    .rsaSignatureMessagePKCS1v15SHA384,
    .rsaSignatureMessagePKCS1v15SHA512,
    .RSASignatureDigestPSSHA1,
    .RSASignatureDigestPSSHA224,
    .RSASignatureDigestPSSHA256,
    .RSASignatureDigestPSSHA384,
    .RSASignatureDigestPSSHA512,
    .RSASignatureMessagePSSHA1,
    .RSASignatureMessagePSSHA224,
    .RSASignatureMessagePSSHA256,
    .RSASignatureMessagePSSHA384,
    .RSASignatureMessagePSSHA512,
    .ECDSASignatorRFC4754,
    .ecdsaSignatureDigestX962,
    .ecdsaSignatureDigestX962SHA1,
    .ecdsaSignatureDigestX962SHA224,
    .ecdsaSignatureDigestX962SHA256,
    .ecdsaSignatureDigestX962SHA384,
    .ecdsaSignatureDigestX962SHA512,
    .ecdsaSignatureMessageX962SHA1,
    .ecdsaSignatureMessageX962SHA224,
    .ecdsaSignatureMessageX962SHA256,
    .ecdsaSignatureMessageX962SHA384,
    .ecdsaSignatureMessageX962SHA512,
    .rsaEncryptionRaw,
    .rsaEncryptionPKCS1,
    .AEPSHA1,
    .AEPSHA224,
    .AEPSHA256,
    .AEPSHA384,
    .AEPSHA512,
    .AEPSHA1AESGCM,
    .AEPSHA224AESGCM,
    .AEPSHA256AESGCM,
    .AEPSHA384AESGCM,
    .AEPSHA512AESGCM,
    .ECIENCryptions标准X963SHA1AESGCM,
    .ECIENCryptions标准X963SHA224AESGCM,
    .ECIENCryptions标准X963SHA256ESGCM,
    .ECIENCryptions标准X963SHA384AESGCM,
    .ECIENCryptions标准X963SHA512ESGCM,
    .ECIENCryption辅因子X963SHA1AESGCM,
    .ECIENCryption辅因子X963SHA224AESGCM,
    .ECIENCryption辅因子X963SHA256AESGCM,
    .ECIENCryption辅因子X963SHA384AESGCM,
    .ECIENCryption辅因子X963SHA512AESGCM,
    .ECIENCryptions标准变量IVX963SHA224AESGCM,
    .ECIENCryptions标准变量IVX963SHA256ESGCM,
    .物种增加标准变量IVX963SHA384AESGCM,
    .ECIENCryptions标准变量IVX963SHA512ESGCM,
    .ECIENCryption辅因子可变IVX963SHA224AESGCM,
    .ECIENCryption辅因子可变IVX963SHA256ESGCM,
    .ECIENCryption辅因子可变IVX963SHA384AESGCM,
    .EciseEncryption辅因子可变IVX963SHA512ESGCM,
    .ecdhKeyExchangeStandard,
    .ecdhKeyExchangeStandardX963SHA1,
    .ecdhKeyExchangeStandardX963SHA224,
    .ecdhKeyExchangeStandardX963SHA256,
    .ecdhK
    
        func getPublicKey(from data: Data?) throws -> SecKey {
            var error: Unmanaged<CFError>? = nil
            guard let data = data else { throw error!.takeRetainedValue() as Error }
            let publicKeyMaybe = SecKeyCreateFromData([:] as CFDictionary, data as NSData, &error)
            guard let publicKey = publicKeyMaybe else {
                throw error!.takeRetainedValue() as Error
            }
            return publicKey
        }
    
    let pubKey = try! getPublicKey(from: kPubKey.data(using: .ascii))