DES Routines

new BookmarkLockedFalling
gcav
New Member
*

gcav Avatar

Posts: 11Male

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...

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
Last Edit: Jan 12, 2011 17:37:33 GMT -5 by StefanPendl
Carl Gundel - admin
Administrator
*****

Carl Gundel - admin Avatar

Posts: 550

gcav
New Member
*

gcav Avatar

Posts: 11Male

Post by gcav on Jan 12, 2011 10:57:34 GMT -5

Carl Gundel - admin Avatar
Hi and thanks.

Question: The following lines do not belong in the DES routine source (which should be saved as project named des3)?

-Carl

run "des3", #des
nmac$= #des mac$(data2mac,ドルckmac,ドルwkmac$)


That is correct, the 2 lines are a sample for running it...