objective-c 對 AES/DES/3DES 等加密提供了統一的加密方法 CCCrypt 進行實現,目前主要支持的算法有
@constant kCCAlgorithmAES128 進階加密標準 @constant kCCAlgorithmAES 進階加密標準,128 位區塊 @constant kCCAlgorithmDES 數據加密標準 @constant kCCAlgorithm3DES 三重 DES,三個密鑰,EDE 配置 @constant kCCAlgorithmCAST CAST @constant kCCAlgorithmRC4 RC4 流密碼 @constant kCCAlgorithmBlowfish Blowfish 區塊密碼
/*!
@enum       CCAlgorithm
@abstract   本模組實現的加密算法。
@constant   kCCAlgorithmAES128  進階加密標準,128位區塊
                                這是出於歷史原因保留的。現在
                                更建議使用kCCAlgorithmAES,因為
                                128位區塊是標準的一部分。
@constant   kCCAlgorithmAES     進階加密標準,128位區塊
@constant   kCCAlgorithmDES     數據加密標準
@constant   kCCAlgorithm3DES    三重DES,三個密鑰,EDE配置
@constant   kCCAlgorithmCAST    CAST
@constant   kCCAlgorithmRC4     RC4 流密碼
@constant   kCCAlgorithmBlowfish    Blowfish 區塊密碼
*/
enum {
kCCAlgorithmAES128 = 0,
kCCAlgorithmAES = 0,
kCCAlgorithmDES,
kCCAlgorithm3DES,
kCCAlgorithmCAST,
kCCAlgorithmRC4,
kCCAlgorithmRC2,
kCCAlgorithmBlowfish
};
以下是 DES 的代碼實現,可供使用的加密算法有 des,3des,aes 等,根據需要替換相應的參數即可。
- (NSString*) des:(NSString*) key
{
const char *cstr = [self cStringUsingEncoding];
NSData *data = [NSData dataWithBytes length.length];
CCCryptorStatus ccStatus;
uint8\_t \*dataOut = NULL;
size\_t dataOutAvailable = 0; //size\_t  是操作符sizeof返回的結果類型
size\_t dataOutMoved = 0;
dataOutAvailable = (data.length + kCCBlockSizeDES) & ~(kCCBlockSizeDES - 1);
dataOut = malloc( dataOutAvailable \* sizeof(uint8\_t));
memset((void \*)dataOut, 0x0, dataOutAvailable);//將已開辟內存空間buffer的首 1 個字節的值設為值 0
NSString \*initIv = key;
const void \*vkey = (const void \*) \[key UTF8String\];
const void \*iv = (const void \*) \[initIv UTF8String\];
//CCCrypt函數 加密/解密
ccStatus = CCCrypt(kCCEncrypt,               //  加密/解密
                   kCCAlgorithmDES,          //  加密根據哪個標準(des,3des,aes。。。。)
                   kCCOptionPKCS7Padding,    //  選項分組密碼算法(des:對每塊分組加一次密  3DES:對每塊分組加三個不同的密)
                   vkey,                     //  密鑰
                   kCCKeySizeDES,            //  DES 密鑰的大小(kCCKeySizeDES=8)
                   iv,                       //  可選的初始矢量
                   \[data bytes\],             //  數據的存儲單元
                   data.length,              // 數據的大小
                   (void \*)dataOut,          // 用於返回數據
                   dataOutAvailable,
                   &dataOutMoved);
NSString \*result = \[\[\[NSString alloc\] initWithData:\[NSData dataWithBytes:(const void \*)dataOut length:(NSUInteger)dataOutMoved\] encoding:NSUTF8StringEncoding\] autorelease\];
return result;
}
配合 Base64 方式使用
- (NSString*) des_base64:(NSString*) key
{
const char *cstr = [self cStringUsingEncoding];
NSData *data = [NSData dataWithBytes length.length];
CCCryptorStatus ccStatus;
uint8\_t \*dataOut = NULL;
size\_t dataOutAvailable = 0; //size\_t  是操作符sizeof返回的結果類型
size\_t dataOutMoved = 0;
dataOutAvailable = (data.length + kCCBlockSizeDES) & ~(kCCBlockSizeDES - 1);
dataOut = malloc( dataOutAvailable \* sizeof(uint8\_t));
memset((void \*)dataOut, 0x0, dataOutAvailable);//將已開辟內存空間buffer的首 1 個字節的值設為值 0
NSString \*initIv = key;
const void \*vkey = (const void \*) \[key UTF8String\];
const void \*iv = (const void \*) \[initIv UTF8String\];
//CCCrypt函數 加密/解密
ccStatus = CCCrypt(kCCEncrypt,               //  加密/解密
                   kCCAlgorithmDES,          //  加密根據哪個標準(des,3des,aes。。。。)
                   kCCOptionPKCS7Padding,    //  選項分組密碼算法(des:對每塊分組加一次密  3DES:對每塊分組加三個不同的密)
                   vkey,                     //  密鑰
                   kCCKeySizeDES,            //  DES 密鑰的大小(kCCKeySizeDES=8)
                   iv,                       //  可選的初始矢量
                   \[data bytes\],             //  數據的存儲單元
                   data.length,              // 數據的大小
                   (void \*)dataOut,          // 用於返回數據
                   dataOutAvailable,
                   &dataOutMoved);
NSData \*dataFor = \[NSData dataWithBytes:(const void \*)dataOut length:(NSUInteger)dataOutMoved\];
NSString \*result = \[GTMBase64 stringByEncodingData:dataFor\];
return result;
}