jednym z problemów które mam to problem z zaszyfrowanym blokiem danych. W specyfikacji algorytmu 3-DES pisze, że używa bloków 64 bitowych. Więc wczytuje 64 bity (8 bajtów) z pliku i nastepnie jak używam funkcji
outputBuffer = c.doFinal(inputBuffer);
gdzie inputBuffer to 8 bajtowy ciąg niezakodowanych znaków.
po wykonaniu tej funkcji outputBuffer ma długość 16 bajtów, nie wiem dlaczego.
Kolejnym problemem to drugi odczyt bloku danych niezaszyfrowanych.
Oto kod klasy szyfrującej:
package szyfrator;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
/**
*
* @author wafcio
*/
public class cipher3des {
private SecretKey key;
private Cipher c;
private byte[] inputBuffer;
private byte[] outputBuffer;
private int offsetReader;
private int offsetWriter;
private InputStream input;
private OutputStream output;
private int eof;
public void start(String inputFile, String outputFile, String mode) {
offsetReader = 0;
offsetWriter = 0;
inputBuffer = new byte[8];
outputBuffer = new byte[8];
eof = 0;
try {
input = new FileInputStream(inputFile);
output = new FileOutputStream(outputFile);
} catch (FileNotFoundException ex) {
Logger.getLogger(cipher3des.class.getName()).log(Level.SEVERE, null, ex);
}
//three key generated
key = generateKey();
//get cipher instance
try {
c = Cipher.getInstance("DESede/" + mode + "/PKCS5Padding");
} catch (NoSuchAlgorithmException ex) {
Logger.getLogger(cipher3des.class.getName()).log(Level.SEVERE, null, ex);
} catch (NoSuchPaddingException ex) {
Logger.getLogger(cipher3des.class.getName()).log(Level.SEVERE, null, ex);
}
}
private SecretKey generateKey() {
// Get a key generator for Triple DES (a.k.a DESede)
KeyGenerator keygen = null;
try {
keygen = KeyGenerator.getInstance("DESede");
keygen.init(168);
} catch (NoSuchAlgorithmException ex) {
Logger.getLogger(cipher3des.class.getName()).log(Level.SEVERE, null, ex);
}
// Use it to generate a key
return keygen.generateKey();
}
public void encrypt() {
try {
c.init(Cipher.ENCRYPT_MODE, key);
readFile();
while(eof>-1) {
outputBuffer = c.doFinal(inputBuffer);
writeFile();
readFile();
}
} catch (IllegalBlockSizeException ex) {
Logger.getLogger(cipher3des.class.getName()).log(Level.SEVERE, null, ex);
} catch (BadPaddingException ex) {
Logger.getLogger(cipher3des.class.getName()).log(Level.SEVERE, null, ex);
} catch (InvalidKeyException ex) {
Logger.getLogger(cipher3des.class.getName()).log(Level.SEVERE, null, ex);
}
}
public void decrypt() {
try {
c.init(Cipher.DECRYPT_MODE, key);
readFile();
while(eof>-1) {
outputBuffer = c.doFinal(inputBuffer);
writeFile();
readFile();
}
} catch (IllegalBlockSizeException ex) {
Logger.getLogger(cipher3des.class.getName()).log(Level.SEVERE, null, ex);
} catch (BadPaddingException ex) {
Logger.getLogger(cipher3des.class.getName()).log(Level.SEVERE, null, ex);
} catch (InvalidKeyException ex) {
Logger.getLogger(cipher3des.class.getName()).log(Level.SEVERE, null, ex);
}
}
private void readFile() {
for(int i = 0; i<inputBuffer.length; i++) {
inputBuffer[i] = 0;
outputBuffer[i] = 0;
}
try {
eof = input.read(inputBuffer, offsetReader, 8);
offsetReader += eof;
} catch (IOException ex) {
Logger.getLogger(cipher3des.class.getName()).log(Level.SEVERE, null, ex);
}
}
private void writeFile() {
try {
output.write(outputBuffer, offsetWriter, eof);
offsetWriter += eof;
} catch (IOException ex) {
Logger.getLogger(cipher3des.class.getName()).log(Level.SEVERE, null, ex);
}
}
}