4

バウンシーキャッスルでAESアルゴリズムを使用してJ2MEでデータを暗号化および復号化したいのですが、そのためのサンプルコードを教えてください。

PKCS5PaddingでECBを使いたい

前もって感謝します。

4

1 に答える 1

20

そこに例があると確信していますが、私はそれらを見つけていません。始めるのに役立つヒントをいくつか紹介します。BCクラスを相互に接続する方法を学ぶ必要があります。まず、弾力のある城のソースコードを入手し、質問があるときにそれを見る準備をします。それは実際には非常に読みやすいので、ドキュメントが貧弱なときにそれを調べることを恐れないでください。たとえば、多くのクラスはCipherParametersオブジェクトのインスタンスを必要としますが、ドキュメントでこれ以上の詳細を指定することはめったにありません。ただし、ソースコードでは、どの実装クラスが期待されているかは明らかです。

たとえばAESEngine、暗号化エンジンとしてAESエンジンの1つを選択します。次にモードを選択します。ECBが正しいことはめったにないため、たとえばCBCモードを選択した場合は、CBCBlockCipherオブジェクトからオブジェクトを作成しAESEngineます。次に、このオブジェクトを使用してオブジェクトを作成しPaddedBufferBlockCipherます。デフォルトのコンストラクターは、必要なPKCS5パディングと同じPKCS7パディングを使用します。次に、キーとIVを保持するオブジェクトを作成する必要があります。これがCipherParametersインターフェースです。オブジェクトは2つのステップで作成します。まず、KeyParameterキーを使用してオブジェクトを作成します。次に、オブジェクトとIVを使用してParametersWithIVオブジェクトを作成します。KeyParameterこのオブジェクトはオブジェクトのinitメソッドに提供され、PaddedBufferBlockCipher準備が整います。

編集

ここに小さな例があります:

private static byte[] cipherData(PaddedBufferedBlockCipher cipher, byte[] data)
        throws Exception
{
    int minSize = cipher.getOutputSize(data.length);
    byte[] outBuf = new byte[minSize];
    int length1 = cipher.processBytes(data, 0, data.length, outBuf, 0);
    int length2 = cipher.doFinal(outBuf, length1);
    int actualLength = length1 + length2;
    byte[] result = new byte[actualLength];
    System.arraycopy(outBuf, 0, result, 0, result.length);
    return result;
}

private static byte[] decrypt(byte[] cipher, byte[] key, byte[] iv) throws Exception
{
    PaddedBufferedBlockCipher aes = new PaddedBufferedBlockCipher(new CBCBlockCipher(
            new AESEngine()));
    CipherParameters ivAndKey = new ParametersWithIV(new KeyParameter(key), iv);
    aes.init(false, ivAndKey);
    return cipherData(aes, cipher);
}

private static byte[] encrypt(byte[] plain, byte[] key, byte[] iv) throws Exception
{
    PaddedBufferedBlockCipher aes = new PaddedBufferedBlockCipher(new CBCBlockCipher(
            new AESEngine()));
    CipherParameters ivAndKey = new ParametersWithIV(new KeyParameter(key), iv);
    aes.init(true, ivAndKey);
    return cipherData(aes, plain);
}
于 2010-11-22T14:17:27.457 に答える