DES Routines
Jan 10, 2011 11:30:53 GMT -5
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