I'm trying to do a program with java that encrypt and dencrypt by command lines. By the moment I can encrypt correctly but when I try to decrypt the crypted message I get a padding error. The code of the proggram is
package cat.copernic.simetriccd;
import java.security.MessageDigest;
import java.util.Arrays;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
class symetric{
public static String byteArrayToHexString(byte[] b){
StringBuilder sb = new StringBuilder(b.length * 2);
for(int i = 0; i < b.length; i++){
int v = b[i] & 0xff; if(v < 16){
sb.append("0");
}
sb.append(Integer.toHexString(v));
} return sb.toString();
}
static SecretKey genKey(String text) {
SecretKey sKey = null;
int keySize = 256;
try {
byte[] data = text.getBytes("UTF-8");
MessageDigest md = MessageDigest.getInstance("SHA-256");
byte[] hash = md.digest(data);
byte[] key = Arrays.copyOf(hash, keySize/8);
sKey = new SecretKeySpec(key, "AES");
} catch (Exception ex) {
System.err.println("Error generant la clau:" + ex);
}
return sKey;
}
static String encryptData(String password, byte[] data) {
byte[] encryptedData = null;
try {
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, genKey(password));
encryptedData = cipher.doFinal(data);
} catch (Exception ex) {
System.err.println("Error xifrant les dades: " + ex);
}
return byteArrayToHexString(encryptedData);
}
static String decryptData(String password, byte[] data) {
byte[] decryptedData = null;
try {
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, genKey(password));
decryptedData = cipher.doFinal(data);
} catch (Exception ex) {
System.err.println("Error desxifrant les dades: " + ex);
}
return decryptedData.toString();
}
}
public class Main {
public static void main(String[] args) {
//controlar numero de parametros que se pasan
if(args.length <= 1 || args.length > 3 || args.length == 2){
System.out.println("java Main -mode=encrypt|decrypt <message> <key>");
return;
}
//sacamos los valores de los argumentos
String mode = args[0].split("=")[1].toLowerCase();
byte[] mensage = args[1].getBytes();
String key = args[2];
if(mode.equals("encrypt") || mode.equals("decrypt")){
switch (mode) {
case "encrypt":
//System.out.println("encrypt");
System.out.println(symetric.encryptData(key, mensage));
break;
case "decrypt":
//System.out.println("decrypt");
System.out.println(symetric.decryptData(key, mensage));
break;
default:
break;
}
}else {
System.out.println("Solo coje valores encrypt/ENCRYPT o decrypt/DECRYPT");
}
}
}
The message error is
Error desxifrant les dades: javax.crypto.BadPaddingException: Given final block not properly padded
Exception in thread "main" java.lang.NullPointerException
at cat.copernic.simetriccd.symetric.decryptData(Main.java:61)
at cat.copernic.simetriccd.Main.main(Main.java:92)
I'm pretty sure that the error is generated here but dunno how to fix it... any idea? Thanks
cipher.init(Cipher.DECRYPT_MODE, genKey(password));
decryptedData = cipher.doFinal(data);