ホーム > デベロッパ > BREW FAQ

BREW FAQ : 暗号

データを暗号化/復号化する方法を教えてください。

データを暗号化/復号化する場合は、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 と実機で、未対応の暗号アルゴリズムです。

以下に、データを暗号化する手順を記載します。

  1. ISHELL_CreateInstance 関数を使用して、ICipher インターフェイスを作成します。
  2. ICIPHER_Init 関数を使用して、鍵を設定します。
  3. ICIPHER_Cipher 関数を使用して、データを暗号化します。

以下に、データを復号化する手順を記載します。

  1. ISHELL_CreateInstance 関数を使用して、ICipher インターフェイスを作成します。
  2. ICIPHER_Init 関数を使用して、鍵を設定します。
  3. 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);
}