2012-01-17 9 views
13

私は数年前からWebプログラミングを行ってきました。それ以来、私はデスクトップアプリケーションのプログラミングを何もやっていませんでした。これが簡単すぎる場合は、辛抱強くお待ちください。Java:バイナリファイルの書き方は?

今私はこの状況です:
ファイルにハッシュワードを保存しようとしています。私はこれにバイナリファイルを使うべきだと思います(私が間違っていれば私を修正してください)。しかし、私はどのようにファイルに単語を書くべきか分かりません。私は多くの方法を試しましたが、ファイルを読み込んで解読しようとすると、BadPaddingExceptionとなります。

単語をファイルに書き込む方法はありますか?

PS:私は言葉(私はいくつかの変更を加えて、別のStackOverflowのスレッドからそれを得た)暗号化/復号化のために、このコードを使用します。ちょうどFileInputStreamFileOutputStreamを=使用し、

public static byte[] encrypt(String property) throws GeneralSecurityException, UnsupportedEncodingException { 
     SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBEWithMD5AndDES"); 
     SecretKey key = keyFactory.generateSecret(new PBEKeySpec(password)); 
     Cipher pbeCipher = Cipher.getInstance("PBEWithMD5AndDES"); 
     pbeCipher.init(Cipher.ENCRYPT_MODE, key, new PBEParameterSpec(salt, 20)); 
     return pbeCipher.doFinal(property.getBytes("UTF-8")); 
    } 

    public static String decrypt(byte[] property) throws GeneralSecurityException, IOException { 
     SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBEWithMD5AndDES"); 
     SecretKey key = keyFactory.generateSecret(new PBEKeySpec(password)); 
     Cipher pbeCipher = Cipher.getInstance("PBEWithMD5AndDES"); 
     pbeCipher.init(Cipher.DECRYPT_MODE, key, new PBEParameterSpec(salt, 20)); 
     return new String(pbeCipher.doFinal(property)); 
    } 
+0

'System.out.println(decrypt(encrypt ( "Hello world")))); '? – bezmax

+0

はい、動作します! –

+1

その後、I/Oコードも貼り付けてください。 – bezmax

答えて

17

まあ)を

サンプル執筆:

// encrypted data in array 
byte[] data = ... 

FileOutputStream fos = ... 
fos.write(data, 0, data.length); 
fos.flush(); 
fos.close(); 

サンプル読み:

File inputFile = new File(filePath); 
byte[] data = new byte[inputFile.length()]; 
FileInputStream fis = new FileInputStream(inputFile); 
fis.read(data, 0, data.length); 
fis.close(); 

上記のコードでは、1つのファイルに1つの暗号化されたアイテムが格納されていることを前提としています。 1つのファイルに複数の項目を保持する必要がある場合は、そのためのフォーマットスキームを考案する必要があります。たとえば、暗号化されたデータのバイト数は、データ自体の前に2バイトとして格納できます。項目あたり2バイトは、暗号化された項目が2^16バイトを超えることができないことを意味します。もちろん、長さは4バイトを使用できます。

+0

また、読み返しには? 読み取るバイトの長さを自動的に認識していますか? –

+0

FileInputStreamとそれを返すためのメソッドは 'avialable()'です。 javadocは、http://docs.oracle.com/javase/6/docs/api/java/io/FileInputStream.html – bezmax

+0

@Ako更新の回答 –

0

テキスト文書として保存するともっと意味があるように見えますが、データは既にあるので、byte[]に変換する必要はなく、ファイルから読み込む必要がある場合はかなり便利です。あなたがそれをウェブから保存しておらず、すでにソケットを通してbyte[]として来ているのでない限り。私はそれがあなたの意見を提供していないが、厳密に意見の問題は、あなたの質問の唯一の部分は、前の2つの答えが返されて残っていると知っている

+0

私は必ずしも同意しませんが、これは質問に答えません。これは、元の質問に対するコメントとしての回答よりも優れています。 – David

+0

申し訳ありません、私はこのサイトを初めて使っています。いずれにせよ、 "私はこれにバイナリファイルを使うべきだと思います(私が間違っていれば私を修正してください)。"私が返答しようとしていたものです。申し訳ありません。 –

関連する問題