jiami

    xiaoxiao2025-06-25  36

    一、加密算法:

        1.对称加密:信息接收双方都需事先知道密匙和加解密算法且其密匙是相同的。常见的有AES,DES,3DES

        2.非对称加密:发送双方A,B事先均生成各自的公钥和私钥,然后A将自己的公匙发送给BB将自己的公匙发送给A,如果A要给B发送消息,则先需要用B的公匙进行消息加密,然后发送给B端,此时B端再用自己的私匙进行消息解密,BA发送消息时为同样的道理。常见的非对称加密算法有RSA,DSA,ECC

    二、AES介绍

        1.AES是基于数据块的加密方式,也就是说,每次处理的数据是一块(128比特),当数据不是128比特的倍数时填充,这就是所谓的分组密码(区别于基于比特位的流密码),128比特是分组长度。

        2.密钥长度可以是128比特、192比特、256比特中的任意一个(如果数据块及密钥长度不足时,会补齐)

        3.分组加密的几种方式

          3.1 ECB:是一种基础的加密方式,密文被分割成分组长度相等的块(不足补齐),然后单独一个个加密,一个个输出组成密文。

          3.2 CBC:是一种循环模式,前一个分组的密文和当前分组的明文异或操作后再加密,这样做的目的是增强破解难度。CBC会在第一个密码块运算时加入一个初始化向量。

          3.3 CFB/OFB实际上是一种反馈模式,目的也是增强破解的难度。

    三、AES加解密(使用CBCPKCS7Padding

        1.对称密钥生成器:

        /*  @param algorithm 加密算法

         *  为指定的加密算法生成对称密钥。使用的密钥长度如下:(Byte)

         *  kCCAlgorithmAES      -> kCCKeySizeAES256    -> 32

         *  kCCAlgorithmDES      -> kCCKeySizeDES       -> 8

         *  kCCAlgorithm3DES     -> kCCKeySize3DES      -> 24

         *  kCCAlgorithmCAST     -> kCCKeySizeMaxCAST   -> 16

         *  kCCAlgorithmRC4      -> kCCKeySizeMaxRC4    -> 512

         *  kCCAlgorithmRC2      -> kCCKeySizeMaxRC2    -> 128

         *  kCCAlgorithmBlowfish -> kCCKeySizeMaxBlowfish  -> 56

         *  @return 密钥

         */

        + (NSData *)generateSymmetricKeyForAlgorithm:(CCAlgorithm)algorithm;

        + (NSData *)generateSymmetricKeyForAlgorithm:(CCAlgorithm)algorithm

        keySize:(unsigned int)keySize;

        2.初始化向量生成器

        /*  为指定的加密算法生成初始化向量,初始化向量的大小与算法分组的大小相同。

         *  @param algorithm 加密算法,不能是流加密算法

         *  @return 初始化向量

         */

        + (NSData *)generateIVForAlgorithm:(CCAlgorithm)algorithm;

        3.分组对称加解密

        /*  使用分组对称加密算法对数据进行加解密。

         *  初始化向量释疑:初始化向量完全是可选的。CBC模式下才会使用到它。

         *  如果初始化向量不为空,那么,其长度必须与算法分组大小(以字节为单位)一致。

         *  如果使用了CBC模式,且没有指定初始化向量,会自动使用以0填充的初始化向量。

         *  当使用ECB模式时或使用的是流加密算法时,初始化向量会被忽略掉。

         *  @param algorithm      算法,不能是流加密算法

         *  @param key            密钥

         *  @param iv             初始化向量,可以为空。

         *  @param operation      加密(kCCEncrypt)/解密(kCCDecrypt)

         *  @param isPKCS7Padding 是否使用PKCS7Padding填充模式,如不使用,则是使用NoPadding填充模式

         *  @param isECB          是否使用ECB模式,如不使用,则是使用CBC模式

         *  @return 加密/解密后的数据

         */

        - (NSData *)doBlockCipherWithAlgorithm:(CCAlgorithm)algorithm

                                           key:(NSData *)key

                                            iv:(NSData *)iv

                                     operation:(CCOperation)operation

                                isPKCS7Padding:(BOOL)isPKCS7Padding

                                         isECB:(BOOL)isECB;

        /* 更新密钥。

         *  kCCKeySizeAES128          = 16

         *  kCCKeySizeAES192          = 24

         *  kCCKeySizeAES256          = 32

         *  keySize必须为上面中的某个,单位字节。

         */

        - (void)updateKeyWithKeySize:(unsigned int)keySize;

        //更新初始化向量

        - (void)updateIV;

        /*  AES-128 加密

         *  @param plainData 待加密数据(明文数据)

         *  @return 加密后的数据(密文数据)

         */

        - (NSData *)AES128Encrypt:(NSData *)plainData;

        /*  AES-128 解密

         *  @param cipherData 待解密数据(密文数据)

         *  @return 解密后的数据(明文数据)

         */

        - (NSData *)AES128Decrypt:(NSData *)cipherData;

        /*  加解密。当需要使用指定的密钥或初始化向量时,可以使用该方法。会修改_key_iv

         *  @param data      明文/密文

         *  @param key       密钥

         *  @param iv        初始化向量,可以为空

         *  @param operation kCCEncrypt/kCCDecrypt

         *  @return 加密/解密后的数据

         */

        - (NSData *)doCipher:(NSData *)data

        key:(NSData *)key

        iv:(NSData *)iv

        operation:(CCOperation)operation;

    转载请注明原文地址: https://ju.6miu.com/read-1300306.html
    最新回复(0)