【问题标题】:RSA Encryption Failing on just the iPhone 4s running iOS 9RSA 加密仅在运行 iOS 9 的 iPhone 4s 上失败
【发布时间】: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!
}

【问题讨论】:

    标签: ios rsa swift4 xcode9.2


    【解决方案1】:

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

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

    【讨论】:

    • 但是当我使用不同的公钥时,它在所有 iOS 设备上都能正常工作,奇怪。 iOS 9 所期望的键中缺少某些内容。
    • 对不起,就像我说的我不确定。我只是提出想法。对不起
    猜你喜欢
    • 2015-02-11
    • 2011-01-25
    • 1970-01-01
    • 1970-01-01
    • 2018-04-07
    • 2014-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多