RNCryptor:AES128CBC在Swift中解密

时间:2016-02-25 10:11:50

标签: xcode swift rncryptor

如何使用RNCryptor(AES128CBC)解密NSData? 我已经尝试了解文档:https://github.com/RNCryptor/RNCryptor-Spec/blob/master/draft-RNCryptor-Spec-v4.0.md

编辑:

class Decription{
    func AES128(message: String, key: String, iv: String){
        let keyData: NSData! = (key as NSString).dataUsingEncoding(NSUTF8StringEncoding) as NSData!
        let ivData:  NSData! = (iv as NSString).dataUsingEncoding(NSUTF8StringEncoding) as NSData!
        let data:    NSData! = (message as NSString).dataUsingEncoding(NSUTF8StringEncoding) as NSData!
        let cryptData        = NSMutableData(length: Int(data.length) + kCCBlockSizeAES128)!

        let keyLength              = size_t(kCCKeySizeAES256)
        let operation: CCOperation = UInt32(kCCDecrypt)
        let algoritm:  CCAlgorithm = UInt32(kCCAlgorithmAES128)
        let options:   CCOptions   = UInt32(kCCOptionECBMode + kCCOptionPKCS7Padding)

        var numBytesEncrypted :size_t = 0

        let cryptStatus = CCCrypt(
            operation,
            algoritm,
            options,
            keyData.bytes,
            keyLength,
            ivData.bytes,
            data.bytes, data.length,
            cryptData.mutableBytes,
            cryptData.length,
            &numBytesEncrypted
        )

        if UInt32(cryptStatus) == UInt32(kCCSuccess) {
            cryptData.length = Int(numBytesEncrypted)
            print("Decrypted Result = \(NSString(data: cryptData, encoding: NSUTF8StringEncoding))")
        } else {
            print("Error: \(cryptStatus)")
        }
    }
}

我更改了链接到的代码段@zaph。你可以看到上面的结果。

NSString(data: cryptData, encoding: NSUTF8StringEncoding)结果nil。有什么问题?

1 个答案:

答案 0 :(得分:1)

首先使用RNCryptor进行加密,而不是其他方法,因为RNCryptor不仅仅是AES加密,而是一种包括密钥派生和身份验证在内的整个安全加密方法。有关详细信息,请参阅RNCryptor-Spec

如果你只是想要解密使用Common Crypto和Swift,请参阅此SO Answer代码示例。

注意:示例代码就是这样,它不应该在生产代码中按原样使用。特别是ECB模式不安全,使用带随机iv的CBC并考虑在密码中添加认证和密钥派生,如PBKDF2。

相关问题