1

オーディオファイルを暗号化し、必要に応じて復号化する必要があるプログラムがあります。.binや.txtなど、他の種類のファイルでプログラムをテストしました。私が得る問題は、ソースファイルに「010101」が含まれ、暗号化-復号化後に「¬íw0w010101」が含まれるなど、実際のコンテンツの前に復号化されたファイルに奇妙な文字が含まれていることです。

私の暗号化方法のコードはここにあります:

public void cipherTheAudioFile(String fileDir, String fileToCipher) throws            FileNotFoundException, IOException, NoSuchAlgorithmException, InvalidKeySpecException,  InvalidKeyException, NoSuchPaddingException {
    File audioSourceFile = new File(fileDir + "\\" + fileToCipher);
    ObjectOutputStream oos = new ObjectOutputStream(
        new CipherOutputStream(new FileOutputStream(
            new java.io.File("").getAbsolutePath().toString() + "/encrypted/" + fileToCipher + ".sky"), cipher));

    byte[] audioFileInBytes = FileUtils.readFileToByteArray(audioSourceFile);
    oos.write(audioFileInBytes);

    fos = new FileOutputStream(KEY_FILE);
    SecretKeyFactory skf = SecretKeyFactory.getInstance(ENCRYPTION_ALGORITHM);
    DESKeySpec keyspec = (DESKeySpec) skf.getKeySpec(key, DESKeySpec.class);
    fos.write(keyspec.getKey());

    fos.close();
    oos.close();
}

私の復号化メソッドコードはここにあります:

public void decryptTheAudioFile(String fileDir, String fileToDecipher) throws NoSuchAlgorithmException, NoSuchPaddingException, FileNotFoundException, IOException, ClassNotFoundException, InvalidKeySpecException, InvalidKeyException {
    fis = new FileInputStream(keyFile);
    byte[] keyspecbytes = new byte[fis.available()];

    File fileToWriteIn = createFileToWriteIn(fileDir, fileToDecipher);

    fis.read(keyspecbytes);
    SecretKeyFactory skf = SecretKeyFactory.getInstance(encryptionAlgorithm);
    DESKeySpec keyspec = new DESKeySpec(keyspecbytes);
    SecretKey key = skf.generateSecret(keyspec);
    Cipher cipher = Cipher.getInstance(encryptionAlgorithm);
    cipher.init(Cipher.DECRYPT_MODE, key);

    ObjectInputStream ois = new ObjectInputStream(
        new CipherInputStream(
            new FileInputStream(new java.io.File("").getAbsolutePath().toString() + "/encrypted/" + fileToDecipher + ".sky"), cipher));
    ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(fileToWriteIn));

    byte[] audioFileInBytes = new byte[1024];

    int numRead = 0;
    while ((numRead = ois.read(audioFileInBytes)) >= 0) {
        oos.write(audioFileInBytes, 0, numRead);
    }

    oos.close();
    fis.close();
    ois.close();
}

PSエンコーディングに問題がある可能性がありますが、よくわかりません。

編集済み

OK、FileWritersに変更しましたが、まだ変更はありません。コードは次のとおりです。

 OutputStream os = new FileOutputStream(new java.io.File("").getAbsolutePath().toString() + "/encrypted/" + fileToCipher + ".sky");
    CipherInputStream cis = new CipherInputStream(new FileInputStream(audioSourceFile), cipher);
    byte[] audioFileInBytes = new byte[1024];
    int numRead = 0;
    while ((numRead = cis.read(audioFileInBytes)) >= 0) {
            os.write(audioFileInBytes, 0, numRead);
    }

同様に、復号化機能も使用されます。

4

2 に答える 2

2

問題は、decryptTheAudioFileメソッドがファイルを書き込む方法にあります。具体的には、問題はそれがを使用していることですObjectOutputStream。これは、オブジェクトのシリアル化ヘッダーを追加することです。しかし、それはまったくそこに属していません。

解決策はこれを取り除くことですdecryptTheAudioFile

ObjectOutputStream oos = new ObjectOutputStream(
         new FileOutputStream(fileToWriteIn));

これに置き換えます:

OutputStream os = new FileOutputStream(fileToWriteIn);

残りのコードを変更して、に書き込みosます。コードは、でファイルを読み取る方法を反映する必要がありますcipherTheAudioFile


他のObjectStreamインスタンスも削除し、単純に読み取りと書き込みを行うことをお勧めしますStreams。他ObjectStreamのものは(ほとんど)無害ですが、実際には何も達成しません。

于 2012-10-18T13:27:11.530 に答える
0

すべてのObjectOutputStreamsとObjectInputStreamsを削除します。あなたはバイト配列を書いているので、それらは不要です。表示される余分なバイトは、おそらくbyte[]のタイプとサイズを示しています。

于 2012-10-18T12:54:45.693 に答える