Algorytm szyfrujący: DESede (Triple DES), tryb ECB
Przy szyfrowaniu i deszyfrowaniu korzystam z providera SunJCE
szyfrowanie odbywa się normalnie przy wykorzystaniu metody update, ale od razu po zaszyfrowaniu chciałem sprawdzić, czy tekst zaszyfrowany jest poprawny, więc zainicjalizowałem Cipher.DECRYPT_MODE, i przy wykonaniu pierwszego update, bufor wynikowy był pusty, za drugim razem dane były prawidłowe, a za trzecim razem, dane były jeszcze inne (bufor wejściowy za każdym razem był taki sam i wynosił 8 bajtów).
oto moj kod:
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package szyfratorworkspace;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.spec.InvalidKeySpecException;
import java.util.Arrays;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.crypto.Cipher;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.PBEParameterSpec;
/**
*
* @author wafcio
*/
public class cip {
private String mode;
private String password;
private SecretKey encKey;
private char[] pass;
private PBEParameterSpec paramSpec;
private Cipher cp;
private String message;
private byte[] inputBuffer;
private byte[] outputBuffer;
private byte[] hide;
public void encrypt(String mode, String password) {
System.out.println("SZYFROWANIE");
this.mode = mode;
this.password = password;
encKey = this.passwordToSecretKey();
try {
cp = Cipher.getInstance(encKey.getAlgorithm());
c = Cipher.getInstance("DESede/" + mode + "/PKCS5Padding");
cp.init(Cipher.ENCRYPT_MODE, encKey, paramSpec);
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);
} catch (InvalidKeyException ex) {
Logger.getLogger(cip.class.getName()).log(Level.SEVERE, null, ex);
} catch (InvalidAlgorithmParameterException ex) {
Logger.getLogger(cip.class.getName()).log(Level.SEVERE, null, ex);
}
message = "ala ma k";
inputBuffer = message.getBytes();
outputBuffer = cp.update(inputBuffer);
System.out.println("Wiadomosc niezaszyforwana: " + message);
System.out.println("Wiadomosc niezaszyforwana bajtowo: " + Arrays.toString(inputBuffer));
System.out.println("Wiadomosc zaszyforwana bajtowo: " + Arrays.toString(outputBuffer));
hide = outputBuffer;
}
private SecretKey passwordToSecretKey() {
byte[] salt = {
(byte)0xA9, (byte)0x9B, (byte)0xC8, (byte)0x32,
(byte)0x56, (byte)0x35, (byte)0xE3, (byte)0x03
};
int iterationCount = 19;
int len = 24;
pass = new char[len];
int pos = 0;
while(pos < len) {
System.arraycopy(password.toCharArray(), 0, pass, pos, password.length());
pos += password.length();
}
SecretKey secretKey = null;
PBEKeySpec pbeKeysPass = null;
try {
pbeKeysPass = new PBEKeySpec(pass, salt, iterationCount);
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBEWithSHA1AndDESede");
secretKey = factory.generateSecret(pbeKeysPass);
} catch (NoSuchAlgorithmException ex) {
Logger.getLogger(cipher3des.class.getName()).log(Level.SEVERE, null, ex);
} catch (InvalidKeySpecException ex) {
Logger.getLogger(cipher3des.class.getName()).log(Level.SEVERE, null, ex);
}
this.paramSpec = new PBEParameterSpec( pbeKeysPass.getSalt(), pbeKeysPass.getIterationCount() );
return secretKey;
}
public void decrypt(String mode, String password) {
System.out.println("DESZYFROWANIE");
this.mode = mode;
this.password = password;
encKey = this.passwordToSecretKey();
try {
cp = Cipher.getInstance(encKey.getAlgorithm());
c = Cipher.getInstance("DESede/" + mode + "/PKCS5Padding");
cp.init(Cipher.DECRYPT_MODE, encKey, paramSpec);
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);
} catch (InvalidKeyException ex) {
Logger.getLogger(cip.class.getName()).log(Level.SEVERE, null, ex);
} catch (InvalidAlgorithmParameterException ex) {
Logger.getLogger(cip.class.getName()).log(Level.SEVERE, null, ex);
}
inputBuffer = hide;
//outputBuffer = cp.update(inputBuffer);
//cp.update(inputBuffer, outputBuffer);
System.out.println();
System.out.println("Pierwsze wywołanie 'update'");
System.out.println("Wartości wejściowe: " + Arrays.toString(inputBuffer));
outputBuffer = cp.update(inputBuffer);
System.out.println("Wartości wyjściowe: " + Arrays.toString(outputBuffer));
System.out.println();
System.out.println("Drugie wywołanie 'update'");
System.out.println("Wartości wejściowe: " + Arrays.toString(inputBuffer));
outputBuffer = cp.update(inputBuffer);
System.out.println("Wartości wyjściowe: " + Arrays.toString(outputBuffer));
System.out.println();
System.out.println("Trzecie wywołanie 'update'");
System.out.println("Wartości wejściowe: " + Arrays.toString(inputBuffer));
outputBuffer = cp.update(inputBuffer);
System.out.println("Wartości wyjściowe: " + Arrays.toString(outputBuffer));
//outputBuffer = cp.update(inputBuffer);
//outputBuffer = cp.update(inputBuffer);
//System.out.println("Wiadomosc zaszyforwana bajtowo: " + Arrays.toString(inputBuffer));
//System.out.println("Wiadomosc niezaszyforwana bajtowo: " + Arrays.toString(outputBuffer));
//System.out.println("Wiadomosc niezaszyforwana: " + message);
}
}
a w wyniku otrzymuje
SZYFROWANIE
Wiadomosc niezaszyforwana: ala ma k
Wiadomosc niezaszyforwana bajtowo: [97, 108, 97, 32, 109, 97, 32, 107]
Wiadomosc zaszyforwana bajtowo: [-75, 60, 11, 50, -62, 125, 30, 27]
DESZYFROWANIEPierwsze wywołanie 'update'
Wartości wejściowe: [-75, 60, 11, 50, -62, 125, 30, 27]
Wartości wyjściowe: []Drugie wywołanie 'update'
Wartości wejściowe: [-75, 60, 11, 50, -62, 125, 30, 27]
Wartości wyjściowe: [97, 108, 97, 32, 109, 97, 32, 107]Trzecie wywołanie 'update'
Wartości wejściowe: [-75, 60, 11, 50, -62, 125, 30, 27]
Wartości wyjściowe: [-84, 74, -60, 32, 54, 90, -7, -97]
BUILD SUCCESSFUL (total time: 0 seconds)
ktoś mi jest w stanie wytłumaczyć czemu tak się dzieje ?
EDIT:
zauważyłem, przy kolejnych testach, że wykonanie dopiero 2. update'a na danych wejściowych zwraca prawidłowy wynik. W pierwszym i od trzeciego w zwyż zwracane są jakieś "śmieci" (dane różne od oryginału)