我有一個程序必須加密音頻文件,然後解密它,如果需要。我測試了一些其他類型的文件,如.bin或.txt。我得到的問題是,解密文件在實際內容之前有一些奇怪的字符,例如源文件包含「010101」,並且在加密之後,解密文件具有「¬íw0w010101」。破解Java解密文件
我的加密方法的代碼放在這裏:
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();
}
附:這可能與編碼有關,但我不確定。
編輯
好吧,我已經改爲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);
}
同樣的解密器。
如果您懷疑編碼可能是原因,那麼在文本文件的情況下,輸入文件可能是帶有BOM的UTF-8和不帶BOM的輸出UTF-8。 Wiki(http://en.wikipedia.org/wiki/UTF-8):許多Windows程序(包括Windows記事本)在保存爲UTF-8的任何文檔的開始處添加字節0xEF,0xBB,0xBF。 – Indrek
是的,我測試了.txt文件,但我的實際任務是針對.mp3當我解密.mp3文件時,我收到的東西聽起來更像是dubstep,但不是實際的音頻文件。 :) – user
有些人喜歡dubstep。對他們來說,這可能是一個有效的加密/解密鏈。 :P – brimborium