2012-04-26 11 views
0

私は、任意のサイズのパスワードを指定すると、ストリーム上で受信しているファイルをAESで暗号化する方法を探しています。物事をより簡単に始めるために、暗号化されたメッセージをファイルに書き込もうとしていました。しかし、私は問題を抱えています:CipherOutputStream + 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

This answerは、任意の長さのパスワードに基づいてキーを生成するためにSecretKeyFactoryを使用する方法を示します。

第2の問題として、cos.flush()は、最後のブロックのパッドと暗号化には不十分です。そのためにcos.close()に電話する必要があります。 Hereは、この事実を記載しているclose()メソッドのドキュメントです。

2

任意の文字列を固定長のバイナリ値に変換するために、暗号化ハッシュ(SHA-1など)を使用できます。

これは、以前私が書いた単純なファイル暗号化プログラムで行ったことです。 http://david.tribble.com/src/java/tribble/crypto/FileEncrypter.java

deriveKey()の方法を参照してください。
関連する問題