首页
学习
活动
专区
工具
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和数据长度是否符合要求,并确保使用正确的填充方案。

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

相关·内容

C#实现微信AES-128-CBC加密数据的解密

而有用的数据,都加密着,腾讯给出了解密的方法: 加密数据解密算法 接口如果涉及敏感数据(如wx.getUserInfo当中的 openId 和unionId ),接口的明文内容将不包含这些敏感数据。...开发者如需要获取敏感数据,需要对接口返回的加密数据( encryptedData )进行对称解密解密算法如下: 对称解密使用的算法为 AES-128-CBC,数据采用PKCS#7填充。...对称解密的目标密文为 Base64_Decode(encryptedData), 对称解密秘钥 aeskey = Base64_Decode(session_key), aeskey 是16字节 对称解密算法初始向量...在网上找C#的AES-128-CBC算法,就没有一个好用的,下载下来半天调不通,看看nodejs和python的代码,简单到令人发指,顿时让我的信心再次遭受打击。 ?.../5798913 但是,还是无法正常使用,分析原因跟转码有关系,微信示例是用base64来存储密文、密钥和向量的,但C#示例是用utf8,经过一番痛苦的调试,终于搞定,把用到的代码直接粘贴过来: 调用代码

3.4K90

循序渐进学加密

编码(Encoding)是把字符集中的字符编码为指定集合某一象(例如:比特模式、自然数序列、8位字节或者电脉冲),以便文本计算机存储和通过通信网络的传递的方法,常见的例子包括将拉丁字母表编码成摩尔斯电码和...但是由于 java早期工程师犯的一个命名上的错误,他们把 AES填充算法的名称设定为 pkcs5,而实际实现实现的是 pkcs7,所以我们 java端开发解密的时候需要使用 pkcs5。...AES-CBC 谈完了不安全的 AES-ECB,我们来做一下相对安全一些的 AES-CBC模式。...AES-CBC的Java解密 下面是 Java代码: try { Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); cipher.init...iv参数,除此之外完全相同,就这样我们就已经实现了一个简单的 CBC模式。

