Comment générer une clé secrète en Java une fois et utilisez la touche en 2 programmes différents
Mon but est d'écrire un programme Java pour crypter un fichier texte (cipher text
) à l'aide de AES algorithm
. Et puis, écrire un autre programme pour décrypter ce fichier crypté (cipher text
) pour obtenir le texte en clair en arrière. Je veux utiliser la même clé (la même clé, de générer une fois, l'enregistrer quelque part, et de l'utiliser à la fois le chiffrement et le déchiffrement d'un programme) pour le chiffrement et le déchiffrement du processus. Si je générer une clé et ne le chiffrement et le déchiffrement, ligne par ligne, dans le même programme, il fonctionne parfaitement. Voici le travail d'un extrait de code pour que:
String strDataToEncrypt = new String();
String strCipherText = new String();
String strDecryptedText = new String();
KeyGenerator keyGen = KeyGenerator.getInstance("AES");
keyGen.init(128);
SecretKey secretKey = keyGen.generateKey();
Cipher aesCipher = Cipher.getInstance("AES");
aesCipher.init(Cipher.ENCRYPT_MODE,secretKey);
strDataToEncrypt = "any text input";
byte[] byteDataToEncrypt = strDataToEncrypt.getBytes();
byte[] byteCipherText = aesCipher.doFinal(byteDataToEncrypt);
strCipherText = new BASE64Encoder().encode(byteCipherText);
System.out.println("cipher text: " +strCipherText);
aesCipher.init(Cipher.DECRYPT_MODE,secretKey,aesCipher.getParameters());
byte[] byteDecryptedText = aesCipher.doFinal(new BASE64Decoder().decodeBuffer(strCipherText));
strDecryptedText = new String(byteDecryptedText);
System.out.println("plain text again: " +strDecryptedText);
Mais, j'ai besoin d'avoir deux différents programmes (fichiers java) pour le chiffrement et le déchiffrement. Donc, j'ai en quelque sorte à générer une clé et enregistrer quelque part. Puis utiliser la même clé pour le chiffrement et le déchiffrement du programme. Comment puis-je le faire?
EDIT_1
KeyGenerator keyGen = KeyGenerator.getInstance("AES");
keyGen.init(128);
SecretKey secretKey = keyGen.generateKey();
byte[] encoded = secretKey.getEncoded();
System.out.println("key: "+encoded);//key: [B@52b2a2d8
Je peux obtenir la valeur de clé codée en utilisant le programme ci-dessus. Mais ma question est de savoir comment générer de la SecretKey à l'aide de cette valeur dans mon programme de décryptage?
merci de regarder mon montage.
La clé est une
byte[]
pour que le système utilise Object#toString()
, qui écrit simplement l'identité interne. Vous devez écrire l'individu byte pour un fichier, peut-être les convertir en hexadécimal premier.OriginalL'auteur K M Rakibul Islam | 2013-11-27
Vous devez vous connecter pour publier un commentaire.
Pardonnez-moi si j'ai mal compris votre question, mais je crois que vous avez envie de reconstruire une
SecretKey
objet à partir d'une clé codée dans un tableau d'octets.Cela peut être réalisé simplement en utilisant l'
javax.crypto.spec.SecretKeySpec
'constructeur en tant que tel:Depuis
SecretKeySpec
est une sous-classe deSecretKey
pas de conversion est nécessaire. Si votre cryptage/decrption algorithme de changement s'il vous plaît assurez-vous de changer la chaîne de caractères littérale utilisée dans le constructeurAES
pour quel que soit l'algorithme que vous avez décidé de l'utiliser dans le futur.OriginalL'auteur initramfs
Voici un façon d'imprimer les valeurs dans un
byte[]
gamme dans l'hexagone:Si vous utilisez
Arrays.toString(byte[])
vous allez par le biais d'un octet par caractère de conversion qui peut ne pas être réversible.Arrays.toString(byte[])
est défini de manière à produire une norme de représentation de la matrice qui est très peu susceptible de changer. Cependant je suis d'accord que c'est vraiment pas l'idéal pour ce but. @KeenLearner Envisager l'hexagone ou de l'encodage Base64 si vous avez besoin de représenter la clé en ASCII, et garder à l'esprit que les fichiers peuvent contenir des données binaires.OriginalL'auteur Jim Garrison