Post by gcav on Jan 10, 2011 11:30:53 GMT -5
I needed to calculate DES-MAC, and some kind soul had already written the routines for encryption and decryption for DES on Libertybasic.
Here is the code for DES for Runbasic. Just modified some routined to not use the "byref" and use some globals.
I added the MAC routine..
For your program...
Here is the code for DES for Runbasic. Just modified some routined to not use the "byref" and use some globals.
I added the MAC routine..
For your program...
run "des3", #des
nmac$= #des mac$(data2mac$,ckmac$,wkmac$)
'DES GLOBALS
DIM S(8,64): DIM ROTS(16)
GLOBAL KEY$,P$,A$,DAT$
GLOBAL INITIALTR$,FINALTR$,SWAP$,KEYTR1$,KEYTR2$,ETR$,PTR$,CR$,LF$
CALL Initialize
MODE = 0
'result = ENCRYPTION(MODE,"05c9c4cafb9937d95bbfbedfc5d77f19a6cd5a5dab188a33dfd8979fc4b7b2be","12345678")
'result = ENCRYPTION(MODE,"This is the message to encrypt!!","12345678")
'RESULT = ENCRYPTION(MODE,"8C0534A0A9A95E18","0101010101010101")
'input "Data ";d$
'input "MasterKey";k$
'input "MACKey ";mk$
' DES-CBC routine
' if Masterkey is not empty, decrypt MACkey with masterkey before processing
function mac$(TEXT$,masterkey$,mk$)
if masterkey$<>"" then
llave$=DESdecrypt$(PackHex$(mk$),PackHex$(masterkey$))
else
llave$=PackHex$(mk$)
end if
pr$=""
WHILE LEN(TEXT$)>0
''''''''''''''''PAD WITH NUL WHEN BLOCK LESS THAN 8 BYTES''''''''''''''''
DX$=LEFT$(TEXT$,8)
PDX$=chr$(0)+chr$(0)+chr$(0)+chr$(0)+chr$(0)+chr$(0)+chr$(0)+chr$(0)
PDX$=DX$+LEFT$(PDX$,8-LEN(DX$))
if pr$<>"" then
xores$=""
pr1$=PackHex$(pr$)
for yy=1 to 8
xores$ = xores$ + chr$( (asc(mid$(PDX$,yy,1)) XOR asc( mid$(pr1$,yy,1))))
next
PDX$=xores$
end if
ENC$=DESencrypt$(PDX$,llave$)
HX$=SpecHex$(ENC$)
TEXT$=MID$(TEXT$,9)
if LEN(TEXT$)>0 then pr$=HX$
WEND
mac$=left$(HX$,8)
end function
FUNCTION ENCRYPTION(MODE,INFILE$,llave$)
IF MODE=1 THEN
TEXT$=INFILE$
WHILE LEN(TEXT$)>0
''''''''''''''''PAD WITH NUL WHEN BLOCK LESS THAN 8 BYTES''''''''''''''''
DX$=LEFT$(TEXT$,8)
PDX$=chr$(0)+chr$(0)+chr$(0)+chr$(0)+chr$(0)+chr$(0)+chr$(0)+chr$(0)
PDX$=DX$+LEFT$(PDX$,8-LEN(DX$))
ENC$=DESencrypt$(PDX$,llave$)
HX$=SpecHex$(ENC$)
'print HX$
TEXT$=MID$(TEXT$,9)
WEND
ENCRYPTION = 1
ELSE
TEXT$=INFILE$
WHILE LEN(TEXT$)>0
DX$=PackHex$(LEFT$(TEXT$,16))
DEC$=DESdecrypt$(DX$,llave$)
'PRINT DEC$
'''''''''''''''''REMOVE PADDING ADDED DURING ENCRYPTION'''''''''''''''''
TDEC$=""
FOR I=1 TO 8
CH$=MID$(DEC$,I,1)
IF CH$>CHR$(0) THEN TDEC$=TDEC$+CH$
NEXT
PRINT TDEC$;
TEXT$=MID$(TEXT$,9)
WEND
ENCRYPTION = 1
END IF
END FUNCTION
END
SUB TRANSPOSE DA$, T$, N
DIM iDAT(64)
DIM iT(64)
DIM iX(64)
FOR I=1 TO 64
IF MID$(DA$,I,1)=CHR$(1) THEN iDAT(I)=1 ELSE iDAT(I)=0
iX(I)=iDAT(I)
iT(I)=ASC(MID$(T$,I,1))
NEXT
FOR I=1 TO N
iDAT(I)=iX( iT(I) )
NEXT
ZAT$=""
FOR I=1 TO 64: ZAT$=ZAT$+CHR$(iDAT(I)): NEXT I
DAT$=LEFT$(ZAT$ ,64)
END SUB
SUB F2 I', BYREF KEY$, BYREF A$, BYREF X$
DIM Z(64)
DIM Y(64)
E$=LEFT$(A$,64)
DAT$="": CALL TRANSPOSE E$, ETR$, 48: E$=DAT$
IKEY$=LEFT$(KEY$,64)
DAT$="": CALL TRANSPOSE IKEY$, KEYTR2$ , 48: IKEY$=DAT$
FOR J=1 TO 48
IF ASC(MID$(E$,J,1))+ASC(MID$(IKEY$,J,1))=1 THEN Y(J)=1 ELSE Y(J)=0
NEXT J
FOR J=1 TO ROTS(17-I)
CALL UNROTATE
NEXT J
FOR K=1 TO 64: Z(K)=ASC(MID$(P$,K,1)): NEXT
FOR K=1 TO 8
R=32*Y(6*K-5)+16*Y(6*K)+8*Y(6*K-4)+4*Y(6*K-3)+2*Y(6*K-2)+Y(6*K-1)+1
IF ODD(S(K,R) / 8) THEN Z(4*K-3)=1 ELSE Z(4*K-3)=0
IF ODD(S(K,R) / 4) THEN Z(4*K-2)=1 ELSE Z(4*K-2)=0
IF ODD(S(K,R) / 2) THEN Z(4*K-1)=1 ELSE Z(4*K-1)=0
IF ODD(S(K,R)) THEN Z(4*K)=1 ELSE Z(4*K)=0
NEXT
P$=""
FOR K=1 TO 64: P$=P$+CHR$(Z(K)): NEXT
DAT$="": CALL TRANSPOSE P$,PTR$,32: P$=DAT$
END SUB
SUB F I', KEY$, A$, P$
DIM Z(64): DIM Y(64)
E$=LEFT$(A$,56)
DAT$="": CALL TRANSPOSE E$,ETR$, 48 : E$=DAT$
FOR J=1 TO ROTS(I)
CALL ROTATE
NEXT
IKEY$=LEFT$(KEY$,56)
DAT$="": CALL TRANSPOSE IKEY$,KEYTR2$, 48 : IKEY$=DAT$
FOR J=1 TO 48
IF ASC(MID$(E$,J,1))+ASC(MID$(IKEY$,J,1))=1 THEN Y(J)=1 ELSE Y(J)=0
NEXT
FOR K=1 TO 64: Z(K)=ASC(MID$(P$,K,1)): NEXT
FOR K=1 TO 8
R=32*Y(6*K-5)+16*Y(6*K)+8*Y(6*K-4)+4*Y(6*K-3)+2*Y(6*K-2)+Y(6*K-1)+1
IF ODD(S(K,R) / 8) THEN Z(4*K-3)=1 ELSE Z(4*K-3)=0
IF ODD(S(K,R) / 4) THEN Z(4*K-2)=1 ELSE Z(4*K-2)=0
IF ODD(S(K,R) / 2) THEN Z(4*K-1)=1 ELSE Z(4*K-1)=0
IF ODD(S(K,R)) THEN Z(4*K) =1 ELSE Z(4*K) =0
NEXT
P$=""
FOR K=1 TO 64: P$=P$+CHR$(Z(K)): NEXT
DAT$="": CALL TRANSPOSE P$,PTR$,32 : P$=DAT$
END SUB
FUNCTION DESencrypt$( PTEXT$, KY$ )
PLAINTEXT$=BINAR$(PTEXT$)
KEY$=BINAR$(KY$)
A$=LEFT$( PLAINTEXT$,64 )
DAT$="": CALL TRANSPOSE A$, INITIALTR$ ,64 : A$=DAT$
DAT$="": CALL TRANSPOSE KEY$, KEYTR1$ ,56 : KEY$=DAT$
FOR I=1 TO 16
B$=LEFT$( A$,64 )
A$=MID$(B$,33,32)
CALL F I',KEY$,A$,P$
FOR J=1 TO 32
IF ASC(MID$(B$,J,1))+ASC(MID$(P$,J,1))=1 THEN A$=A$+CHR$(1) ELSE A$=A$+CHR$(0)
NEXT
NEXT
DAT$="": CALL TRANSPOSE A$,SWAP$,64 : A$=DAT$
DAT$="": CALL TRANSPOSE A$,FINALTR$,64 : A$=DAT$
DESencrypt$=ASCII$(A$)
END FUNCTION
FUNCTION DESdecrypt$( CTEXT$, KY$ )
CRYPTEXT$=BINAR$(CTEXT$)
KEY$=BINAR$(KY$)
A$=LEFT$( CRYPTEXT$,64 )
DAT$="":CALL TRANSPOSE A$, INITIALTR$ ,64: A$=DAT$
DAT$="":CALL TRANSPOSE KEY$, KEYTR1$ ,56: KEY$=DAT$
FOR I=1 TO 16
B$=LEFT$( A$,64 )
A$=MID$(B$,33,32)
CALL F2 I ',KEY$,A$,X$
FOR J=1 TO 32
IF ASC(MID$(B$,J,1))+ASC(MID$(P$,J,1))=1 THEN A$=A$+CHR$(1) ELSE A$=A$+CHR$(0)
NEXT
NEXT
DAT$="":CALL TRANSPOSE A$,SWAP$,64: A$=DAT$
DAT$="":CALL TRANSPOSE A$,FINALTR$,64: A$=DAT$
DESdecrypt$=ASCII$(A$)
END FUNCTION
FUNCTION BINAR$( BMP$ )
BITMAP$=""
FOR j=1 TO 8
L1=ASC(MID$(BMP$,j,1))
FOR i=7 TO 0 STEP -1
IF ( 2^i AND L1 ) THEN BITMAP$=BITMAP$+CHR$(1) ELSE BITMAP$=BITMAP$+CHR$(0)
NEXT i
NEXT j
BINAR$=BITMAP$
END FUNCTION
FUNCTION ASCII$( BMP$ )
BITMAP$=""
C=0
N=7
FOR j=1 TO 64
C=C+ASC(MID$(BMP$,j,1))*2^N
N=N-1
IF ( j MOD 8 )=0 THEN
BITMAP$=BITMAP$+CHR$(C)
N=7
C=0
END IF
NEXT j
ASCII$=BITMAP$
END FUNCTION
FUNCTION PackHex$( y$ )
z$=""
for j=1 to len(y$) step 2
n=HEXDEC(mid$(y$,j,2))
z$=z$+chr$(n)
next j
PackHex$=z$
END FUNCTION
FUNCTION SpecHex$( y$ )
z$=""
FOR j=1 TO LEN(y$)
n=ASC(MID$(y$,j,1))
IF n<16 THEN z$=z$+"0"
z$=z$+DECHEX$(n)
NEXT j
SpecHex$=z$
END FUNCTION
FUNCTION RANDOMKEY$()
X$=""
FOR I=1 TO 8
X$=X$+CHR$(RND(1)*255)
NEXT I
RANDOMKEY$=X$
END FUNCTION
SUB Initialize
CR$=CHR$(13):LF$=CHR$(10)
INITIALTR$=""
DATA 58,50,42,34,26,18,10,2,60,52,44,36,28,20,12,4,62,54,46,38,_
30,22,14,6, 64,56,48,40,32,24,16,8,57,49,41,33,25,17,9,1,59,51,43,_
35,27,19,11,3,61,53,45,37,29,21,13,5,63,55,47,39,31,23,15,7
FOR I=1 TO 64:READ X:INITIALTR$=INITIALTR$+CHR$(X): NEXT I
FINALTR$=""
DATA 40,8,48,16,56,24,64,32,39,7,47,15,55,23,63,31,38,6,46,14,54,_
22,62,30,37,5,45,13,53,21,61,29,36,4,44,12,52,20,60,28,35,3,43,11,_
51,19,59,27,34,2,42,10,50,18,58,26,33,1,41,9,49,17,57,25
FOR I=1 TO 64:READ X:FINALTR$=FINALTR$+CHR$(X): NEXT I
SWAP$=""
DATA 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,01,02,03,04,05,06,07,08,09,10,_
11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32
FOR I=1 TO 64:READ X:SWAP$=SWAP$+CHR$(X): NEXT I
KEYTR1$=""
DATA 57,49,41,33,25,17,9,1,58,50,42,34,26,18,10,2,59,51,43,35,_
27,19,11,3,60,52,44,36,63,55,47,39,31,23,15,7,62,54,46,38,30,22,_
14,6,61,53,45,37,29,21,13,5,28,20,12,4,0,0,0,0,0,0,0,0
FOR I=1 TO 64:READ X:KEYTR1$=KEYTR1$+CHR$(X): NEXT I
KEYTR2$=""
DATA 14,17,11,24,1,5,3,28,15,6,21,10,23,19,12,4,26,8,16,7,27,20,_
13,2,41,52,31,37,47,55,30,40,51,45,33,48,44,49,39,56,34,53,46,42,_
50,36,29,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
FOR I=1 TO 64:READ X:KEYTR2$=KEYTR2$+CHR$(X): NEXT I
ETR$=""
DATA 32,1,2,3,4,5,4,5,6,7,8,9,8,9,10,11,12,13,12,13,14,15,_
16,17,16,17,18,19,20,21,20,21,22,23,24,25,24,25,26,27,28,29,_
28,29,30,31,32,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
FOR I=1 TO 64:READ X:ETR$=ETR$+CHR$(X): NEXT I
PTR$=""
DATA 16,7,20,21,29,12,28,17,1,15,23,26,5,18,31,10,2,8,24,14,_
32,27,3,9,19,13,30,6,22,11,4,25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,_
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
FOR I=1 TO 64:READ X:PTR$=PTR$+CHR$(X): NEXT I
'DIM ROTS(16)
DATA 1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1
FOR I=1 TO 16:READ X:ROTS(I)=X: NEXT I
'DIM S(8,64)
DATA 14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7,_
0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8,_
4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0,_
15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13
DATA 15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10,_
3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5,_
0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15,_
13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9
DATA 10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8,_
13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1,_
13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7,_
1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12
DATA 7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15,_
13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9,_
10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4,_
3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14
DATA 2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9,_
14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6,_
4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14,_
11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3
DATA 12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11,_
10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8,_
9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6,_
4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13
DATA 4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1,_
13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6,_
1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2,_
6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12
DATA 13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7,_
1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2,_
7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8,_
2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11
FOR I=1 TO 8
FOR J=1 TO 64
READ X
S(I,J)=X
NEXT J
NEXT I
END SUB
SUB ROTATE
X$=LEFT$(KEY$,56)
X$=MID$(X$,2,55)
X$=LEFT$(X$,27)+LEFT$(KEY$,1)+MID$(X$,29)
X$=LEFT$(X$,55)+MID$(KEY$,29,1 )
KEY$=LEFT$(X$,56)
END SUB
SUB UNROTATE
X$=LEFT$(KEY$,56)
X$=MID$(KEY$,28,1)+LEFT$(X$,55)
X$=LEFT$(X$,28)+MID$(KEY$,56,1)+MID$(X$,30)
KEY$=LEFT$(X$,56)
END SUB
FUNCTION ODD( N )
IF INT(N) MOD 2 = 0 THEN ODD=0 ELSE ODD=1
END FUNCTION