【发布时间】: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!
}
【问题讨论】: