標準の 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 実装の完全な置き換えです。証明は、私が作成したカスタム ユニット テストです。