首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在iOS中实现对AES/CBC/PKCS5加密解密

基础概念

AES(Advanced Encryption Standard)是一种对称加密算法,广泛用于数据加密。CBC(Cipher Block Chaining)是AES的一种工作模式,它将每个明文块与前一个密文块进行异或运算后再加密,从而提高安全性。PKCS5(Padding Scheme 5)是一种填充方案,用于确保数据长度符合加密算法的要求。

优势

  1. 安全性高:AES算法被认为是安全的,被广泛用于各种安全应用。
  2. 性能好:AES在现代硬件上运行速度快,适合移动设备。
  3. 标准化:AES是国际标准,得到了广泛的支持和实现。

类型

  • AES-128:使用128位密钥。
  • AES-192:使用192位密钥。
  • AES-256:使用256位密钥。

应用场景

  • 数据传输加密:保护网络传输中的敏感数据。
  • 文件加密:保护存储在设备上的敏感文件。
  • 身份验证:结合其他算法(如HMAC)进行身份验证。

实现AES/CBC/PKCS5加密解密

在iOS中,可以使用CommonCrypto库来实现AES加密和解密。以下是一个示例代码:

加密

代码语言:txt
复制
import CommonCrypto

func encrypt(data: Data, key: Data, iv: Data) -> Data? {
    var encryptedData = Data(count: data.count + kCCBlockSizeAES128)
    var encryptedDataLength: Int = 0
    
    let status = encryptedData.withUnsafeMutableBytes { encryptedBytes in
        data.withUnsafeBytes { dataBytes in
            key.withUnsafeBytes { keyBytes in
                iv.withUnsafeBytes { ivBytes in
                    CCCrypt(CCOperation(kCCEncrypt),
                            CCAlgorithm(kCCAlgorithmAES),
                            CCOptions(kCCOptionPKCS7Padding),
                            keyBytes.baseAddress, key.count,
                            ivBytes.baseAddress,
                            dataBytes.baseAddress, data.count,
                            encryptedBytes.baseAddress, encryptedData.count,
                            &encryptedDataLength)
                }
            }
        }
    }
    
    if status == kCCSuccess {
        encryptedData.count = encryptedDataLength
        return encryptedData
    }
    
    return nil
}

解密

代码语言:txt
复制
func decrypt(data: Data, key: Data, iv: Data) -> Data? {
    var decryptedData = Data(count: data.count + kCCBlockSizeAES128)
    var decryptedDataLength: Int = 0
    
    let status = decryptedData.withUnsafeMutableBytes { decryptedBytes in
        data.withUnsafeBytes { dataBytes in
            key.withUnsafeBytes { keyBytes in
                iv.withUnsafeBytes { ivBytes in
                    CCCrypt(CCOperation(kCCDecrypt),
                            CCAlgorithm(kCCAlgorithmAES),
                            CCOptions(kCCOptionPKCS7Padding),
                            keyBytes.baseAddress, key.count,
                            ivBytes.baseAddress,
                            dataBytes.baseAddress, data.count,
                            decryptedBytes.baseAddress, decryptedData.count,
                            &decryptedDataLength)
                }
            }
        }
    }
    
    if status == kCCSuccess {
        decryptedData.count = decryptedDataLength
        return decryptedData
    }
    
    return nil
}

参考链接

常见问题及解决方法

  1. 密钥长度不正确:AES-128需要16字节密钥,AES-192需要24字节密钥,AES-256需要32字节密钥。确保密钥长度正确。
  2. 初始化向量(IV)长度不正确:IV长度必须与块大小相同,对于AES通常是16字节。
  3. 填充问题:确保数据长度符合加密算法的要求,使用PKCS5填充。

通过以上步骤,你可以在iOS中实现AES/CBC/PKCS5的加密和解密。如果遇到问题,请检查密钥、IV和数据长度是否符合要求,并确保使用正确的填充方案。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • AES 加密解密示例(walker)

    密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。 这个标准用来替代原先的DES(Data Encryption Standard),已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院 (NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。 该算法为比利时密码学家Joan Daemen和Vincent Rijmen所设计,结合两位作者的名字,以Rijdael之名命之,投稿高级加密标准的甄选流程。(Rijdael的发音近于 "Rhine doll"。)

    01
    领券