简体   繁体   English

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

[英]RSA Encryption Failing on just the iPhone 4s running iOS 9

I am successfully RSA-Encrypting a string but when i do it on iPhone 4s (iOS 9.3.2) it fails and returns 'nil' as a result. 我成功地对字符串进行了RSA-Encrypting但是当我在iPhone 4s(iOS 9.3.2)上RSA-Encrypting时,它失败并返回'nil' However it is successfully working on all the other iphones(5,6,7,8,X.) 但是,它可以在所有其他iPhone(5、6、7、8,X。)上成功运行。

I am using this RSA Public-Key: 我正在使用此RSA公钥:

"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQClTlHEResIvOPHR0+o4exJVEI5RQ4NnBBXV9tdoCbqavSgsiuFtZWn5RUVTLb0h7ULpOh8GDcu0yI4lnpMVDZ5U2w0ra2/BNl6XDt9bwwoOh5w2lsdVmdP94t/qVBX4C0OcXw+RdSD1pshucTO7m2YLxtzLuc4ChUwjWZXVEoHdQIDAQAB" “MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQClTlHEResIvOPHR0 + o4exJVEI5RQ4NnBBXV9tdoCbqavSgsiuFtZWn5RUVTLb0h7ULpOh8GDcu0yI4lnpMVDZ5U2w0ra2 / BNl6XDt9bwwoOh5w2lsdVmdP94t / qVBX4C0OcXw + RdSD1pshucTO7m2YLxtzLuc4ChUwjWZXVEoHdQIDAQAB”

It is actually on this line of code where i am getting &keyRef 'nil' 实际上是在这行代码中,我正在&keyRef'nil'

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

Here is my code; 这是我的代码;

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!
}

maybe it's that the iPhone 4s is out of date. 也许是因为iPhone 4s已过时。 If the versions are the same like all phones on ios-9 then it could be the hardware on the phone. 如果版本与ios-9上的所有电话相同,则可能是电话上的硬件。 Or it could be that you don't have enough space to store the application on the phone for it to work. 或者可能是您没有足够的空间来将应用程序存储在手机上以使其正常工作。 It could be that half the files are on the phone and that it says Completed Transfer When it didn't complete it. 可能是一半的文件在手机上,并在未完成时显示“ Completed Transfer

Sorry, I'm just saying what I know (Which I know nothing about IPhones) about software. 抱歉,我只是说说我对软件的了解(对iPhone却一无所知)。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM