データを暗号化/復号化する方法を教えてください。
データを暗号化/復号化する場合は、ICipher インターフェイスの ICIPHER_Cipher 関数を使用します。 ICipher インターフェイスは、以下の暗号アルゴリズムに対応しています。
暗号アルゴリズム | 説明 |
---|---|
ArcFour | 平文 (暗号化されていないデータ) を 1 ビット、または数ビットごとに暗号化/復号化する暗号アルゴリズムです。 このように、ビット単位で暗号化するアルゴリズムを使用する暗号を、ストリーム暗号といいます。ArcFourは、RC4 互換の暗号アルゴリズムです。 |
DES | 平文を 64 ビット単位のブロックに分割して暗号化/復号化する暗号アルゴリズムです。 (64 ビットのうち 8 ビットをパリティとして使用するので、実際の鍵のがさは 56 ビットです。) このように、ブロック単位に分割してから暗号化するアルゴリズムを使用する暗号を、 ブロック暗号といいます。※ |
トリプル DES | 共通鍵暗号方式である DES を3回繰り返すことで、暗号強度を高めている暗号アルゴリズムです。※ |
上記の暗号アルゴリズムを使用する場合は、 以下のクラス ID を指定して ICipher インターフェイスを作成します。
クラス ID | 説明 |
---|---|
AEECLSID_ARC4 | ArcFour (RC4 互換) 暗号アルゴリズムを使用して暗号化/復号化します。 |
AEECLSID_DES_ENCRYPT | DES 暗号アルゴリズムを使用して暗号化します。※ |
AEECLSID_DES_DECRYPT DES | 暗号アルゴリズムを使用して復号化します。※ |
AEECLSID_3DES_ENCRYPT | トリプル DES 暗号アルゴリズムを使用して暗号化します。※ |
AEECLSID_3DES_DECRYPT | トリプル DES 暗号アルゴリズムを使用して復号化します。※ |
※ A5304T、BREW SDK 2.1 以前の全てのSDK と実機で、未対応の暗号アルゴリズムです。
以下に、データを暗号化する手順を記載します。
- ISHELL_CreateInstance 関数を使用して、ICipher インターフェイスを作成します。
- ICIPHER_Init 関数を使用して、鍵を設定します。
- ICIPHER_Cipher 関数を使用して、データを暗号化します。
以下に、データを復号化する手順を記載します。
- ISHELL_CreateInstance 関数を使用して、ICipher インターフェイスを作成します。
- ICIPHER_Init 関数を使用して、鍵を設定します。
- ICIPHER_Cipher 関数を使用して、データを復号化します。
SophiaFramework では、 SFBCipher::Cipher 関数を使用します。
[ BREW API のみを使用したコード ]
// 暗号化、復号化で使用する鍵を決めます。 char key[] = {"Key Cipher"}; int keySize = strlen(key); // IShell インターフェイスを取得します。 IShell* shell = app->a.m_pishell; // ICipher インターフェイスを作成します。 // ArcFour (RC4 互換) 方式で暗号化します。 ICipher* cipher; ISHELL_CreateInstance(shell, AEECLSID_ARC4, &cipher); // 暗号化で使用する鍵を設定します。 if (SUCCESS == icipher_init(cipher, key, keysize)) { char srcData[] = {"Cipher"}; int size = strlen(src_data) + 1; byte* encData = (byte*)malloc(size); byte* decData = (byte*)malloc(size); // 暗号化する前のデータを出力します。 DBGPRINTF("srcData -- %s", srcData); // 暗号化します。 ICIPHER_Cipher(cipher, srcData, size, encData, &size); // 暗号化したデータを出力します。 DBGPRINTF("encData -- %s", encData); // 復号化で使用する鍵を設定します。 ICIPHER_Init(cipher, key, keySize); // 復号化します。 ICIPHER_Cipher(cipher, encData, size, decData, &size); // 復号化したデータを出力します。 DBGPRINTF("decData -- %s", decData); // バッファを解放します。 FREE(encData); FREE(decData); } // ICipher インターフェイスを解放します。 ICIPHER_Release(cipher);
[ SophiaFramework を使用したコード ]
// 暗号化、復号化で使用する鍵を決めます。 AChar key[] = "Key Cipher"; SIntN keySize = sfxhelper::strlen(key); // SFBCipher のインスタンスを作成します。 // ArcFour (RC4 互換) 方式で暗号化を行います。 SFBCipherSmp cipher = sfbcipher::newinstance(aeeclsid_arc4); // 暗号化で使用する鍵を設定します。 if (SUCCESS == cipher->init(key, keysize)) { SFXAnsiString srcData("Cipher"); SInt32 size = srcdata.getlength() + 1; VoidPtr encData = memoryallocate(size); VoidPtr decData = memoryallocate(size); // 暗号化する前のデータを出力します。 DBGPRINTF("srcData -- %s", srcData.GetCString()); // 暗号化します。 cipher->Cipher(srcData.GetBuffer(), size, encData, &size); // 暗号化したデータを出力します。 DBGPRINTF("encData -- %s", (char*)encData); // 復号化で使用する鍵を設定します。 cipher->Init(key, keySize); // 復号化します。 cipher->Cipher(encData, size, decData, &size); // 復号化したデータを出力します。 DBGPRINTF("decData -- %s", (char*)decData); // バッファを解放します。 MemoryFree(encData); MemoryFree(decData); }