Mit der Verbreitung von Smartphones und deren Kamera kamen die QR-Code Bilder (* siehe unten) auf, welche mit dem Handy abfotografiert wurden und dann direkt die eingebettete Information anzeigten. In den meisten Fällen war im Bild die Adresse einer Webseite „versteckt“, so das die URL sehr schnell und einfach aufgerufen werden konnte. Ein Beispiel dafür ist dieses Bild, welches die Information „K07 QR-Code im Bild“ enthält:
Wie auch bei anderen Beispiele dieser Rubrik ist das Programm nicht von mir geschrieben worden, sondern vom Autor Rajeev Singh, welcher die Funktionsweise in 2 Blog-Artikeln beschreibt (https://www.callicoder.com/generate-qr-code-in-java-using-zxing/ und https://www.callicoder.com/qr-code-reader-scanner-in-java-using-zxing/); den Original-Quellcode findet Ihr in seinem Github-Archiv https://github.com/callicoder/qr-code-generator-and-reader).
Für die eigentliche Funktionalität werden zwei externe Bibliotheken des Google ZXING-Projektes genutzt, dessen Projektseite Ihr hier erreichen könnt: https://github.com/zxing/zxing (Ihr benötigt sowohl core-3.4.0.jar als auch javase-3.4.0.jar). Bitte beachtet, das die Bibliotheken unter der Apache 2.0-Lizenz bereitgestellt sind (siehe unten).
Das Programmpaket besteht aus 2 Java-Dateien, eine für die Erzeugung eines QR Code-Bildes (k07a_QRCodeGenerator.java) und die andere zum Auslesen des eingebetteten QR-Codes (k07b_QRCodeReader.java). Die Version in meinem Github-Archiv habe ich geringfügig angepasst (Ausgabe des Programm-Names und deutsche Sprache).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 |
package net.bplaced.javacrypto.steganography; /* * Herkunft/Origin: http://javacrypto.bplaced.net/ * Programmierer/Programmer: Rajeev Singh * Copyright/Copyright: nicht angegeben * Copyright: not named. * Lizenztext/Licence: Apache 2.0, http://www.apache.org/licenses/LICENSE-2.0 * getestet mit/tested with: Java Runtime Environment 8 Update 191 x64 * getestet mit/tested with: Java Runtime Environment 11.0.1 x64 * Datum/Date (dd.mm.jjjj): 09.11.2019 * Projekt/Project: K07a QRCode Generator * K07a QR Code Generator * * Sicherheitshinweis/Security notice * Die Programmroutinen dienen nur der Darstellung und haben keinen Anspruch auf eine korrekte Funktion, * insbesondere mit Blick auf die Sicherheit ! * Prüfen Sie die Sicherheit bevor das Programm in der echten Welt eingesetzt wird. * The program routines just show the function but please be aware of the security part - * check yourself before using in the real world ! * * Das Projekt basiert auf dem nachfolgenden Github-Archiv des Autors: * The project is based this Github-Archive of the Author: * https://github.com/callicoder/qr-code-generator-and-reader * https://www.callicoder.com/generate-qr-code-in-java-using-zxing/ * * Das Programm benötigt die nachfolgenden Bibliotheken (siehe Github Archiv): * The programm uses these external libraries (see Github Archive): * jar-Datei: core-3.4.0.jar * jar File: https://repo1.maven.org/maven2/com/google/zxing/core/ * jar-Datei: javase-3.4.0.jar * jar File: https://repo1.maven.org/maven2/com/google/zxing/javase/ * * Das Wort QR Code ist ein eingetragenes Warenzeichen der DENSO WAVE INCORPORATED * Lizenztext: http://www.denso-wave.com/qrcode/faqpatent-e.html * */ import com.google.zxing.BarcodeFormat; import com.google.zxing.WriterException; import com.google.zxing.client.j2se.MatrixToImageWriter; import com.google.zxing.common.BitMatrix; import com.google.zxing.qrcode.QRCodeWriter; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.nio.file.FileSystems; import java.nio.file.Path; /** * Created by rajeevkumarsingh on 22/08/17. */ public class k07a_QRCodeGenerator { private static final String QR_CODE_IMAGE_PATH = "f://k07_qrcode.png"; private static final String QR_CODE_TEXT = "K07 QR-Code im Bild"; private static void generateQRCodeImage(String text, int width, int height, String filePath) throws WriterException, IOException { QRCodeWriter qrCodeWriter = new QRCodeWriter(); BitMatrix bitMatrix = qrCodeWriter.encode(text, BarcodeFormat.QR_CODE, width, height); Path path = FileSystems.getDefault().getPath(filePath); MatrixToImageWriter.writeToPath(bitMatrix, "PNG", path); } private byte[] getQRCodeImageByteArray(String text, int width, int height) throws WriterException, IOException { QRCodeWriter qrCodeWriter = new QRCodeWriter(); BitMatrix bitMatrix = qrCodeWriter.encode(text, BarcodeFormat.QR_CODE, width, height); ByteArrayOutputStream pngOutputStream = new ByteArrayOutputStream(); MatrixToImageWriter.writeToStream(bitMatrix, "PNG", pngOutputStream); byte[] pngData = pngOutputStream.toByteArray(); return pngData; } public static void main(String[] args) { System.out.println("K07a Erzeuge einen QR Code"); System.out.println("\nDas Wort QR Code ist ein eingetragenes Warenzeichen der DENSO WAVE INCORPORATED\r\n" + "Lizenztext: http://www.denso-wave.com/qrcode/faqpatent-e.html\n"); try { generateQRCodeImage(QR_CODE_TEXT, 350, 350, QR_CODE_IMAGE_PATH); } catch (WriterException e) { // System.out.println("Could not generate QR Code, WriterException :: " + // e.getMessage()); System.out.println("Fehler - konnte den QR-Code nicht erzeugen, Fehlermeldung: " + e.getMessage()); } catch (IOException e) { // System.out.println("Could not generate QR Code, IOException :: " + // e.getMessage()); System.out.println("Fehler - Konto die QR-Code-Datei nicht erzeugen, Fehlermeldung: " + e.getMessage()); } System.out.println("Dieser Text wurde in das QR-Bild kodiert: " + QR_CODE_TEXT); System.out.println("Diese Datei wurde erzeugt: " + QR_CODE_IMAGE_PATH); } } |
Hier die Konsolenausgabe:
1 2 3 4 5 6 7 |
K07a Erzeuge einen QR Code Das Wort QR Code ist ein eingetragenes Warenzeichen der DENSO WAVE INCORPORATED Lizenztext: http://www.denso-wave.com/qrcode/faqpatent-e.html Dieser Text wurde in das QR-Bild kodiert: K07 QR-Code im Bild Diese Datei wurde erzeugt: f://k07_qrcode.png |
So sieht das Leseprogramm aus:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 |
package net.bplaced.javacrypto.steganography; /* * Herkunft/Origin: http://javacrypto.bplaced.net/ * Programmierer/Programmer: Rajeev Singh * Copyright/Copyright: nicht angegeben * Copyright: not named. * Lizenztext/Licence: Apache 2.0, http://www.apache.org/licenses/LICENSE-2.0 * getestet mit/tested with: Java Runtime Environment 8 Update 191 x64 * getestet mit/tested with: Java Runtime Environment 11.0.1 x64 * Datum/Date (dd.mm.jjjj): 09.11.2019 * Projekt/Project: K07b QRCode Leser * K07b QR Code Decoder * * Sicherheitshinweis/Security notice * Die Programmroutinen dienen nur der Darstellung und haben keinen Anspruch auf eine korrekte Funktion, * insbesondere mit Blick auf die Sicherheit ! * Prüfen Sie die Sicherheit bevor das Programm in der echten Welt eingesetzt wird. * The program routines just show the function but please be aware of the security part - * check yourself before using in the real world ! * * Das Projekt basiert auf dem nachfolgenden Github-Archiv des Autors: * The project is based this Github-Archive of the Author: * https://github.com/callicoder/qr-code-generator-and-reader * https://www.callicoder.com/qr-code-reader-scanner-in-java-using-zxing/ * * Das Programm benötigt die nachfolgenden Bibliotheken (siehe Github Archiv): * The programm uses these external libraries (see Github Archive): * jar-Datei: core-3.4.0.jar * jar File: https://repo1.maven.org/maven2/com/google/zxing/core/ * jar-Datei: javase-3.4.0.jar * jar File: https://repo1.maven.org/maven2/com/google/zxing/javase/ * * Das Wort QR Code ist ein eingetragenes Warenzeichen der DENSO WAVE INCORPORATED * Lizenztext: http://www.denso-wave.com/qrcode/faqpatent-e.html * */ import com.google.zxing.*; import com.google.zxing.client.j2se.BufferedImageLuminanceSource; import com.google.zxing.common.HybridBinarizer; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; public class k07b_QRCodeReader { private static final String QR_CODE_IMAGE_PATH = "f://k07_qrcode.png"; private static String decodeQRCode(File qrCodeimage) throws IOException { BufferedImage bufferedImage = ImageIO.read(qrCodeimage); LuminanceSource source = new BufferedImageLuminanceSource(bufferedImage); BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source)); try { Result result = new MultiFormatReader().decode(bitmap); return result.getText(); } catch (NotFoundException e) { System.out.println("There is no QR code in the image"); return null; } } public static void main(String[] args) { System.out.println("K07b Lese einen QR Code aus"); System.out.println("\nDas Wort QR Code ist ein eingetragenes Warenzeichen der DENSO WAVE INCORPORATED\r\n" + "Lizenztext: http://www.denso-wave.com/qrcode/faqpatent-e.html\n"); try { File file = new File(QR_CODE_IMAGE_PATH); String decodedText = decodeQRCode(file); if (decodedText == null) { // System.out.println("No QR Code found in the image"); System.out.println("Es befindet sich kein QR Code im Bild " + QR_CODE_IMAGE_PATH); } else { // System.out.println("Decoded text = " + decodedText); System.out.println("Der QR-Code lautet: " + decodedText); } } catch (IOException e) { // System.out.println("Could not decode QR Code, IOException :: " + // e.getMessage()); System.out.println("Fehler bei der Dekodierung des QR Codes im Bild: " + QR_CODE_IMAGE_PATH + " ,IOException : " + e.getMessage()); } } } |
Auch hier die Ausgabe auf der Konsole:
1 2 3 4 5 6 |
K07b Lese einen QR Code aus Das Wort QR Code ist ein eingetragenes Warenzeichen der DENSO WAVE INCORPORATED Lizenztext: http://www.denso-wave.com/qrcode/faqpatent-e.html Der QR-Code lautet: K07 QR-Code im Bild |
* Hinweis: Das Wort „QR Code“ ist ein eingetragenes Warenzeichen der DENSO WAVE INCORPORATED, zu Details siehe: http://www.denso-wave.com/qrcode/faqpatent-e.html.
Das gesamte Programm steht unter der Apache 2.0 Lizenz, deren Wortlaut dem Paket beiliegt und den ich hier noch einmal wiedergebe: Apache 2.0-Lizenz.
Alle Quellcodes zur Steganographie findet Ihr zum Download in meinem Github-Repository, welches Ihr über diesen Link erreicht: https://github.com/java-crypto/K-Steganographie. Alle Programme sind sowohl unter Java 8 als auch unter Java 11 lauffähig.
Letzte Aktualisierung: 09.11.2019