我正在使用CommonCrypto解密从服务器获取的加密MP3文件。
实际上,服务器端使用AES 128位加密和CBC模式,所以我想用同样的方式解密它。
我用下面的代码来解密。

    #import <CommonCrypto/CommonCrypto.h

func testCrypt(data:NSData, keyData:NSData, ivData:NSData, operation:CCOperation) -> NSData? {
    let keyBytes = UnsafePointer<UInt8>(keyData.bytes)
    print("keyLength   = \(keyData.length), keyData   = \(keyData)")

    let ivBytes = UnsafePointer<UInt8>(ivData.bytes)
    print("ivLength    = \(ivData.length), ivData    = \(ivData)")

    let dataLength = Int(data.length)
    let dataBytes  = UnsafePointer<UInt8>(data.bytes)
    print("dataLength  = \(dataLength), data      = \(data)")

    let cryptData: NSMutableData! = NSMutableData(length: Int(dataLength) + kCCBlockSizeAES128)
    let cryptPointer = UnsafeMutablePointer<UInt8>(cryptData.mutableBytes)
    let cryptLength  = size_t(cryptData.length)

    let keyLength              = size_t(kCCKeySizeAES128)
    let algoritm:  CCAlgorithm = UInt32(kCCAlgorithmAES128)
    let options:   CCOptions   = UInt32(kCCOptionPKCS7Padding)

    var numBytesEncrypted :size_t = 0

    let cryptStatus = CCCrypt(operation,
        algoritm,
        options,
        keyBytes, keyLength,
        ivBytes,
        dataBytes, dataLength,
        cryptPointer, cryptLength,
        &numBytesEncrypted)

    if UInt32(cryptStatus) == UInt32(kCCSuccess) {
        cryptData.length = Int(numBytesEncrypted)
        print("cryptLength = \(numBytesEncrypted), cryptData = \(cryptData)")

    } else {
        print("Error: \(cryptStatus)")
    }

    return cryptData;
}

如何在此代码中指定CBC模式和PKCS5Padding
提前谢谢

最佳答案

AES的块大小始终使用16字节。
PKCS5Padding的块大小定义为8字节。所以你不能使用像AES/CBC/PKCS5Padding这样的组合。
只有当块大小不超过8字节时,才能使用PKCS5Padding
另一件事
CCCrypt是在CBC模式下工作的默认值,因此在这种情况下不需要提到CBC模式。举例来说,如果你想ECB模式,那么你应该提到kCCOptionECBMode
不幸的是,苹果文档没有PKCS5Padding。当块大小正好为8字节时,可以使用PKCS7Padding替代PKCS5Padding

关于ios - iOS Swift中具有CBC模式的AES 128解密,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33497348/

10-12 15:07