[B2D / B3D] RC6 Ver- und Entschlüsselung

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

 

Buddah

Betreff: [B2D / B3D] RC6 Ver- und Entschlüsselung

BeitragFr, Okt 14, 2005 4:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Portierung von C++, quelle weiss ich nicht mehr.
Vielleicht nicht besonders schön portiert aber es
funktioniert Wink

BlitzBasic: [AUSKLAPPEN]
; #############################################
; # RC6 Ver- und Entschlüsselungs Algorithmus #
; #############################################
;
; RC6 kam ins Finale der AES Standard Algorithmen
; welcher den DES Standard ablösen soll. Der RC6
; Kandidat der im Finale zum einsatz kam hatte
; eine Wortlänge von 32bit, Passwort länge von 128bit
; und eine Runden Anzahl von 20.
;
; Die hier implementierte Version des RC6 bietet
; eine Wortlänge von 32bit (Hardcoded), eine Passwort
; länge von 0-256bit und eine beliebige Runden Anzahl.
;
; Hinweis:
; Es werden immer Textblöcke á 16 Zeichen verschlüsselt
; ist die länge des Orginaltextes nicht durch 16 teilbar
; wird der letzte Block durch auffüllen mit Chr$(0) auf
; die länge 16 gebracht.

Const RC6_KeyBit = 256 ;Passwörter > RC6_KeyBit werden auf RC6_KeyBit länge gekürtz
;Passwörter < RC6_KeyBit werden auf RC6_KeyBit länge mit Chr$(0) aufgefüllt
Const RC6_Rounds = 20 ;Beliebige Ganzzahl >= 0
Dim RC6_S(2*RC6_Rounds+3)

passwort$ = \"semmelbrösel\"
plain$ = \"test1234testblubblalaberrababersabbeldiebabbel\"


RC6_Init(passwort$)

enc$ = RC6_Encrypt$(plain$)
dec$ = RC6_Decrypt$(enc$)

Print plain$
Print enc$
Print dec$

WaitKey()
End

Function RC6_Init(pass$)
Local RC6_L[7]
ilen = Len(pass$)
slen = RC6_KeyBit Shr 3
If ilen < slen Then pass$ = pass$ + String(Chr(0),slen-ilen)
If ilen > slen Then pass$ = Mid$(pass$,1,slen)
RC6_P32 = $B7E15163 ;Standardwerte des RC6 AES Kandidat können aber für \"eigene\"
RC6_Q32 = $9E3779B9 ;Verschlüsselungsverfahren beliebig ersetzt werden.
dblRounds = RC6_Rounds Shl 1
b = Len(pass$)
c = (b+3) Shr 2
RC6_L[c-1] = 0
For i = 32 To 1 Step -1
RC6_L[(i-1) Shr 2] = (RC6_L[(i-1) Shr 2] Shl 8) + Asc(Mid$(pass$,i,1))
Next
RC6_S(0) = RC6_P32
For i = 1 To dblRounds+3
RC6_S(i) = RC6_S(i-1) + RC6_Q32
Next
A=0:B=0:i=0:j=0
v = dblRounds+4
If c > v Then v = c
v = v * 3
For s = 1 To v
A = ((RC6_S(i) + A + B) Shr 29) Or ((RC6_S(i) + A + B) Shl 3)
RC6_S(i) = A
B = ((RC6_L[j] + A + B) Shr (32-(A + B))) Or ((RC6_L[j] + A + B) Shl (A + B))
RC6_L[j] = B
i = (i + 1) Mod (dblRounds+4)
j = (j + 1) Mod c
Next
End Function

Function RC6_Encrypt$(plaintext$)
dblRounds = RC6_Rounds Shl 1
For k = 1 To Len(plaintext$) Step 16
pblock$ = Mid$(plaintext$,k,16)
lp = Len(pblock$)
If lp < 16 Then pblock$ = pblock$ + String(Chr(0), 16-lp) ;Hier Chr(0) ersetzen durch
;beliebigen anderen Char falls
;ein anderes Auffüllzeichen benötigt wird.
For i = 1 To 4
RC6_A = RC6_A Or (Asc(Mid$(pblock$, i,1)) Shl ((4-i) Shl 3))
RC6_B = RC6_B Or (Asc(Mid$(pblock$, 4+i,1)) Shl ((4-i) Shl 3))
RC6_C = RC6_C Or (Asc(Mid$(pblock$, 8+i,1)) Shl ((4-i) Shl 3))
RC6_D = RC6_D Or (Asc(Mid$(pblock$,12+i,1)) Shl ((4-i) Shl 3))
Next

