我正在寻找一种方法,给定一个任意大小的密码,加密我通过AES
的流接收的文件。为了使事情更容易开始,我试图将一些加密的消息写入文件。但我遇到了麻烦:
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();
答案 0 :(得分:4)
This answer显示如何使用SecretKeyFactory
生成基于任意长度密码的密钥。
至于你的第二个问题,cos.flush()
不足以填充和加密最后一个块。您需要为此致电cos.close()
。 Here是close()
方法的文档,其中说明了这一事实。
答案 1 :(得分:2)
您可以使用加密哈希(例如,SHA-1)将任何字符串转换为固定长度的二进制值。
这是我在一段时间前写的简单文件加密器中所做的。
请参阅以下deriveKey()
方法:
http://david.tribble.com/src/java/tribble/crypto/FileEncrypter.java