banner
李大仁博客

李大仁博客

天地虽大,但有一念向善,心存良知,虽凡夫俗子,皆可为圣贤。

[iOS]objective-cでAES/DES/3DESなどの暗号化アルゴリズムを実装

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;

}

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。