0

我正在寻找一种方法,给定任何大小的密码,加密我通过流接收的文件AES。为了让事情更容易开始,我试图将一些加密消息写入文件。但我遇到了麻烦:

  1. 我希望能够定义任何大小的密码。是否可以以“标准”形式完成它,还是我必须将密码填充到 2^k 大小?我目前正在绕过提供临时“aaaaaaaaaaaaaaaa”密码的问题,但我想尽快摆脱它。
  2. 如果我尝试将长字符串写入cos,则会将加密的内容写入文件。但是如果我尝试一些更小的东西,比如“abc”,什么都不会写。我玩过几个填充选项,但它们似乎无济于事(PKCS5Padding、SSL3Padding、NoPadding)。

这是我正在使用的代码:

    SecretKeySpec localSecretKeySpec = new SecretKeySpec("aaaaaaaaaaaaaaaa".getBytes(), "AES");
    Cipher localCipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
    localCipher.init(Cipher.ENCRYPT_MODE, localSecretKeySpec);

    CipherOutputStream cos = new CipherOutputStream(new FileOutputStream("abc"), localCipher);
    IOUtils.write("abc", cos);
    cos.flush();
4

2 回答 2

4

这个答案显示了如何使用 aSecretKeyFactory根据任意长度的密码生成密钥。

至于你的第二个问题,cos.flush()不足以填充和加密最后一个块。你需要为此打电话cos.close()close()是说明这一事实的方法的文档。

于 2012-04-26T21:23:35.963 回答
2

您可以使用加密哈希(例如,SHA-1)将任何字符串转换为固定长度的二进制值。

这就是我在前段时间写的一个简单的文件加密器中所做的。请参阅中的deriveKey()方法: http ://david.tribble.com/src/java/tribble/crypto/FileEncrypter.java

于 2012-04-26T23:25:33.130 回答