11

私が取り組んでいるプロジェクトには、AES 暗号化と復号化を必要とするセグメントがあります。私が調べたすべての可能なインターネット ソースから、Sun の (現在の Oracle の Web サイト) から Unlimited Strength JCE ファイルをダウンロードしてインストールすることなく、AES256 暗号化への参照を見つけるのは困難でした。同じものの配布に存在する法的問題に加えて、エンドユーザーに特定のWebサイトにアクセスしていくつかのファイルをダウンロードし、それらをディレクトリに配置してからクラスパスに追加するように依頼する場合、実際にはあまり役に立ちません。 Windowsなどで!

BountyCastle の軽量 API への参照がインターネット上にいくつかありましたが、JCE ファイルを必要としない可能性がありますが、関連性の高い参照やそれを示す例を探すことができませんでした。

確かではありませんが、これは他のすべてのプログラミング言語の問題ですか?

特定の JCE ファイルがインストールされていないと AES 256 ビット暗号化を使用できない場合、JNI アプローチは役立ちますか?

少し詳しく説明すると、C/C++ で AES 256 暗号化を行うことができますか?その後、JNI を使用してそれらを呼び出して、目的の結果を得ることができますか? ソフトウェアを (jar ファイルとして) パッケージ化することは懸念の原因になりますか、それとも他の問題がある可能性がありますか?

もう 1 つの重要な要素は、プロジェクトが Mac と Windows の両方で実行されることです。そのため、C/C++ (特定のコンパイラ/インタープリターのバージョンなど) を使用する際の制限になる可能性があります。

これを処理する別の方法はありますか?他のアプローチはありますか?

4

2 に答える 2

6

キー サイズ制限はCipher、Java のクラスで実装されます。AES を実装する他のクラスを使用して、AES-256 機能を取得することができます。たとえば、Bouncy Castleの「軽量」APIを使用して、任意の強度の鍵サイズを使用することができます。その場合、たとえば、org.bouncycastle.crypto.engines.AESFastEngine直接 (および選択したモードパディング) を使用できます。Bouncy Castleの通常を使用することは引き続き可能.jarですが、BouncyCastle プロバイダーの JCA 機能は使用しません。

これには、いくつかの欠点と利点があります。軽量の Bouncy Castle API は、"BC"プロバイダによって Sun クラスに追加された JCA 機能よりもやや低レベルです。さらに、多くのコンポーネント (Java 内の SSL レイヤー、JSSE、または XML 暗号化ライブラリーなど) が JCA を使用して、必要な暗号化機能を提供します。JCA 機能を必要とするライブラリは、制限されたキー サイズに引き続き制限されます。

クラス自体がキーのサイズをチェックするため、他のプロバイダーを使用しても機能しないことに注意してください。JCA プロバイダー内に含まれている可能性Cipherのある実装クラスは、許可されるキー サイズに (積極的に) 影響を与えることはできません。CipherSpi実装クラスのみを直接使用できます。

于 2013-03-23T15:39:31.713 に答える
5

まず第一に、それはすべてのプログラミング環境で問題ではありません。Cで記述されたOpenSSLは、たとえば大きなキーをサポートしています。ただし、JCEとJNIの両方の経験から、JNIを介してネイティブライブラリをロードする代わりに、純粋なJavaを使用する方法を見つけることをお勧めします。とても簡単です。

実用的な解決策: インストール中に、ある種のインストーラーアプリケーションを使用してアプリケーションをインストールしますか?その場合、1つの解決策は、このインストーラーを使用してJCEもインストールすることです。

BouncyCastleは、残念ながら、 FAQに記載されているようにJCEも使用しています。

更新1: あなたが探しているものかもしれないこのライブラリを見つけました。しかし、それはもはや維持されていないようです:http ://www.cryptix.org/

更新2: GNUには、AES256を実装するライブラリがあります:http ://www.gnu.org/software/gnu-crypto/ 。利用可能な暗号の詳細については、http ://www.gnu.org/software/gnu-crypto/manual/Ciphers.htmlをご覧ください。

すでにキーがロードされている場合のGNU-Cryptoを使用したコード例key_bytes

IBlockCipher cipher = CipherFactory.getInstance("AES");
Map attributes = new HashMap();
attributes.put(IBlockCipher.CIPHER_BLOCK_SIZE, new Integer(16));
attributes.put(IBlockCipher.KEY_MATERIAL, key_bytes);
cipher.init(attributes);
int bs = cipher.currentBlockSize();

for (int i = 0; i + bs < pt.length; i += bs)
{
    cipher.encryptBlock(pt, i, ct, i);
}

for (int i = 0; i + bs < cpt.length; i += bs)
{
    cipher.decryptBlock(ct, i, cpt, i);
}

SecureRandomなどの暗号的に安全な乱数ジェネレーターを使用して、キー用の256バイトを作成していることを確認してください。

byte[] seed = xxx; // Be sure to get a good new seed on every client machine.
SecureRandom random = new SecureRandom(seed);
byte[] key_bytes = new byte[256];
random.nextBytes(key_bytes);
于 2013-03-21T15:24:34.820 に答える