85720
  • php接口如何openssl_encrypt 使用 aes和des ,base64加密解密总结「建议收藏」

    跨语言做 DES 加密解密经常会出现问题,往往是填充方式不对、编码不一致或者加密解密模式没有对应上造成。 常见的填充模式有: pkcs5、pkcs7、iso10126、ansix923、zero。...** 补码原理 在对称加密,可以概分为两种模式加密,流加密以及块加密,当我们使用块加密(也就是分组加密)的时候,例如AES、DES,每次是固定大小的分组数据进行处理。...的ECB与CBC解密 php7.2版本用openssl_encrypt代替mcrypt_encrypt,导致以往自己写的Aes加密类不能用。...这次项目客户端用的是 AES-128-ECB 加密,我用在线AES工具来测试,发现自己写的加解密方法得到的值不一样。而最终发现是加密的key不是16位长,导致ios客户端与服务器php的加解密不一致。...-128-ECB",$this->key,OPENSSL_RAW_DATA)); } } 若你是采用CBC加密,则还需排序$iv偏移量,如下面是AES-128-CBC解密类: class Aes

    2.3K10

    带你手撕 AES算法Python的使用

    记录一下AES解密python的使用 研究AES之前先了解下常用的md5加密,既。然谈到md5,就必须要知道python3digest()和hexdigest()区别。...先说一下我踩得坑,我的版本是python3.7.9,之所以引入的时候加了个备注# pycryptodome,是因为使用过程我发现有的python环境需要装pycryptodome这个包,但引用AES...ECB,数据是分块加密的。如果需要加密的数据的字节码的长度不是块大小的整数倍就需要填充。...PKCS7和PKCS5的区别是数据块的大小; PKCS5填充块的大小为8bytes(64位) PKCS7填充块的大小可以1-255bytes之间。...因为AES并没有64位的块, 如果采用PKCS5, 那么实质上就是采用PKCS7 python实现 安装所需要的包 pip install pycryptodome python代码 # -*- coding

    2.1K40

    AES加密解密

    一、AES加密/解密在线工具文档 1.1、AES加密/解密算法介绍 AES加密/解密算法是一种可逆的对称加密算法,这类算法加密解密时使用相同的密钥,或是使用两个可以简单地相互推算的密钥,一般用于服务端服务端之间对数据进行加密...1.2、AES加密/解密算法特点 作为可逆且对称的块加密AES加密算法的速度比公钥加密加密算法快很多,很多场合都需要AES对称加密,但是要求加密端和解密端双方都使用相同的密钥是AES算法的主要缺点之一...二、AES加密/解密在线工具使用须知 2.1、AES的工作模式 AES常见的工作模式为:ECB,CBC,OFB,CFB,CFB8,CTR,GCM,除了ECB无须设置初始化向量IV而不安全之外,其它AES...填充区别:ECB、CBC工作模式下最后一块要在加密前进行填充,其它不用选择填充模式; 填充模式:AES支持的填充模式为PKCS7和NONE不填充。...2.3、AES密钥KEY和初始化向量IV 初始化向量IV可以有效提升安全性,但是实际的使用场景,它不能像密钥KEY那样直接保存在配置文件或固定写死代码,一般正确的处理方式为:加密端将IV设置为一个

    8.2K00

    AES加密——Java与iOS的解决方案

    维基百科AES加密的解释是这样的: 高级加密标准(英语:Advanced Encryption Standard,缩写:AES),密码学又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准...而如今,移动端和后端约定使用AES加密方式加密后,总会碰到一些问题,今天我就用iOS端和Java端为例子,讲解移动端和后端的AES加密方法。...首先,我们选用AES加密方式时,要先确定mode加密模式以及pad填充方式,而在这个项目中我选择了CBC加密模式以及PKCS5填充方式,并且使用了AES+Base64数据混合加密解密。...这些模式以及填充方式的选择,我们的代码中会有体现。 iOS平台的AES加密 首先我们先创建一个NSData类的category。...Java平台的AES加密 Java平台的加密解密,所有的配置和原理和iOS端都是一样的,所以我就偷懒了,直接把Java端的代码贴上来了。

    2.4K60

    PHP之AES加密算法

    AES简介 AES(Advanced Encryption Standard),密码学又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。...使用AES需要注意下面几点: 1) 确保都使用MCRYPT_MODE_CBC; 2) 确保明文填充都使用的是Pkcs5; 3) 加密keyAES_128长度必须是16, 24, 或者 32 字节(bytes...PHP版的SDK 只要把DES改为AES即可,ECB改为CBC,块大小改为16。 ECB模式没有用到向量。本例为CBC加密结果不变。但是加密向量则不一样了。...加密结果和PHP是一致的。 服务端/客户端加密选型 DES/CBC/PKCS7Padding 此时加密块大小都是8字节,PKCS5和PKCS7效果一样。...AES/ECB/PKCS7Padding 使用AES_128加密块大小都是16字节,PKCS5无法使用,请使用PKCS7。

    4.2K30

    常见加密算法解析-2

    常见的填充模式有:'pkcs5'、'pkcs7'、'iso10126'、'ansix923'、'zero' 类型,包括DES-ECB、DES-CBC、DES-CTR、DES-OFB、DES-CFB。...AES加密 AES含义: AES,高级加密标准,密码学又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。...包括AES-ECB,AES-CBCAES-CTR,AES-OFB,AES-CFB。 AES加密原理: AES加密过程涉及到4种操作,分别是字节替代、行移位、列混淆和轮密钥加。...解密过程分别为对应的逆操作。由于每一步操作都是可逆的,按照相反的顺序进行解密即可恢复明文。加解密每轮的密钥分别由初始密钥扩展得到。算法16个字节的明文、密文和轮密钥都以一个4x4的矩阵表示。...RAS算法原理: 了解RAS算法原理之前,先了解一下非对称加密的过程: 非对称加密是通过两个密钥(公钥-私钥)来实现对数据的加密解密的。公钥用于加密,私钥用于解密

    1.2K30

    DES数据加密标准

    一、DES加密/解密在线工具文档 1.1、DES加密/解密算法介绍 DES加密/解密算法是一种可逆的对称加密算法,这类算法加密解密时使用相同的密钥,或是使用两个可以简单地相互推算的密钥,一般用于服务端服务端之间对数据进行加密...DES产生较早,它服役于很多老版本系统或相关内部系统。如今DES已经不是一种安全的加密方法,为了安全,可以使用DES的派生算法3DES来进行DES解密/加密。...因为3DES也存在理论上的攻击方法,所以DES标准和3DES标准已逐渐被高级加密标准(AES)所取代。...填充区别:ECB、CBC工作模式下最后一块要在加密前进行填充,其它不用选择填充模式; 填充模式:DES支持的填充模式为PKCS5、PKCS7和NONE。...2.2、DES密钥KEY和初始化向量IV 初始化向量IV可以有效提升安全性,但是实际的使用场景,它不能像密钥KEY那样直接保存在配置文件或固定写死代码,一般正确的处理方式为:加密端将IV设置为一个

    1.9K00

    【爬虫知识】爬虫常见加密解密算法

    [爬虫常见加密解密算法] 简介 本文总结了爬虫中常见的各种加密算法、编码算法的原理、 JavaScript 中和 Python 的基本实现方法,遇到 JS 加密的时候可以快速还原加密过程,有的网站在加密的过程可能还经过了其他处理...参考资料:rsa 库:https://stuvel.eu/python-rsa-doc/ 加密解密基本参数 一些对称和非对称加密算法,经常会用到以下三个参数:初始向量 iv、加密模式 mode、填充方式...PKCS5PKCS5 作为 PKCS7 的子集算法,概念上没有什么区别,只是 blockSize 上固定为 8 bytes,即块大小固定为 8 字节。...AES 简介:全称高级加密标准(英文名称:Advanced Encryption Standard),密码学又称 Rijndael 加密法,由美国国家标准与技术研究院 (NIST)于 2001 年发布...Python 实现 目前没有找到有第三方库可以直接实现 Rabbit 算法, Python 实现可以参考:https://asecuritysite.com/encryption/rabbit2 RSA

    8.4K20

    SpringBoot 实现 RAS+AES 自动接口解密

    基础知识AES 简介AES加密解密算法是一种可逆的对称加密算法,这类算法加密AES解密时使用相同的密钥,或是使用两个可以简单地相互推算的密钥,一般用于服务端服务端之间对数据进行加密解密。...作为可逆且对称的块加密AES加密算法的速度比公钥加密加密算法快很多,很多场合都需要AES对称加密,但是要求加密端和解密端双方都使用相同的密钥是AES算法的主要缺点之一。...填充区别:ECB、CBC工作模式下最后一块要在加密前进行填充,其它不用选择填充模式;填充模式:AES支持的填充模式为PKCS7和NONE不填充。其中PKCS7标准是主流加密算法都遵循的数据填充算法。...AES密钥KEY和初始化向量IV初始化向量IV可以有效提升安全性,但是实际的使用场景,它不能像密钥KEY那样直接保存在配置文件或固定写死代码,一般正确的处理方式为:加密端将IV设置为一个16位的随机值...RSA公钥加密,得到AES密钥的密文“sym”5、将“sym”和“asy”作为body参数,调用接口后端:1、接口接收参数,多增加2个字段接收加密后的“sym”和“asy” (名字可以自己定,能接收到就行

    11910

    学习分享 | Padding Oracle

    -256-cbc加密的flag - 2选项: 提供你的IV和要加密的数据,返回加密后的密文 - 3选项: 提供你的IV和要解密的数据,***不***返回解密明文,只返回解密成功是否 我们可以从源码获取到的信息有...X常见的为16位,也有32位 这里要注意,CBC的填充规则(有PKCS5和PKCS7,[区别](https://www.cnblogs.com/midea0978/articles/1437257.html...IV则不用提取 将密文分组 使用密钥第一组密文解密得到密文A,然后用IV进行异或得到第一组明文 使用密钥第二组密文解密得到密文B,然后用A与B进行异或得到第二组明文 重复3-4 直到最后一组密文...,只会有一个异或middle最后一位之后会得到0x01,也就是正确的padding,这时候服务正常解密(只是解密出来的结果不是原来的明文而已) 则假设Plainttext为明文,middle为经过aes...但是解密第二组及其以后的组的时候有一个注意的地方,经过aes解密之后的middle要异或的不再是IV了,而是前一组密文!!

    97491

    Apple FairPlay DRM及其工作原理

    (主要用于iOS、tvOS和macOS设备上安全分发内容)。...使用SAMPLE-AESAES-128加密 在打包后,必须使用AES-128 CBC模式加密内容(CBC代表Cipher Block Chaining,即密文分组链接)。...SAMPLE-AES SAMPLE-AES技术,你无需加密整个视频,只需使用AES-128的CBC模式加密音频数据包和视频帧的sample,这样一来,就可以节省加密解密过程的功耗(尤其视频分辨率增加的情况下...AES-128 AES-128技术,切片(包括音频和视频)通过AES-128、CBC模式和PKCS7填充(Public-Key Cryptography Standards,公钥密码标准)完全加密。...客户端应用 客户端应用是指用来Apple操作系统(比如iOS、tvOS和macOS)上播放视频的应用或者播放器。 它负责向许可证服务器发送请求信息以获取解密密钥。

    3.4K41

    java加解密实例

    CBC模式对于每个待加密的密码块加密前会先与前一个密码块的密文异或然后再用加密加密。第一个明文块与一个叫初始化向量的数据块异或。...CBC模式相比ECB有更高的保密性,但由于每个数据块的加密依赖与前一个数据块的加密所以加密无法并行。与ECB一样加密前需要对数据进行填充,不是很适合对流数据进行加密。...与RSA结合 RSA 比 AES 更难破解,因为它不需要担心密钥传递过程中有泄露,只存在暴力破解一种可能; AES的优势是以分组为轮,加解密速度非常快,一般而言,AES 速度上数百倍于 RSA 实际应用...,我们使用接收方的RSA公钥 其进行加密,随加密后的文件一起发送 3、接收方使用RSA私钥进行解密,得到AES密钥原文,并用AES解密文件 这样就充分利用了两者的优势. public void testHyperCodec...key decoded:"+decodedAesKey); System.out.println(decodedPwd); } doc AES加密 - iOS与Java的同步实现 对称加密

    96020

    3DES数据加密算法

    目前3DES作为DES的过渡算法已经逐渐被更安全的AES代替。...填充区别:ECB、CBC工作模式下最后一块要在加密前进行填充,其它不用选择填充模式; 填充模式:3DES支持的填充模式为PKCS5、PKCS7和NONE不填充。...2.2、3DES密钥KEY和初始化向量IV 初始化向量IV可以有效提升安全性,但是实际的使用场景,它不能像密钥KEY那样直接保存在配置文件或固定写死代码,一般正确的处理方式为:加密端将IV设置为一个...8位的随机值,然后和加密文本一起返给解密端即可。...然而在大多数情况,不应当在使用同一密钥的情况下两次使用同一个IV,3DES算法中一般推荐初始化向量IV为8位的随机值。

    1.6K00

    20.3 OpenSSL 对称AES解密算法

    AES算法加密解密使用的密钥是相同的,该算法加密解密速度较快,适用于大量数据进行加密解密的场景。...实际应用,通常采用混合加密方式,即使用RSA算法加密对称加密算法的密钥,再使用对称加密算法加密数据,以保证数据的机密性和加密解密的效率。...CBC模式加密效率较低,但适用于长报文加密,因为不同的明文块之间互相影响,增加了安全性。实际应用,通常采用CBC模式进行加密,因为它比ECB模式更安全,但加密效率较低。...OpenSSL库提供了AES加密的支持,但在使用时读者还是需要自行封装一些通用加解密函数,如下代码片段是笔者常用的一些函数总结,其中aes_cbc_encrypt函数用于使用CBC模式特定字符串加密...,aes_cbc_decrypt则使用CBC模式字符串进行解密,第二个函数AES函数则是使用OpenSSL库默认的加解密函数二次封装实现的。

    1.2K40

    20.3 OpenSSL 对称AES解密算法

    AES算法加密解密使用的密钥是相同的,该算法加密解密速度较快,适用于大量数据进行加密解密的场景。...实际应用,通常采用混合加密方式,即使用RSA算法加密对称加密算法的密钥,再使用对称加密算法加密数据,以保证数据的机密性和加密解密的效率。...CBC模式加密效率较低,但适用于长报文加密,因为不同的明文块之间互相影响,增加了安全性。 实际应用,通常采用CBC模式进行加密,因为它比ECB模式更安全,但加密效率较低。...OpenSSL库提供了AES加密的支持,但在使用时读者还是需要自行封装一些通用加解密函数,如下代码片段是笔者常用的一些函数总结,其中aes_cbc_encrypt函数用于使用CBC模式特定字符串加密...,aes_cbc_decrypt则使用CBC模式字符串进行解密,第二个函数AES函数则是使用OpenSSL库默认的加解密函数二次封装实现的。

    81270

    PHP 迁移 Mcrypt 至 OpenSSL 加密算法详解

    对称加解密算法,当前最为安全的是 AES 加密算法(以前应该是是 DES 加密算法),PHP 提供了两个可以用于 AES 加密算法的函数簇:Mcrypt 和 OpenSSL。...其中 Mcrypt PHP 7.1.0 中被 Deprecated, PHP 7.2.0 中被移除,所以即可起你应该使用 OpenSSL 来实现 AES 的数据加解密。...一些场景下,我们不能保证两套通信系统都使用了相函数簇去实现加密算法,可能 siteA 使用了最新的 OpenSSL 来实现AES 加密,但作为第三方服务的 siteB 可能仍在使用 Mcrypt...下文中我们将分别使用 Mcrypt 和 OpenSSL 来实现 AES-128/192/256-CBC解密,二者同步加解密的要点为: 1、使用何种填充算法。...16 位,便于统一齐),mode 选用的 CBC 模式。

    1.6K21
    领券