objective-c は AES/DES/3DES などの暗号化を実現するために、統一された暗号化メソッド CCCrypt を提供しています。現在、主にサポートされているアルゴリズムは以下の通りです。
@constant kCCAlgorithmAES128 Advanced Encryption Standard @constant kCCAlgorithmAES Advanced Encryption Standard, 128-bit block @constant kCCAlgorithmDES Data Encryption Standard @constant kCCAlgorithm3DES Triple-DES, three key, EDE configuration @constant kCCAlgorithmCAST CAST @constant kCCAlgorithmRC4 RC4 stream cipher @constant kCCAlgorithmBlowfish Blowfish block cipher
/*!
@enum CCAlgorithm
@abstract このモジュールで実装された暗号化アルゴリズム。
@constant kCCAlgorithmAES128 Advanced Encryption Standard, 128-bit block
歴史的な理由から保持されています。現在はkCCAlgorithmAESを使用することが推奨されています。
@constant kCCAlgorithmAES Advanced Encryption Standard, 128-bit block
@constant kCCAlgorithmDES Data Encryption Standard
@constant kCCAlgorithm3DES Triple-DES, three key, EDE configuration
@constant kCCAlgorithmCAST CAST
@constant kCCAlgorithmRC4 RC4 stream cipher
@constant kCCAlgorithmBlowfish Blowfish block cipher
*/
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:各ブロックに対して1回の暗号化 3DES:各ブロックに対して3つの異なる鍵で暗号化)
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:各ブロックに対して1回の暗号化 3DES:各ブロックに対して3つの異なる鍵で暗号化)
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;
}