RC6_B = RC6_B + RC6_S(0)
RC6_D = RC6_D + RC6_S(1)
For i = 2 To dblRounds Step 2
t = ((RC6_B * ((RC6_B Shl 1) + 1)) Shr 27) Or ((RC6_B * ((RC6_B Shl 1) + 1)) Shl 5)
u = ((RC6_D * ((RC6_D Shl 1) + 1)) Shr 27) Or ((RC6_D * ((RC6_D Shl 1) + 1)) Shl 5)
RC6_A = (((RC6_A Xor t) Shr (32-u)) Or ((RC6_A Xor t) Shl u)) + RC6_S(i)
RC6_C = (((RC6_C Xor u) Shr (32-t)) Or ((RC6_C Xor u) Shl t)) + RC6_S(i+1)
x = RC6_A:RC6_A = RC6_B:RC6_B = RC6_C:RC6_C = RC6_D:RC6_D = x
Next
RC6_A = RC6_A + RC6_S(dblRounds + 2)
RC6_C = RC6_C + RC6_S(dblRounds + 3)

For i = 1 To 4
ea$ = ea$ + Chr(RC6_A Shr ((4-i) Shl 3) And $FF)
eb$ = eb$ + Chr(RC6_B Shr ((4-i) Shl 3) And $FF)
ec$ = ec$ + Chr(RC6_C Shr ((4-i) Shl 3) And $FF)
ed$ = ed$ + Chr(RC6_D Shr ((4-i) Shl 3) And $FF)
Next

result$ = result$ + ea$+eb$+ec$+ed$

ea$=\"\":eb$=\"\":ec$=\"\":ed$=\"\"
RC6_A=0:RC6_B=0:RC6_C=0:RC6_D=0
Next
Return result$
End Function

Function RC6_Decrypt$(plaintext$)
dblRounds = RC6_Rounds Shl 1
For k = 1 To Len(plaintext$) Step 16
pblock$ = Mid$(plaintext$,k,16)

For i = 1 To 4
RC6_A = RC6_A Or (Asc(Mid$(pblock$, i,1)) Shl ((4-i) Shl 3))
RC6_B = RC6_B Or (Asc(Mid$(pblock$, 4+i,1)) Shl ((4-i) Shl 3))
RC6_C = RC6_C Or (Asc(Mid$(pblock$, 8+i,1)) Shl ((4-i) Shl 3))
RC6_D = RC6_D Or (Asc(Mid$(pblock$,12+i,1)) Shl ((4-i) Shl 3))
Next

RC6_C = RC6_C - RC6_S(dblRounds + 3)
RC6_A = RC6_A - RC6_S(dblRounds + 2)
For i = dblRounds To 2 Step -2
x = RC6_D:RC6_D = RC6_C:RC6_C = RC6_B:RC6_B = RC6_A:RC6_A = x
u = ((RC6_D * ((RC6_D Shl 1) + 1)) Shr 27) Or ((RC6_D * ((RC6_D Shl 1) + 1)) Shl 5)
t = ((RC6_B * ((RC6_B Shl 1) + 1)) Shr 27) Or ((RC6_B * ((RC6_B Shl 1) + 1)) Shl 5)
RC6_C = (((RC6_C - RC6_S(i+1)) Shl (32-t)) Or ((RC6_C - RC6_S(i+1)) Shr t)) Xor u
RC6_A = (((RC6_A - RC6_S(i)) Shl (32-u)) Or ((RC6_A - RC6_S(i)) Shr u)) Xor t
Next
RC6_D = RC6_D - RC6_S(1)
RC6_B = RC6_B - RC6_S(0)

For i = 1 To 4
ea$ = ea$ + Chr(RC6_A Shr ((4-i) Shl 3) And $FF)
eb$ = eb$ + Chr(RC6_B Shr ((4-i) Shl 3) And $FF)
ec$ = ec$ + Chr(RC6_C Shr ((4-i) Shl 3) And $FF)
ed$ = ed$ + Chr(RC6_D Shr ((4-i) Shl 3) And $FF)
Next

result$ = result$ + ea$+eb$+ec$+ed$

ea$=\"\":eb$=\"\":ec$=\"\":ed$=\"\"
RC6_A=0:RC6_B=0:RC6_C=0:RC6_D=0
Next
Return result$
End Function

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group