Die Verschlüsselung und Entschlüsselung der Bild-Datei
In Verbindung von meinem anderen Frage, und nach dem ändern dieser kleine Teil des codes
FileOutputStream output = new FileOutputStream("sheepTest.png");
CipherOutputStream cos = new CipherOutputStream(output, pbeCipher);
ImageIO.write(input, "PNG", cos);
cos.close();
vom entschlüsseln Teil, ich habe gegen einen weiteren Fehler der diese
Exception in thread "main" java.lang.IllegalArgumentException: image == null!
at javax.imageio.ImageTypeSpecifier.createFromRenderedImage(Unknown Source)
at javax.imageio.ImageIO.getWriter(Unknown Source)
at javax.imageio.ImageIO.write(Unknown Source)
at encypt.com.trial.main(trial.java:82)
und wenn ich auf die sheepTest.png ist die Datei leer. Wo ist der Fehler(s)? Kann mir jemand helfen, den Fehler zu lösen? Danke.
public class trial {
public static void main(String[] arg) throws Exception {
//Scanner to read the user's password. The Java cryptography
//architecture points out that strong passwords in strings is a
//bad idea, but we'll let it go for this assignment.
Scanner scanner = new Scanner(System.in);
//Arbitrary salt data, used to make guessing attacks against the
//password more difficult to pull off.
byte[] salt = { (byte) 0xc7, (byte) 0x73, (byte) 0x21, (byte) 0x8c,
(byte) 0x7e, (byte) 0xc8, (byte) 0xee, (byte) 0x99 };
{
File inputFile = new File("sheep.png");
BufferedImage input = ImageIO.read(inputFile);
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
SecretKeyFactory keyFac = SecretKeyFactory.getInstance("PBEWithMD5AndDES");
//Get a password from the user.
System.out.print("Password: ");
System.out.flush();
PBEKeySpec pbeKeySpec = new PBEKeySpec(scanner.nextLine().toCharArray());
//Set up other parameters to be used by the password-based
//encryption.
PBEParameterSpec pbeParamSpec = new PBEParameterSpec(salt, 20);
SecretKey pbeKey = keyFac.generateSecret(pbeKeySpec);
//Make a PBE Cyhper object and initialize it to encrypt using
//the given password.
Cipher pbeCipher = Cipher.getInstance("PBEWithMD5AndDES");
pbeCipher.init(Cipher.ENCRYPT_MODE, pbeKey, pbeParamSpec);
FileOutputStream output = new FileOutputStream("sheepTest.png");
CipherOutputStream cos = new CipherOutputStream(
output, pbeCipher);
//File outputFile = new File("image.png");
ImageIO.write(input,"PNG",cos);
cos.close();
}
//Now, create a Cipher object to decrypt for us. We are repeating
//some of the same code here to illustrate how java applications on
//two different hosts could set up compatible encryption/decryption
//mechanisms.
{
File inputFile = new File("sheepTest.png");
BufferedImage input = ImageIO.read(inputFile);
//Get another (hopefully the same) password from the user.
System.out.print("Decryption Password: ");
System.out.flush();
PBEKeySpec pbeKeySpec = new PBEKeySpec(scanner.next().toCharArray());
//Set up other parameters to be used by the password-based
//encryption.
PBEParameterSpec pbeParamSpec = new PBEParameterSpec(salt, 20);
SecretKeyFactory keyFac = SecretKeyFactory
.getInstance("PBEWithMD5AndDES");
SecretKey pbeKey = keyFac.generateSecret(pbeKeySpec);
//Make a PBE Cyper object and initialize it to decrypt using
//the given password.
Cipher pbeCipher = Cipher.getInstance("PBEWithMD5AndDES");
pbeCipher.init(Cipher.DECRYPT_MODE, pbeKey, pbeParamSpec);
//Decrypt the ciphertext and then print it out.
/*byte[] cleartext = pbeCipher.doFinal(ciphertext);
System.out.println(new String(cleartext));*/
FileOutputStream output = new FileOutputStream("sheepTest.png");
CipherOutputStream cos = new CipherOutputStream(
output, pbeCipher);
ImageIO.write(input,"PNG", cos);
cos.close();
}
}
}
- Ist dies nicht sinnvoll. Sie haben ImageIO.write() -> CipherOutputStream -> FileOutputStream, aber Sie versuchen CipherInputStream <- ImageIO.read() <- FileInputStream.
- Ich löse schon. 🙂
- kann u pls Sag mir, ist diese Methode die Geschwindigkeit ist am besten für zwei oder mehr als zwei Bilder
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich würde vermuten, dass diese Zeile ist null zurückgeben:
In der Dokumentation für
ImageIO.read
sagt:", Wenn Sie keine eingetragene ImageReader behauptet Lesen zu können, der daraus resultierende Datenstrom ist, wird null zurückgegeben."
Dass null übergeben wird, um diesen Aufruf, Ergebnisse, die in der NPE:
Ich bin nicht vertraut mit dieser API, sondern aus der Dokumentation und dem, was ich hier zu sehen, ich denke, ich kann daraus schließen, dass der Grund
ImageIO.read
ist die Rückgabe null ist, weil es versucht, zu interpretieren, die Bild Daten in der Datei, aber es nicht kann, weil es verschlüsselt ist. Sie brauchen, um die Daten zu entschlüsseln, bevor Sie interpretieren es als ein Bild.Du tust, die Entschlüsselung, aber Ihr format-Konvertierung ist mit den ursprünglichen, verschlüsselten Datei als input, nicht die entschlüsselten Bild-Daten.
Weiter zu NateCK die aufschlussreichen post (gut gemacht übrigens), habe ich geändert entschlüsseln Abschnitt
Mein Beispiel basiert auf NateCKs Ergebnisse. Wenn Sie es nützlich finden, ein upvote wäre schön, aber NateCK gebührt das Verdienst 😉
File inputFile = new File("sheep.png");
, dann wird es ausgegeben wird, um eineFileOutputStream output = new FileOutputStream("sheepTest.png");
. Dann für das entschlüsseln der Teil, derFile inputFile = new File("C:/hold/encrypt.png");
sollte ich benutzen, das Bild von sheepTest oder..?sheep.png
undsheepTest.png
, die, wenn Sie das Programm ausführen, sollten gleich Aussehen 😉sheep.png
), das verschlüsselt und gespeichert werden, umsheepTest.png
. Diese Datei (sheepTest.png
) wird dann entschlüsselt und gespeichertsheepTest.png
...es klar wie kloßbrühe 😉