Quero criptografar uma string usando AES com minha própria chave. Mas estou tendo problemas com o comprimento de bits da chave. Você pode revisar meu código e ver o que preciso consertar / alterar.
public static void main(String[] args) throws Exception {
String username = "[email protected]";
String password = "Password1";
String secretID = "BlahBlahBlah";
String SALT2 = "deliciously salty";
// Get the Key
byte[] key = (SALT2 + username + password).getBytes();
System.out.println((SALT2 + username + password).getBytes().length);
// Need to pad key for AES
// TODO: Best way?
// Generate the secret key specs.
SecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES");
// Instantiate the cipher
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);
byte[] encrypted = cipher.doFinal((secrectID).getBytes());
System.out.println("encrypted string: " + asHex(encrypted));
cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);
byte[] original = cipher.doFinal(encrypted);
String originalString = new String(original);
System.out.println("Original string: " + originalString + "\nOriginal string (Hex): " + asHex(original));
}
No momento, recebo uma exceção " Comprimento de chave AES inválido: 86 bytes ". Eu preciso preencher minha chave? Como devo fazer isso?
Também preciso definir algo para ECB ou CBC?
obrigado
Respostas:
Editar:
Conforme escrito nos comentários, o código antigo não é a "melhor prática". Você deve usar um algoritmo de geração de chave como PBKDF2 com uma alta contagem de iteração. Você também deve usar pelo menos parcialmente um salt não estático (significado para cada "identidade" exclusiva). Se possível, gerado aleatoriamente e armazenado junto com o texto cifrado.
===========
Resposta Antiga
Você deve usar SHA-1 para gerar um hash de sua chave e cortar o resultado para 128 bits (16 bytes).
Além disso, não gere matrizes de bytes de Strings por meio de getBytes (), ele usa o Charset padrão da plataforma. Portanto, a senha "blaöä" resulta em uma matriz de bytes diferente em plataformas diferentes.
Editar: se você precisar de 256 bits como tamanhos de chave, deverá baixar o link de download do Oracle "Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files" , use SHA-256 como hash e remova a linha Arrays.copyOf . "ECB" é o modo de codificação padrão e "PKCS5Padding" o preenchimento padrão. Você pode usar diferentes modos de criptografia e modos de preenchimento por meio da string Cipher.getInstance usando o seguinte formato: "Cipher / Mode / Padding"
Para AES usando CTS e PKCS5Padding, a string é: "AES / CTS / PKCS5Padding"
fonte
Você deve usar um KeyGenerator para gerar a chave,
Os comprimentos de chave AES são 128, 192 e 256 bits, dependendo da cifra que deseja usar.
Dê uma olhada no tutorial aqui
Aqui está o código para criptografia baseada em senha; a senha está sendo inserida através do System.in você pode alterá-la para usar uma senha armazenada, se desejar.
fonte
SecretKeyFactory
criptografia mais atualizada.fonte
keyValue
, com a matriz de bytes? Eu vejo isso sendo usado para fazer a Chave, por quê? Algo pode ser feito usando like emSecretKey
vez disso? Se sim, como?Isso vai funcionar.
fonte
MD5, AES, sem preenchimento
fonte
fonte