RSA 加密仅在运行 iOS 9 的 iPhone 4s 上失败

Posted

技术标签:

【中文标题】RSA 加密仅在运行 iOS 9 的 iPhone 4s 上失败【英文标题】:RSA Encryption Failing on just the iPhone 4s running iOS 9 【发布时间】:2018-05-15 06:51:04 【问题描述】:

我成功地 RSA-Encrypting 一个字符串,但是当我在 iPhone 4s (ios 9.3.2) 上执行此操作时,它失败并返回 'nil' 作为结果。但是它在所有其他 iphone(5,6,7,8,X.) 上成功运行。

我正在使用这个 RSA 公钥:

“MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQClTlHEResIvOPHR0 + o4exJVEI5RQ4NnBBXV9tdoCbqavSgsiuFtZWn5RUVTLb0h7ULpOh8GDcu0yI4lnpMVDZ5U2w0ra2 / BNl6XDt9bwwoOh5w2lsdVmdP94t / qVBX4C0OcXw + RdSD1pshucTO7m2YLxtzLuc4ChUwjWZXVEoHdQIDAQAB” P>

实际上是在这行代码中我得到 &keyRef 'nil'

err = SecItemCopyMatching(dictionary as CFDictionary, &keyRef);

这是我的代码;

func encryptString(stringToEncrypt:String) -> String 
    print("stringToEncrypt64 = " + stringToEncrypt)

    let keyData = NSData(base64Encoded: Constants.RSA_Public_Key, options: NSData.Base64DecodingOptions.ignoreUnknownCharacters)

    let dictionary: [NSString: AnyObject] = [
        kSecClass: kSecClassKey,
        kSecAttrKeyType: kSecAttrKeyTypeRSA,
        kSecAttrKeyClass: kSecAttrKeyClassPublic,
        kSecAttrApplicationTag: "HBLMobilePublicKeyTag" as AnyObject,
        kSecValueData: keyData!,
        kSecAttrKeySizeInBits: NSNumber(value: 1024),
        kSecReturnRef: true as AnyObject
    ];

    var err = SecItemAdd(dictionary as CFDictionary, nil);

    if ((err != noErr) && (err != errSecDuplicateItem)) 
        print("error loading public key");
    

    var keyRef: AnyObject?;
    var base64String: String?
    err = SecItemCopyMatching(dictionary as CFDictionary, &keyRef);
    if (err == noErr) 
        if let keyRef = keyRef as! SecKey? 

            let plaintextLen = stringToEncrypt.lengthOfBytes(using: String.Encoding.utf8);
            let plaintextBytes = [UInt8](stringToEncrypt.utf8);

            var encryptedLen: Int = SecKeyGetBlockSize(keyRef);
            var encryptedBytes = [UInt8](repeating: 0, count: encryptedLen);

            err = SecKeyEncrypt(keyRef, SecPadding.PKCS1, plaintextBytes, plaintextLen, &encryptedBytes, &encryptedLen);
            let data = NSData(bytes: encryptedBytes, length: encryptedBytes.count)

            base64String = data.base64EncodedString(options: [])
        
    

    SecItemDelete(dictionary as CFDictionary);
    return base64String!

【问题讨论】:

【参考方案1】:

可能是因为 iPhone 4s 已经过时了。如果版本与 ios-9 上的所有手机相同,则可能是手机上的硬件。或者可能是您没有足够的空间在手机上存储应用程序以使其正常工作。可能一半的文件都在手机上,当它没有完成时,它会显示Completed Transfer

对不起,我只是在说我所知道的(我对 iPhone 一无所知)关于软件的知识。

【讨论】:

但是当我使用不同的公钥时,它在所有 iOS 设备上都能正常工作,奇怪。 iOS 9 所期望的键中缺少某些内容。 对不起,就像我说的我不确定。我只是提出想法。对不起

以上是关于RSA 加密仅在运行 iOS 9 的 iPhone 4s 上失败的主要内容,如果未能解决你的问题,请参考以下文章

FBSDKGraphRequest FBSDKGraphRequestConnection 仅在 iOS 9 中返回错误

音频引擎仅在运行 iOS 10 的设备(iphone 6)上失败,在所有模拟器设备上运行良好或真实设备直到 iphone 6s

iOS端使用DSA加密

使用公钥在 iPhone 中进行 RSA 解密

SecKeyDecrypt 在不同的设备上表现不同。

iOS常用加密之RSA加密解密