1
The code below is working perfectly for both encryption and decryption, however, when closing the app and putting the generated code before closing it (I open the encryption app a word and close the app and when back to lap to decrypt the message).
It happens that it does not work when I do this and my intention is that it works, both closing and opening so much for another phone that has the same APP installed.
I think I should put a fixed key instead of the "SecretKeySpec".
But I am not knowing how to implement a way to leave the cryptographic key fixed instead of being generated would be for ex "123", so that you could decipher the message generated from any other Cell with the app or from the same phone ( in case of close and open).
import android.util.Base64;
import java.security.MessageDigest;
import java.security.spec.AlgorithmParameterSpec;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
/**
* Created by thiago.goncalves on 22/02/2016.
*/
public class Encripta {
private final Cipher cipher;
private final SecretKeySpec key ;
private AlgorithmParameterSpec spec;
public static final String SEED_16_CHARACTER = "U1MjU1M0FDOUZ.Qz";
public Encripta() throws Exception {
// hash password with SHA-256 and crop the output to 128-bit for key
MessageDigest digest = MessageDigest.getInstance("SHA-256");
digest.update(SEED_16_CHARACTER.getBytes("UTF-8"));
byte[] keyBytes = new byte[32];
System.arraycopy(digest.digest(), 0, keyBytes, 0, keyBytes.length);
cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
key = new SecretKeySpec(keyBytes, "AES");
byte[] key = "secret".getBytes();
// String IV = "12345678";
spec = getIV();
}
public AlgorithmParameterSpec getIV() {
byte[] iv = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, };
IvParameterSpec ivParameterSpec;
ivParameterSpec = new IvParameterSpec(iv);
return ivParameterSpec;
}
public String encrypt(String plainText) throws Exception {
cipher.init(Cipher.ENCRYPT_MODE, key, spec);
byte[] encrypted = cipher.doFinal(plainText.getBytes("UTF-8"));
String encryptedText = new String(Base64.encode(encrypted,
Base64.DEFAULT), "UTF-8");
return encryptedText;
}
public String decrypt(String cryptedText) throws Exception {
cipher.init(Cipher.DECRYPT_MODE, key, spec);
byte[] bytes = Base64.decode(cryptedText, Base64.DEFAULT);
byte[] decrypted = cipher.doFinal(bytes);
String decryptedText = new String(decrypted, "UTF-8");
return decryptedText;
}
}
Don’t use a fixed IR! IV has to be random or at least different each time you encrypt a new data (globally - you never should repeat an IV throughout the life cycle of your key). Otherwise, all encryption security goes down...
– mgibsonbr