使用CipherOutputStream + AES将字符串写入文件

时间:2012-04-26 20:43:04

标签: java security encryption

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

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

        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();
    

2 个答案:

答案 0 :(得分:4)

This answer显示如何使用SecretKeyFactory生成基于任意长度密码的密钥。

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

答案 1 :(得分:2)

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

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