DES 加密解密詳解 CCCrypt函數

世界最美好的樣子,便是有你的日子  

一, 接觸到加解密後,總結了一下AES, DES,3DES 加解密,其中 包含 <CommonCrypto/CommonCrypto.h>裏的api 
1, 主要注意 buffer 的內存大小。和 加解密結果的狀態, 重點是  CCCrypt 函數 
直接上代碼 
首先包含加密用到的API頭文件


#import <CommonCrypto/CommonCrypto.h>

  • 1

然後就是加密過程了


//加密過程

- (NSString*)encryptionType:(CCAlgorithm)encryptionType encodingStr:(NSString *)originStr key:(NSString*)key

{

    // 1, 將 str裝換成 data數據

    NSData * baseData = [originStrdataUsingEncoding:NSUTF8StringEncodingallowLossyConversion:YES];

    size_t dataOutOffset = 0;

    NSUInteger dataLength = baseData.length +100+[keydataUsingEncoding:NSUTF8StringEncodingallowLossyConversion:YES].length;

    unsigned char buffer[dataLength];

    memset(buffer, 0,sizeof(char));

    

   CCCryptorStatus cryptorStatus = CCCrypt(

                                   kCCEncrypt,         // 加密還是解密

                                   encryptionType,      // 加密的方式 DES, 3DES, AES

                                   kCCOptionPKCS7Padding|kCCOptionECBMode,

                                   [key UTF8String],   //把key轉換爲C串

                                   keyLength,          //祕鑰的size,固定的 kCCKeySizeDES,kCCKeySize3DES

                                   nil,

                                   [baseData bytes],

                                   [baseData length],

                                   buffer,              // 注意接收加密的buffer的大小

                                   dataLength,          //

                                   &dataOutOffset       //

                                   );

    

    NSString * encoding=@"";

    if (cryptorStatus == kCCSuccess) {

        NSData * data = [NSDatadataWithBytes:bufferlength:dataOutOffset];

        encoding = [data base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];

        NSLog(@"加密後的串:[%@]", encoding);

    }else

        NSLog(@"加密失敗!%d",cryptorStatus);

    

    return encoding;

    

}




最後是解密過程


//2, 解密與加密對應

- (NSString *)decryptionType:(CCAlgorithm)decryptionType decryptionStr:(NSString *)baseStr key:(NSString*)key

{

    //因爲加密後的data 是用 base64 顯示的,所以這裏要先將baseStr 用 base64解密成data。

    NSData * baseData =  [[NSDataalloc]initWithBase64EncodedString:baseStroptions:NSDataBase64DecodingIgnoreUnknownCharacters];

    NSUInteger dataLength = baseData.length +100+[keydataUsingEncoding:NSUTF8StringEncodingallowLossyConversion:YES].length;

    unsigned char buffer[dataLength];

    memset(buffer, 0,sizeof(char));

    size_t dataOffset = 0;

    

    CCCryptorStatus status =CCCrypt(kCCDecrypt,

                                     decryptionType,

                                     kCCOptionPKCS7Padding|kCCOptionECBMode,

                                     [key UTF8String],

                                     keyLength,

                                     nil,

                                     [baseData bytes],

                                     [baseData length],

                                     buffer,

                                     dataLength,

                                     &dataOffset );

    NSString * decodingStr =nil;

    if (status == 0) {

        NSData * data = [[NSDataalloc]initWithBytes:bufferlength:dataOffset];

        decodingStr =  [[NSStringalloc]initWithData:dataencoding:NSUTF8StringEncoding];

        NSLog(@"解密後的串:[%@]", decodingStr);

    }

    else

        NSLog(@"解密失敗;");

    

    return decodingStr;

//    CCCryptorStatus status = CCCrypt(CCOperation op,

//                                     CCAlgorithm alg,

//                                     CCOptions options,

//                                     const void *key,

//                                     size_t keyLength,

//                                     const void *iv,

//                                     const void *dataIn,

//                                     size_t dataInLength,

//                                     void *dataOut,

//                                     size_t dataOutAvailable,

//                                     size_t *dataOutMoved   )

}



這個加解密過程支持英文,中文,數字,特殊符號!

輸出結果
2017-10-26 10:21:13.872466+0800 Encryped[1234:363896] 加密後的串:[txy0DYBpvlac2jEh5KS0uQ==]
2017-10-26 10:21:13.872746+0800 Encryped[1234:363896] 解密後的串:[crypto]
2017-10-26 10:24:27.443502+0800 Encryped[1234:363896] 加密後的串:[iW47IPpbH5Eks1APH+ZDpaUdYV/Lb/ykqybXhOfuqUItaOOUTYFwURQpZdXt+ZpD]
2017-10-26 10:24:27.443763+0800 Encryped[1234:363896] 解密後的串:[{“加密的”:”*&^%$#~!@@abcj”}]
  • 1
  • 2
  • 3
  • 4
  • 5
看圖

源碼地址


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章