14

谁能向我展示(或提供链接)如何使用充气城堡在 Java 中加密文件的示例?我查看了 bouncycastle.org,但找不到任何有关其 API 的文档。即使只是知道要使用哪些类也会对我入门有很大帮助!

4

5 回答 5

20

您要执行哪种类型的加密?基于密码 (PBE)、对称、非对称?一切都取决于您如何配置Cipher

您不必使用任何 BouncyCastle 特定的 API,只需使用它提供的算法即可。下面是一个使用 BouncyCastle PBE 密码加密字符串的示例:

import java.security.SecureRandom;
import java.security.Security;

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.PBEKeySpec;

import org.bouncycastle.jce.provider.BouncyCastleProvider;

public class PBE {

    private static final String salt = "A long, but constant phrase that will be used each time as the salt.";
    private static final int iterations = 2000;
    private static final int keyLength = 256;
    private static final SecureRandom random = new SecureRandom();

    public static void main(String [] args) throws Exception {
        Security.insertProviderAt(new BouncyCastleProvider(), 1);

        String passphrase = "The quick brown fox jumped over the lazy brown dog";
        String plaintext = "hello world";
        byte [] ciphertext = encrypt(passphrase, plaintext);
        String recoveredPlaintext = decrypt(passphrase, ciphertext);

        System.out.println(recoveredPlaintext);
    }

    private static byte [] encrypt(String passphrase, String plaintext) throws Exception {
        SecretKey key = generateKey(passphrase);

        Cipher cipher = Cipher.getInstance("AES/CTR/NOPADDING");
        cipher.init(Cipher.ENCRYPT_MODE, key, generateIV(cipher), random);
        return cipher.doFinal(plaintext.getBytes());
    }

    private static String decrypt(String passphrase, byte [] ciphertext) throws Exception {
        SecretKey key = generateKey(passphrase);

        Cipher cipher = Cipher.getInstance("AES/CTR/NOPADDING");
        cipher.init(Cipher.DECRYPT_MODE, key, generateIV(cipher), random);
        return new String(cipher.doFinal(ciphertext));
    }

    private static SecretKey generateKey(String passphrase) throws Exception {
        PBEKeySpec keySpec = new PBEKeySpec(passphrase.toCharArray(), salt.getBytes(), iterations, keyLength);
        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBEWITHSHA256AND256BITAES-CBC-BC");
        return keyFactory.generateSecret(keySpec);
    }

    private static IvParameterSpec generateIV(Cipher cipher) throws Exception {
        byte [] ivBytes = new byte[cipher.getBlockSize()];
        random.nextBytes(ivBytes);
        return new IvParameterSpec(ivBytes);
    }

}
于 2010-01-12T20:47:58.657 回答
3

您可以在http://bouncycastle.org/docs/docs1.6/index.html查看 java 文档

您可以从此页面下载示例: http: //eu.wiley.com/WileyCDA/WileyTitle/productCd-0764596330,descCd-DOWNLOAD.html

于 2010-01-12T20:49:00.977 回答
2

如果您没有使用 BouncyCastle 的任何特殊原因,您可以在此处找到有关 Java 内置加密支持的良好教程和背景信息以及几个代码示例。

于 2010-01-12T20:54:44.493 回答
1

查找 Bouncy Castle java 代码示例的最佳位置是通过Bouncy Castle 最新版本 java的测试套件中的测试用例

这些测试套件包含可轻松使用的非弃用代码

于 2012-07-25T04:17:22.680 回答
0

虽然这是对您的问题的间接回答,但也许您会发现使用 jasypt 处理加密很有用。

这是一个如何使用 jasypt 加密文件的示例: http ://www.jasypt.org/encrypting-configuration.html

而且,这里是如何将充气城堡配置为 jasypt 的提供者: http ://www.jasypt.org/bouncy-castle.html

于 2010-01-12T20:48:38.043 回答