web-dev-qa-db-ja.com

BouncyCastleプロバイダーによるAES暗号化/復号化

これは、JDK5のネイティブライブラリで開発されたAES256暗号化および復号化の実装です。

public static String encrypt(String key, String toEncrypt) throws Exception {
    Key skeySpec = generateKeySpec(key);
    Cipher cipher = Cipher.getInstance("AES");
    cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
    byte[] encrypted = cipher.doFinal(toEncrypt.getBytes());
    byte[] encryptedValue = Base64.encodeBase64(encrypted);
    return new String(encryptedValue);
}

public static String decrypt(String key, String encrypted) throws Exception {
    Key skeySpec = generateKeySpec(key);
    Cipher cipher = Cipher.getInstance("AES");
    cipher.init(Cipher.DECRYPT_MODE, skeySpec);
    byte[] decodedBytes = Base64.decodeBase64(encrypted.getBytes());
    byte[] original = cipher.doFinal(decodedBytes);
    return new String(original);
}

Boucy Castle API(Java)で同じメソッドを実装したい:私はたくさん検索し、たくさんテストしましたが、結果はありません...誰かが私を助けてくれますか?

ありがとう

8
fikouRaf

あなたはどちらかを使用します

_Security.addProvider(new BouncyCastleProvider());
Cipher cipher = Cipher.getInstance("AES", "BC");
_

またはそうでなければ

_Cipher cipher = Cipher.getInstance("AES", new BouncyCastleProvider());
_

とはいえ、Cipher.getInstance("AES")Electronic Codebook を使用しますが、これは安全ではありません。暗号ブロック連鎖(Cipher.getInstance("AES/CBC/PKCS5Padding"))またはカウンター(Cipher.getInstance("AES/CTR/NoPadding"))モードのいずれかが必要です。これらは両方とも安全です。主な違いは、CBCにはパディングが必要ですが、CTRにはパディングが必要ないことです。

22