CBC Mode - Arbeitsweise als Code Beispiel

Knacken von Verschlüsselungen bei den Projekten RC5-72, Enigma@Home und anderen
Nachricht
Autor
walbus
Mikrocruncher
Mikrocruncher
Beiträge: 17
Registriert: 01.12.2014 20:46

CBC Mode - Arbeitsweise als Code Beispiel

#1 Ungelesener Beitrag von walbus » 05.09.2018 09:04

Der CBC Mode ist wohl einer der am häufigsten verwendeten Crypt modes

Es ist interessant sich die grundlegende Arbeitsweise einmal in der Praxis zu visualisieren.

Ich gebe euch hier einmal einen kleinen rudimentären Code in PureBasic (PB)

PureBasic kann als Test Version von der Webseite purearea.net geladen werden
Speichert diesen Code, zB, einfach als ascii Text und ändert die Datei Extension zu .pb
Dies kann man dann einfach mit drag & drop in den Editor von PB ziehen und mit F5 starten
Mehr ist nicht notwendig, es ist wirklich simplest, ohne jedes Gewurste drum rum.

Beliest man sich etwas in der Wikipedia über die verschiedenen Crypt modes, sieht man,
das sich dieser kleine Code ändern lässt, um zum Beispiel OFB oder CFB Mode zu realisieren.

So kommt man schnell dazu real zu sehen und zu verstehen was passiert, von der Theorie zur Praxis.

An sich sollte die theoretische Betrachtung immer im praktischen Versuch enden.
Es ist dann oftmals überraschend zu sehen, wenn das, was an sich funktionieren sollte, doch nicht funktioniert.

Einen Fehler in einer fehlgeschlagenen Entschlüsselung zu finden ist meist nicht einfach, da es faktisch keinen Zwischenschritt
gibt, an welchem man mit der Lokalisierung des Fehlers ansetzen kann.

Viel Spaß damit

Gruß walbus

Code: Alles auswählen

; Author  W. Albus - www.nachtoptik.de
; No warranty whatsoever
; Use at your own risk
; PureBasic

;----------------- CBC Crypting - base code ------------------

Procedure AES_Encoder(*buffer_in.quad, *buffer_out.quad, bytes, *key, *iv )
  
  Protected i, rounds=bytes>>4 -1
  Static.q Dim iv(1)
  CopyMemory(*iv, @iv(0), 16)
  
  For i=0 To rounds
    *buffer_in\q ! iv(0) : *buffer_in+8
    *buffer_in\q ! iv(1) : *buffer_in-8
    result=AESEncoder(*buffer_in ,*buffer_out ,16 ,*key ,256 ,0 , #PB_Cipher_ECB)
    CopyMemory(*buffer_out, @iv(0), 16)
    *buffer_in+16 : *buffer_out+16
  Next i
  
  ProcedureReturn result 
EndProcedure
;---------------------------------------------

Procedure AES_Decoder(*buffer_in.quad, *buffer_out.quad, bytes, *key, *iv )
  
  Protected i, rounds=bytes>>4 -1
  Static.q Dim iv(1)
  MoveMemory(*iv, @iv(0), 16)
  
  For i=0 To rounds
    result=AESDecoder(*buffer_in ,*buffer_out ,16 ,*key ,256 ,0 , #PB_Cipher_ECB)
    *buffer_out\q ! iv(0) : *buffer_out+8
    *buffer_out\q ! iv(1) : *buffer_out+8
    CopyMemory(*buffer_in, @iv(0), 16)
    *buffer_in+16
  Next i
  
  ProcedureReturn result 
EndProcedure

;---------------------------------------------
string$="aaaaaaaaaaaaaaaa"+"bbbbbbbbbbbbbbbb"+"cccccccccccccccc"+"dddddddddddddddd"
len_string=StringByteLength(string$)
*buffer_0=AllocateMemory(len_string)
string_result$=Space(len_string)

; --------------------------------------------
AES_Encoder(@string$, *buffer_0, len_string, ?KEY, ?IV )
ShowMemoryViewer(*buffer_0,len_string)

; --------------------------------------------
AES_decoder(*buffer_0, @string_result$, len_string, ?KEY, ?IV )
; ShowMemoryViewer(@string_result$,len_string)
Debug string_result$

; --------------------------------------------
DataSection ; Sample key and initialization vector for coder test demo
  KEY:
  Data.b $09 , $a9 , $20 , $40 , $35 , $b8 , $a1 , $5b , $52 , $2e , $03 ,$d5 , $34 , $11 , $00 , $08
  Data.b $11 , $b8 , $31 , $61 , $26 , $c3 , $32 , $64 , $d9 , $f3 , $01 ,$a4 , $27 , $61 , $56 , $29
  IV:
  Data.b $3d , $ae , $ba , $43 , $9d , $9e , $b5 , $30 , $b4 , $23 , $da ,$80 , $2d , $9f , $ac , $45
EndDataSection

Antworten

Zurück zu „Kryptographie“