Portierung von C++, quelle weiss ich nicht mehr.
Vielleicht nicht besonders schön portiert aber es
funktioniert
BlitzBasic: [AUSKLAPPEN] [EINKLAPPEN]
Const RC6_KeyBit = 256 Const RC6_Rounds = 20 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 RC6_Q32 = $9E3779B9 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) 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
|