Je souhaite crypter une chaîne en utilisant AES avec ma propre clé. Mais j'ai des problèmes avec la longueur en bits de la clé. Pouvez-vous revoir mon code et voir ce que j'ai besoin de corriger / modifier.
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));
}
En ce moment, j'obtiens une exception " Longueur de clé AES non valide: 86 octets ". Dois-je remplir ma clé? Comment dois-je le faire?
Dois-je également définir quelque chose pour ECB ou CBC?
Merci
Réponses:
Éditer:
Comme indiqué dans les commentaires, l'ancien code n'est pas une «meilleure pratique». Vous devez utiliser un algorithme de génération de clé comme PBKDF2 avec un nombre d'itérations élevé. Vous devez également utiliser au moins en partie un sel non statique (signifiant pour chaque "identité" exclusive). Si possible généré de manière aléatoire et stocké avec le texte chiffré.
===========
Ancienne réponse
Vous devez utiliser SHA-1 pour générer un hachage à partir de votre clé et réduire le résultat à 128 bits (16 octets).
De plus, ne générez pas de tableaux d'octets à partir de chaînes via getBytes (), il utilise le jeu de caractères par défaut de la plate-forme. Ainsi, le mot de passe "blaöä" donne un tableau d'octets différent sur différentes plates-formes.
Modifier: Si vous avez besoin de 256 bits comme tailles de clé, vous devez télécharger le lien de téléchargement Oracle "Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files" , utilisez SHA-256 comme hachage et supprimez la ligne Arrays.copyOf . "ECB" est le mode de chiffrement par défaut et "PKCS5Padding" le remplissage par défaut. Vous pouvez utiliser différents modes de chiffrement et modes de remplissage via la chaîne Cipher.getInstance en utilisant le format suivant: "Cipher / Mode / Padding"
Pour AES utilisant CTS et PKCS5Padding, la chaîne est: "AES / CTS / PKCS5Padding"
la source
Vous devez utiliser un KeyGenerator pour générer la clé,
Les longueurs de clé AES sont de 128, 192 et 256 bits selon le chiffrement que vous souhaitez utiliser.
Jetez un œil au tutoriel ici
Voici le code pour le cryptage basé sur le mot de passe, le mot de passe étant entré via System.in, vous pouvez le modifier pour utiliser un mot de passe stocké si vous le souhaitez.
la source
SecretKeyFactory
chiffrement plus à jour.la source
keyValue
, avec le tableau d'octets? Je vois qu'il est utilisé pour fabriquer la clé, pourquoi? Peut-on faire quelque chose en utilisant comme à laSecretKey
place? Si c'est le cas, comment?Cela fonctionnera.
la source
MD5, AES, sans rembourrage
la source
la source