Java AES et en utilisant ma propre clé

Je veux chiffrer une chaîne en utilisant AES avec ma propre clé. Mais j’ai des problèmes avec la longueur de bit de la clé. Pouvez-vous revoir mon code et voir ce que je dois corriger / modifier?

public static void main(Ssortingng[] args) throws Exception { Ssortingng username = "bob@google.org"; Ssortingng password = "Password1"; Ssortingng secretID = "BlahBlahBlah"; Ssortingng 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 ssortingng: " + asHex(encrypted)); cipher.init(Cipher.DECRYPT_MODE, secretKeySpec); byte[] original = cipher.doFinal(encrypted); Ssortingng originalSsortingng = new Ssortingng(original); System.out.println("Original ssortingng: " + originalSsortingng + "\nOriginal ssortingng (Hex): " + asHex(original)); } 

En ce moment, je reçois une exception ” Longueur de clé AES non valide: 86 octets “. Dois-je remplir ma clé? Comment devrais-je le faire?

Dois-je aussi définir quelque chose pour ECB ou CBC?

Merci

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 Ssortingngs via getBytes (), il utilise le Charset de plate-forme par défaut. Le mot de passe “blaöä” donne donc un tableau d’octets différent sur différentes plateformes.

 byte[] key = (SALT2 + username + password).getBytes("UTF-8"); MessageDigest sha = MessageDigest.getInstance("SHA-1"); key = sha.digest(key); key = Arrays.copyOf(key, 16); // use only first 128 bit SecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES"); 

Edit: Si vous avez besoin de 256 bits comme taille de clé, vous devez télécharger le lien de téléchargement Oracle “Java Cryptography Extension (JCE)”, utiliser SHA-256 comme hachage et supprimer 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”

Vous devez utiliser un générateur de clés pour générer la clé,

Les longueurs de clé AES sont 128, 192 et 256 bits en fonction du chiffrement que vous souhaitez utiliser.

Regardez le tutoriel ici

Voici le code de cryptage basé sur un mot de passe, le mot de passe étant saisi via System.in vous pouvez changer cela pour utiliser un mot de passe stocké si vous le souhaitez.

  PBEKeySpec pbeKeySpec; PBEParameterSpec pbeParamSpec; SecretKeyFactory keyFac; // Salt byte[] salt = { (byte)0xc7, (byte)0x73, (byte)0x21, (byte)0x8c, (byte)0x7e, (byte)0xc8, (byte)0xee, (byte)0x99 }; // Iteration count int count = 20; // Create PBE parameter set pbeParamSpec = new PBEParameterSpec(salt, count); // Prompt user for encryption password. // Collect user password as char array (using the // "readPassword" method from above), and convert // it into a SecretKey object, using a PBE key // factory. System.out.print("Enter encryption password: "); System.out.flush(); pbeKeySpec = new PBEKeySpec(readPassword(System.in)); keyFac = SecretKeyFactory.getInstance("PBEWithMD5AndDES"); SecretKey pbeKey = keyFac.generateSecret(pbeKeySpec); // Create PBE Cipher Cipher pbeCipher = Cipher.getInstance("PBEWithMD5AndDES"); // Initialize PBE Cipher with key and parameters pbeCipher.init(Cipher.ENCRYPT_MODE, pbeKey, pbeParamSpec); // Our cleartext byte[] cleartext = "This is another example".getBytes(); // Encrypt the cleartext byte[] ciphertext = pbeCipher.doFinal(cleartext); 
 import java.security.Key; import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; import sun.misc.*; import java.io.BufferedReader; import java.io.FileReader; public class AESFile { private static Ssortingng algorithm = "AES"; private static byte[] keyValue=new byte[] {'0','2','3','4','5','6','7','8','9','1','2','3','4','5','6','7'};// your key // Performs Encryption public static Ssortingng encrypt(Ssortingng plainText) throws Exception { Key key = generateKey(); Cipher chiper = Cipher.getInstance(algorithm); chiper.init(Cipher.ENCRYPT_MODE, key); byte[] encVal = chiper.doFinal(plainText.getBytes()); Ssortingng encryptedValue = new BASE64Encoder().encode(encVal); return encryptedValue; } // Performs decryption public static Ssortingng decrypt(Ssortingng encryptedText) throws Exception { // generate key Key key = generateKey(); Cipher chiper = Cipher.getInstance(algorithm); chiper.init(Cipher.DECRYPT_MODE, key); byte[] decordedValue = new BASE64Decoder().decodeBuffer(encryptedText); byte[] decValue = chiper.doFinal(decordedValue); Ssortingng decryptedValue = new Ssortingng(decValue); return decryptedValue; } //generateKey() is used to generate a secret key for AES algorithm private static Key generateKey() throws Exception { Key key = new SecretKeySpec(keyValue, algorithm); return key; } // performs encryption & decryption public static void main(Ssortingng[] args) throws Exception { FileReader file = new FileReader("C://myprograms//plaintext.txt"); BufferedReader reader = new BufferedReader(file); Ssortingng text = ""; Ssortingng line = reader.readLine(); while(line!= null) { text += line; line = reader.readLine(); } reader.close(); System.out.println(text); Ssortingng plainText = text; Ssortingng encryptedText = AESFile.encrypt(plainText); Ssortingng decryptedText = AESFile.decrypt(encryptedText); System.out.println("Plain Text : " + plainText); System.out.println("Encrypted Text : " + encryptedText); System.out.println("Decrypted Text : " + decryptedText); } } 

Cela va marcher.

 public class CryptoUtils { private final Ssortingng TRANSFORMATION = "AES"; private final Ssortingng encodekey = "1234543444555666"; public Ssortingng encrypt(Ssortingng inputFile) throws CryptoException { return doEncrypt(encodekey, inputFile); } public Ssortingng decrypt(Ssortingng input) throws CryptoException { // return doCrypto(Cipher.DECRYPT_MODE, key, inputFile); return doDecrypt(encodekey,input); } private Ssortingng doEncrypt(Ssortingng encodekey, Ssortingng inputStr) throws CryptoException { try { Cipher cipher = Cipher.getInstance(TRANSFORMATION); byte[] key = encodekey.getBytes("UTF-8"); MessageDigest sha = MessageDigest.getInstance("SHA-1"); key = sha.digest(key); key = Arrays.copyOf(key, 16); // use only first 128 bit SecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES"); cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec); byte[] inputBytes = inputStr.getBytes(); byte[] outputBytes = cipher.doFinal(inputBytes); return Base64Utils.encodeToSsortingng(outputBytes); } catch (NoSuchPaddingException | NoSuchAlgorithmException | InvalidKeyException | BadPaddingException | IllegalBlockSizeException | IOException ex) { throw new CryptoException("Error encrypting/decrypting file", ex); } } public Ssortingng doDecrypt(Ssortingng encodekey,Ssortingng encrptedStr) { try { Cipher dcipher = Cipher.getInstance(TRANSFORMATION); dcipher = Cipher.getInstance("AES"); byte[] key = encodekey.getBytes("UTF-8"); MessageDigest sha = MessageDigest.getInstance("SHA-1"); key = sha.digest(key); key = Arrays.copyOf(key, 16); // use only first 128 bit SecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES"); dcipher.init(Cipher.DECRYPT_MODE, secretKeySpec); // decode with base64 to get bytes byte[] dec = Base64Utils.decode(encrptedStr.getBytes()); byte[] utf8 = dcipher.doFinal(dec); // create new ssortingng based on the specified charset return new Ssortingng(utf8, "UTF8"); } catch (Exception e) { e.printStackTrace(); } return null; } } 
  byte[] seed = (SALT2 + username + password).getBytes(); SecureRandom random = new SecureRandom(seed); KeyGenerator generator; generator = KeyGenerator.getInstance("AES"); generator.init(random); generator.init(256); Key keyObj = generator.generateKey();