 Hello and welcome everybody to the next talk after the break. It's so great that you're all here to learn about Q-Art. And I'm so glad to introduce Henrik Flutz to you, who usually speaks about security at Congress, but this time he brought to you... Herzlich willkommen. Das ist die Besetzung des Vortages Q-Artistry auf dem 32. Chaos Communication Congress. Because nowadays there are still many of the times ugly. And next year at Congress I really want to see some great stickers with great QR-Codes. So give it up for Henrik. Thank you. Vielen Dank für die Einführung. Es ist eigentlich gut, dass Sie nicht ein Kongress gesagt haben, weil das ist eigentlich noch nicht ganz fertig. Aber ich werde ein paar Bausteine von einem Werkzeug vorstellen und werde erklären, wie ein QR-Code konstruiert wird, was wir erbrauchen werden, um ihn zu manipulieren. Wie ihr vielleicht wisst, vor dem Vortrag habe ich ein paar Leute getroffen, die nicht wussten, dass ein QR-Code ist. Also das ist wie ein Barcode. QR steht für schnelle Antwort, quick response. Und es wurde in 1994 für die Automobilindustrie in Japan entwickelt, um mehr Daten zu speichern wie ein herkömmlicher Barcode. Es wurde seitdem standardisiert, ein ISO-Standard. Und das ist erstmal in 2000 passiert und wurde in 2006 aktualisiert. QR-Codes sind in Asien sehr weit verbreitet und dort schon seit mehreren Jahren benutzt. Besonders in den letzten Jahren habe ich sehr viele QR-Codes in Europa gesehen und auch hier auf diesem Kongress. Verglichen mit den letzten Jahren sind da sehr viel mehr verbreitet. Eine der Gründe, warum das immer weiter verbreitet ist, sind frei kostenlose Apps für Smartphones und auch für nicht so clevere Telefone wie mein altes Zenookia. Hatte nicht so viele Apps, aber es gab sogar einen Barcode-Reader. Und ich war sehr verwirrt, weil es nicht keine 2D-Barcodes lesen konnte. Aber es war Barcode-Reader genannt und konnte nur QR-Codes lesen. Neben der herkömmlichen Verwendung, über die ich nur sehr wenig erzählen werde, haben Barcodes auch in kreativen Art und Weise benutzt. Meistens kennt man die rechte QR-Code, einer der vielen Beispiele, die auch für Menschen sehr nett anzusehen sind. Das ist von 2008 für den BBC. Und es hat sich herausgestellt, dass es aussieht wie ein sehr komplizierter Mechanismus, aber es ist eigentlich gar nicht so kompliziert. Denn die Buchstaben sind einfach nur übereinandergelegt. Man hätte da alles drauf machen können. Es sieht so aus, als ob sie zum Code gehören, aber sie gehören eigentlich gar nicht zum Code. Dieses Beispiel habe ich von den Quellen, die unterstehen von einem ähnlichen Projekt, aber das ist nicht so ein breiten Spektrum wie mein Vortrag. In Japan wurden QR-Codes schon seit einer ganzen Weile benutzt. Diese Disney-Werbungen haben auch einen sehr gut lesbaren QR-Code, der so ausschaltet, als ob möglicherweise einige Disney-Characters mit drin sind, aber die sind nicht da von Barcode. Das hier ist das Projekt von Boris Cox. Er nennt das QR-Art. Er kann Bilder in meisten der Pixel inkodieren. Diese zwei Codes sind lesbar und auch gültig. Es gibt hier keine Tricks und keine Fehlerkorrektur Tricks. Ich werde nicht erklären, wie das funktioniert, aber ich gebe euch hier die Referenz darauf. Diesen Beispielen sind nicht wirklich richtig integriert. Sie sind nur drüber gemalt. Das funktioniert deshalb, weil der QR-Code eben viel Schaden viele Fehler händeln kann. Dafür hat man die Fehlerkorrektur. Wenn man diesen und jenen Codes sich anschaut, dann sieht man als Mensch vielleicht nicht so die Änderung direkt. Aber tatsächlich sind die Pixel von schwarz auf weiß umgedreht und umgekehrt. Aber ein QR-Code-Rieder würde dann vieler sehen. Es würde es aber korrigieren, weil es mit der höchsten Fehlerkorrektur kodiert ist. Bei der höchsten Fehlerkorrektur Level können bis zu 30% der Pixel kaputt sein. Das hier ist etwas leichter. Da habe ich nur über die Pixel drüber gemalt. Ich habe es einfach schwarz gemacht. Jetzt sind es nicht 30% Damage, sondern nur 15% kaputt, weil die Hälfte der Pixel eh schon schwarz war. Ein Overpainting wird sehr häufig gemacht. Ein neuliches Beispiel, was mir gut gefallen hat, war Sensstorm. Das ist hier Logo. Das ist der QR-Code dazu. Es schaut so aus, als ob der Code im Belt ist, aber in Wirklichkeit ist er wieder nur drüber gemalt. In meinen Tools könnte man das den Originalcode angucken. Ein anderes Beispiel, ich schalte diese viele Beispiele, weil das wäre ohnewünschte Werbung, aber das zeige ich. Das ist Gepidia. Die machen auch ein Code mit Drömmalen. Die andere Möglichkeit, um das zu machen, ist das Projekt QR-Art von Russ Cox. Er hat einen anderen Trick. Was ihm aufgefallen war, ist, dass es keinen Unterschied macht, wenn es einen langen Hash gibt, der nicht wirklich existiert. Hier haben wir die eigentliche HTTP-Adresse und dann haben wir ein Fragment bezeichnender, den der Browser dann zwar sucht, aber nicht findet und danach dann auch ignoriert. Das Gesicht, was man hier unten sieht, das ist in der zahlen Sequenz gekodiert. Das ist eine Menge Mathematik, die man er braucht, das zu inkodieren. Mit dieser Technik, kann man z.B. den QR-Code hat 26 Wörter. Diese Daten sind Daten und der Rest ist Fehlerkorrektur. Man kann höchstens 16 Wörter kontrollieren, also 10 Daten und 6 Fehlerkorrektur. Das war jetzt die Einführung und ein bisschen Motivation, warum ich denn gerne mehr als das modifizieren möchte. Wir sehen, dass es schon noch recht viel Struktur gibt, die wir nicht kontrollieren können. Stellt sich raus, dass ein QR-Code sehr einfach aussieht, aber eigentlich nicht täuschend einfach. Das nennt mal ein Modul, das ist einfach ein einzelner Pixel. Aber auch die restlichen Sachen haben eine Funktion. Diese großen Punkte in den Ecken sind die Suchpatterns. Die müssen da sein, damit der QR-Code-Reader das Pattern erkennt. Und was mir vorher nicht aufgefallen ist, gibt es ein Timing-Pattern, und diese Pixel wechseln sich immer ab. Das fällt einem noch nicht auf, obwohl ein Mensch eigentlich relativ gut Muster erkennen kann. Das ist mir das vorher nicht aufgefallen. Der ISO-Standard spezifiziert die Encoding-Prozedur und stellt sich auch heraus, dass es vier verschiedene Encode-Modi gibt. Dann muss die Version bestimmt werden. Darüber zähle ich später noch etwas. Das wird dann in ein Bitstream encodiert. Es gibt Padding dazu. Wir werden später das ganze Encoding in vier Bits geschieht. Also alles danach muss dann in Code-Words aufgeteilt werden. Und zu diesen Code-Words gibt es die Fehlerkorrektur-Codes. Danach ist es auch sehr verwirrend. Das wusste ich auch nicht. Die Daten und die Fehlerkorrekturwörter sind vermischt. Das heißt, die Daten sind eigentlich komplett verteilt. Dann die Spezialpixeln, die sind Funktionenmodule, werden Funktionenmodule genannt, werden übereinandergelegt in einem Matrix, um absichtlich Merkmale zu verschleiern, die man normalerweise sehen würde. Wenn man das natürlich in vornherein weiß, dann kann man seine Daten anpassen, so wie das Russes-Projekt getan hat. Man kann auch Folgen von Leerzeichen. Aber wegen diesen Maskings sieht man eben keine Muster. Und schließlich wird noch ein Format und die Versionsinformation hinzugefügt. Wie ich gesagt habe, muss die Daten erkundiert werden. Es gibt die vier verschiedenen Modi. Die erste Anwendung gefunden hat war die numerische Inkodierung, wo man nur Zahlen inkodieren konnte. Das heißt, drei Zeichen werden in zehn Bit inkodiert, also in Zahl von 1 bis 2032. Dann gibt es die alphanomerischen Modus, der eine Ersetzungstabelle verwendet mit 45 Charakteren. Und hier werden zwei Zeichen in 11 Bits inkodiert. Der Modus 8 Bit Bait ist so, wie man es erwarten würde. Und der Kenji Mode habe ich selber noch nie selbst gesehen und benutzt 13 Bit für zwei Bait Zeichen. Ich weiß nicht, wie das funktioniert. Ich sperre hier kein Chinesisch. Also, die Extended Channel Interpretation ist auch interessant. Damit kann man zwischen verschiedenen Interpretationen wechseln. Mit den selben Modi, die normalerweise ASCII-Daten inkodieren oder Zeichen oder 8 Bit Zeichen, aber können denen eine andere Bedeutung zuweisen. Der wichtigste Modus ist vielleicht der UTF-8-Modus. Aber es gibt auch andere Modi, die ich mir noch nicht so genau angeschaut habe. Aber ich vermute, dass man dort auch noch ein paar Freiheitsgrade hinzufügen kann, indem man andere Modi wählt. Außerdem gibt es noch ein weiteres Feature, das ich noch nie gesehen habe. Er nennt sich Structured Append. Wenn alle die Daten nicht in einen Code passen oder wenn der Bereich nicht quadratisch ist, dann kann man mehrere Codes zusammensetzen, bis zu 16. Alle diese QR-Codes haben dann eine Prüfzumme und jeder der Codes hat einen Index. Und der Reader, die App, fordert dann auf, die anderen QR-Codes zu scannen. Und der weitverbreiteste Reader ist vermutlich der Barcode-Reader für Android. Der unterstützt das nicht. Aber mein Altes Nougerphon kann das tun. Ich habe ein Beispiel auf dem nächsten Slide. Ein weiterer Modus Zeichen ist das FNC1. Darüber werde ich aber nicht sprechen. Das ist Barcode Zeug. Da gibt es sehr viele spezielle Sachen. Das ist ein Beispiel für das Structured Append. Wenn Sie das probieren möchten, sind die vier Codes zusammen. Im unteren Bereich haben genau die gleiche Bedeutung wie der größere Overcode. Aber der Android-Reader kann zum Beispiel die einzelnen Codes nicht lesen. Sie zeigen nur ein Fehler. Wenn man das mit einem alten Nougerphon versucht, dann wird das Nougerphon einem sagen, dass das jetzt der erste von vier Codes ist und dann die weiteren Codes scannen. Wie viel kann man in einem QR-Code unterbringen? Eine ganze Menge. Codegröße und die Speicherkapsität hängen von der Version ab. Es gibt 40 Versionen. Es sind nicht Software-Versionen, sondern es ist nur die Länge des Codes, die angegeben ist. Es gibt etwas, was mir als die Version bezeichnen würde. Das ist der Model-Code. Wir benutzen immer den Model-2-Code, der Model-1-Code, den gibt es eigentlich nicht mehr. Das hier ist der Version-1-Code. Es speichert 150 Datenbits und er hat Fehler, Korrekturputs. Wie man sehen kann, gibt es etwas, was sich ändert zwischen Version 1 und Version 2. Es gibt ein neues Ausrichtungsmuster. Neue Pixel kommen dazu. Bei Version 2 gibt es dann dieses Ausrichtungsmuster. Es wird immer größer und größer. Ab einem bestimmten Punkt bei Version 7 gibt es dann weitere Ausrichtungsmuster. Ein weiterer Änderung, die man sehen kann, ist, dass Versionsinformationen auch dazu kommen. Version 7 mit 8, 2000 Bits, 20, 6000 Bits, geht hoch bis zu Version 40, die dann 23.000 Datenbits speichern kann. Beim jeweils gleichen Fehler, Korrekturlevel. Dieser hier speichert die Buchstaben Q&R, und der Rest ist Padding, Bühlerraum. Da hat man den ganzen Bits nicht gebraucht. Aus der Spezifikation des Seiten und Seiten von Tabellen, die sagen, wie viel Speicherkapazität in jedem Code drin ist, zum Beispiel eben die Version 40 hat 23.000 Bits. Das sind ungefähr 7.000 Zahlen oder etwa 3.000 Charakters. Wie ich schon früher sagte, Daten und Fehler-Korrektur sind miteinander vermischt. Andere Spezifikationen, das hier sind Code-Worte, das sind 8 Bits. Die Daten-Code-Worte sind hier angegeben. Also Hello World wäre H, E, L, L und so weiter. Wie jede dieser Zeilen ist dann die Fehler-Korrektur berechnet. Um es dann in den Code einzubringen, gehen sie spaltenweise, von hier nach da an, dort. Auf dem nächsten Zeit zeige ich euch ein Beispiel. Wenn man die Daten-Blocke outlayt, dann fängt man rechts unten an. Hier ist der erste, der zweite, der dritte und so weiter. Um hoch, dann wieder runter, dann wieder hoch und wieder runter, dann tic-tac. Und hier ist ein anderer Debug-Output von meinem Programm, der einem sagt, welcher Code welcher ist. Hier ist der erste, hier ist der zweite. Hier gibt es diese Vermischung. Ich weiß nicht noch, wie viele es sind. Es sind vielleicht 11, 21, 31, 42 und so weiter. Also hier ist die Mischung zu sehen. Was die meisten Leute nicht wissen, es gibt auch eine Maskierung. Es tut, dass ein QR-Code-Reader diese Ausricht-Muster findet. Selbst wenn man ein Muster inkludiert, was eigentlich ausschaut, wie ein Findermuster, dann würde man das nicht so sehen. Es gibt sieben verschiedene Masken, die mit X-Or drübergelegt werden, die Pixel invertieren. Wenn man alle sieben nacheinander drüberlegt, dann was die Spezifikation sagt, man probiert alle sieben aus und der beste Resultat gibt den, der man oder das Erwähnungs- und Schlechte. Hier ist noch mal ein Debug-Output von meinem Programm, das zeigt uns, wo die Funktionsmodules sind. Also die Ausricht-Muster in den Firm-Ecken, dann die Format-Information, das sind die F's hier. Es gibt eine zweite Kopie weiter hier unten und hier drüben, also selbst, wenn man die Ecken nicht findet, dann ist es immer noch in Ordnung. Es gibt Versionsinformationen hier und dort. Also selbst wenn man eine dieser Ecken abschneidet, ist man immer noch in Ordnung. Und hier sind die Ausricht-Muster und das Timing-Pettern. Um euch zu zeigen, wie viele Freiheitsgrade es gibt, zeige ich ein kleines Beispiel. Ich inkutiere den Text Hello32C3 über diese Mod in die Kitas. Ich will es in drei Abschnitte aufsplitten. Ich benutze 8-Bit-Bytes für diese 4 Charakters. Das wäre der resultierende Bit-Stream. Wir fangen oben links an und nutzen es einfach als Bit-Stream. Wir fügen das Padding hinzu und das ausfüllen. Das ist genau der 8-Bit-Bit-Indicator, die wir in 60 hier. Und das wäre die resultierende Struktur. Das sind die Datenwörter und das sind die Resolomon-Federkorrekturwerte. Aber ich bin nicht gut mit Mathematik und habe einfach die Python-Library benutzt, die A-Open-Source. Und ich inkondiere das in diese Matrix. Und das ist der QR-Code, der dabei rauskommt. Einer der möglichen Codes stellt sich heraus, dass man ganz viele verschiedene Codes in den Ring kann, die semantisch identisch sind, aber komplett anders aussehen. Welches der komplette Grund ist, warum ich hier bin? Jeder dieser Codes geben die dieselbe Folge zurück. Hallo 32-C3, aber sie sehen überhaupt nicht ähnlich aus in der inkludierten Version. Und sie sehen auch nicht gerade ähnlich aus in der Debug-Version. In der Debug-Version sehen sie auch nicht gerade ähnlich aus. Das ist einfach ohne die Maskierung. Jetzt, wenn man alle diese Elemente kontrollieren könnte, könnte man einen Codes außer aussehen lassen, wie man möchte. Mein großer Plan für die Zukunft ist, dass man ein grafisches User Interface hat, wo man einfach nur auf den Knopf drücken muss, um einfach nur auf den Knopf drücken zu müssen. Aber ich habe einfach nur die Infrastruktur dahinter, soweit bin ich nämlich noch nicht. Und das kann mir der Dekodierung und der Inkludierung helfen, um das erwünschte Resultat zu bekommen. Um dies zu machen, braucht man etwas wie ein Assembler. Die Schnittstelle für den Assembler ist noch nicht ganz fertig, aber so wie man ein Software-Assembler machen würde, gibt man eben sehr low-level Informationen, was er tun sollte. Und dann wird das den Code für dich für sie zusammensetzen. Man kann es auf einem sehr niedrigen Level modifizieren. Das sind die Nicht-Standard-Dimensionen, die man customisieren kann. Man kann mit dem Inkludier-Modus herumspielen. Man kann die Coding-Modi aufteilen. Man kann Extended Channel Interpretation einfügen in zufälligen Punkten, wenn man will. Was man auch tun kann, das habe ich vorhin noch nicht ausprobiert, ist Padding einzufügen. Vorhin ist uns ein Terminator aufgetreten. Das ist das Modusindikators. Meiste Dekoder würden das einfach dekodieren und werden in Ordnung. Das kann man auch machen. Das ist eine ziemliche Standardanwendung. Wenn man bei URLs zum Beispiel große und klein Buchstaben vertauschen kann, ist es simatisch equivalent. Übschüssen wäre es, wenn man einfach in den Code reinmalen könnte, was man machen will. Und dann schaut, wie das nach der Fehlekultur ausschaut. Wenn man etwas findet, was ein echter Domainname ist, oder kein echter Domainname ist, dann könnte man das registrieren und dann umleiten auf seiner eigenen Domain. Das mache ich als nächstes. Momentan ist meine Business Card ein Standardcode, aber ich glaube, ich werde das bald ändern. Man kann all diese Techniken kombinieren, auch die von Russell. Wenn man dann im gewünschten Code sehr nahe kommt, kann man den Rest einfach übermalen. Der Rest hat dann Fehlekorrektur. Wie schon gesagt, man kann das Niveau von Fehlekorrektur wählen. Die Funktionsinformation hat etwa 30 Prozent. 15-Bits werden kodiert. 6-Bits werden in 18-Bits kodiert. Man kann im Prinzip alles ändern, solange man nicht zu viel ändert. Den Code kann man hier auf GitHub finden. Der Code ist noch nicht so, es sind nutzlich. Aber ich glaube, so ist mir mal aufhören. Wir haben nur noch vier Minuten. Ah, ja, das versucht es mal zu scannen hier. Thank you so much, Eric, that we still have time for questions. So, if you have any questions, please come to the microphones. We have them here and also in the back. And we also have a signal angel, and I'm checking whether we have some questions from the internet. We have one, so please. Wir haben eine Frage aus dem Internet. So, one user in the ISC states that according to... Also, ein Gebrauchsfall dacht, DensuWave, die haben eine FAQ. Da steht drauf, dass die unter Umständen patentrechte gültig machen würden. Also, ich weiß, dass es eine Variante von CR codes gibt, die Farben für Informationen verwenden. Aber ich weiß nicht, ob sie darauf anspielen. Aber ja, F-Patent-Gesetz. Wir sind hier in Deutschland. Ich bin mir nicht sicher, ob Sie das Masking erklären, erklärt haben. Es wird dann die Maskierung beim Dekodieren, beim Inkodieren, war klar. Das Masking ist in den Funktionenmodulen implementiert. Wir sind die ersten zwei Module kontrollieren, was für einen Fehlerkorrekturmodus wir haben. Die ersten zwei sind die nächsten drei Bits inkludieren, was für eine Art von Maskierung verwendet werden. Und die sind nicht maskiert. Entweder hier oder hier kann man diese Bits lesen und dann weiß man, was für eine Maskierung verwendet wurde. Dann einfach ein X-Roll und dann kann man das wieder machen. Ihr habt die Übersetzung des Fotos.