jiami

来源:互联网 发布:手电筒软件哪个好 编辑:程序博客网 时间:2024/05/21 03:26

一、加密算法:

    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:(unsignedint)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:(unsignedint)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;





























0 0
原创粉丝点击