2

標準の Java ツールと特定の AES アルゴリズムの BouncyCastle プロバイダーを使用して、特定のタスク固有のパラメーターで AES 暗号化を実装しました。

コードは次のとおりです。

private byte[] aesEncryptedInfo(String info) throws UnsupportedEncodingException, IllegalBlockSizeException, BadPaddingException, InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidParameterSpecException, InvalidAlgorithmParameterException, NoSuchProviderException {
    Security.addProvider(new BouncyCastleProvider());
    SecretKey secret = new SecretKeySpec(CUSTOMLONGSECRETKEY.substring(0, 32).getBytes(), "AES");
    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding", "BC");
    cipher.init(Cipher.ENCRYPT_MODE, secret, new IvParameterSpec(VECTOR_SECRET_KEY.getBytes()));
    return cipher.doFinal(info.getBytes("UTF-8"));
}

一部の環境では、このコードには特別なポリシー ファイルが必要です。関連する質問を参照してください: InvalidKeyException Illegal key size

私の目標は、サードパーティのライブラリを使用して再実装することです。理想的には、プロバイダーとして既に使用されている弾む城を使用します。ライブラリには、標準の Java ポリシー ファイルの制限があってはなりません。言い換えれば、制限があってはなりません。

BouncyCastle または言及された制限なしで機能する他のサードパーティ ライブラリを使用して再実装する方法を回答で提案してください。理想的には、コードが表示されます:-)

読んでいただきありがとうございます!

遅れて、解決策を投稿できるようになりました。Bouncy Castle のドキュメントには多くの例が含まれていないため、誰かが恩恵を受けることを願っています :-)

private byte[] aesEncryptedInfo(String info)
// Creating AES/CBC/PKCS7Padding cipher with specified Secret Key and Initial Vector
PaddedBufferedBlockCipher cipher = new PaddedBufferedBlockCipher(new CBCBlockCipher(new AESEngine()), new PKCS7Padding());
cipher.init(true, new ParametersWithIV(new KeyParameter(CUSTOMLONGSECRETKEY.getBytes()), VECTOR_SECRET_KEY.getBytes()));

byte[] inputData = info.getBytes("UTF-8");
int outBlockSize = cipher.getOutputSize(inputData.length);
byte[] outputData = new byte[outBlockSize];

int outLength = cipher.processBytes(inputData, 0, inputData.length, outputData, 0);
outLength += cipher.doFinal(outputData, outLength);
if (outLength != outBlockSize) {
    return Arrays.copyOf(outputData, outLength);
}
else {
    return outputData;
}    

}

ところで、Java API と Bouncy Castle API の間に 2 つの違いがあることを発見しました。 1. Bouncy Castle は、オブジェクトの構成を使用して必要な暗号を作成します。Java API は文字列を使用して必要な暗号を識別します。2. BC 暗号化コードはわずかに大きく、Java API コードはよりコンパクトです。

ソリューションは、元の Java API 実装の完全な置き換えです。証明は、私が作成したカスタム ユニット テストです。

4

3 に答える 3

3

Java JCE インターフェイスではなく、Bouncycastle 軽量暗号 APIを直接使用します。Bouncycastle には、パッケージ内のさまざまなクラスからアクセスできる独自の暗号化 API が含まれていorg.bouncycastle.*ます。また、JCE プロバイダー インターフェイスを実装してCipherKeyGenerator、 などの標準 JCE クラスを介して暗号実装の一部を利用できるようにします。

暗号化ポリシーの制限は、bouncycastle ではなく、JCE クラスによって適用されます。したがって、これらのクラスを使用しない場合、制限は発生しません。欠点として、移植性がいくらか犠牲になります。開始するには、AESEngineクラスの javadoc と、 bouncycastle の残りのjavadoc を参照してください

于 2010-10-11T12:14:02.157 に答える
1

必要なポリシー ファイルを追加することができないのはなぜですか?

それが一番やりやすいでしょう。米国に住んでいて、ソフトウェアを他の (「許可されていない」可能性がある) 国に輸出する場合、(理論的には) どちらの方法でも問題が発生します (ポリシー ファイルを含む/自分で暗号化を行う)。

米国外に住んでいる場合は、ポリシー ファイルを含めるだけで、気にする必要はありません。

于 2010-10-06T09:05:03.780 に答える
0

ツールキットを購入するオプションはありませんか? RSA BSAFE

于 2010-10-06T10:47:24.780 に答える