EDIT / überarbeitet:
Code: Alles auswählen
;***********************************************************
;* Usage: DES encription -> setkey(0,0,key): des(in,out) *
;* DES decription -> setkey(0,1,key): des(in,out) *
;* key (8BYTE) -> key used For encription/decription *
;* in (8BYTE) -> Data To encrypt/decrypt *
;* out (8BYTE) -> Data encripted/decripted *
;***********************************************************
Structure BYT
b.b[768]
EndStructure
DataSection
; PERMUTED CHOICE 1 (PC1)
PC1:
Data.b 57,49,41,33,25,17, 9
Data.b 1,58,50,42,34,26,18
Data.b 10, 2,59,51,43,35,27
Data.b 19,11, 3,60,52,44,36
Data.b 63,55,47,39,31,23,15
Data.b 7,62,54,46,38,30,22
Data.b 14, 6,61,53,45,37,29
Data.b 21,13, 5,28,20,12, 4
; Schedule of left shifts For C And D blocks
shifts:
Data.b 1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1
; PERMUTED CHOICE 2 (PC2)
PC2:
Data.b 14,17,11,24, 1, 5
Data.b 3,28,15, 6,21,10
Data.b 23,19,12, 4,26, 8
Data.b 16, 7,27,20,13, 2
Data.b 41,52,31,37,47,55
Data.b 30,40,51,45,33,48
Data.b 44,49,39,56,34,53
Data.b 46,42,50,36,29,32
; INITIAL PERMUTATION (IP)
IP:
Data.b 58,50,42,34,26,18,10, 2
Data.b 60,52,44,36,28,20,12, 4
Data.b 62,54,46,38,30,22,14, 6
Data.b 64,56,48,40,32,24,16, 8
Data.b 57,49,41,33,25,17, 9, 1
Data.b 59,51,43,35,27,19,11, 3
Data.b 61,53,45,37,29,21,13, 5
Data.b 63,55,47,39,31,23,15, 7
; REVERSE FINAL PERMUTATION (IP-1)
RFP:
Data.b 8,40,16,48,24,56,32,64
Data.b 7,39,15,47,23,55,31,63
Data.b 6,38,14,46,22,54,30,62
Data.b 5,37,13,45,21,53,29,61
Data.b 4,36,12,44,20,52,28,60
Data.b 3,35,11,43,19,51,27,59
Data.b 2,34,10,42,18,50,26,58
Data.b 1,33, 9,41,17,49,25,57
; E BIT-SELECTION TABLE
E:
Data.b 32, 1, 2, 3, 4, 5
Data.b 4, 5, 6, 7, 8, 9
Data.b 8, 9,10,11,12,13
Data.b 12,13,14,15,16,17
Data.b 16,17,18,19,20,21
Data.b 20,21,22,23,24,25
Data.B 24,25,26,27,28,29
Data.B 28,29,30,31,32, 1
; PERMUTATION FUNCTION P
P:
Data.b 16, 7,20,21
Data.b 29,12,28,17
Data.b 1,15,23,26
Data.b 5,18,31,10
Data.b 2, 8,24,14
Data.b 32,27, 3, 9
Data.b 19,13,30, 6
Data.b 22,11, 4,25
; 8 S-BOXES
S:
Data.b 14, 4,13, 1, 2,15,11, 8, 3,10, 6,12, 5, 9, 0, 7
Data.b 0,15, 7, 4,14, 2,13, 1,10, 6,12,11, 9, 5, 3, 8
Data.b 4, 1,14, 8,13, 6, 2,11,15,12, 9, 7, 3,10, 5, 0
Data.b 15,12, 8, 2, 4, 9, 1, 7, 5,11, 3,14,10, 0, 6,13
Data.b 15, 1, 8,14, 6,11, 3, 4, 9, 7, 2,13,12, 0, 5,10
Data.b 3,13, 4, 7,15, 2, 8,14,12, 0, 1,10, 6, 9,11, 5
Data.b 0,14, 7,11,10, 4,13, 1, 5, 8,12, 6, 9, 3, 2,15
Data.b 13, 8,10, 1, 3,15, 4, 2,11, 6, 7,12, 0, 5,14, 9
Data.b 10, 0, 9,14, 6, 3,15, 5, 1,13,12, 7,11, 4, 2, 8
Data.b 13, 7, 0, 9, 3, 4, 6,10, 2, 8, 5,14,12,11,15, 1
Data.b 13, 6, 4, 9, 8,15, 3, 0,11, 1, 2,12, 5,10,14, 7
Data.b 1,10,13, 0, 6, 9, 8, 7, 4,15,14, 3,11, 5, 2,12
Data.b 7,13,14, 3, 0, 6, 9,10, 1, 2, 8, 5,11,12, 4,15
Data.b 13, 8,11, 5, 6,15, 0, 3, 4, 7, 2,12, 1,10,14, 9
Data.b 10, 6, 9, 0,12,11, 7,13,15, 1, 3,14, 5, 2, 8, 4
Data.b 3,15, 0, 6,10, 1,13, 8, 9, 4, 5,11,12, 7, 2,14
Data.b 2,12, 4, 1, 7,10,11, 6, 8, 5, 3,15,13, 0,14, 9
Data.b 14,11, 2,12, 4, 7,13, 1, 5, 0,15,10, 3, 9, 8, 6
Data.b 4, 2, 1,11,10,13, 7, 8,15, 9,12, 5, 6, 3, 0,14
Data.b 11, 8,12, 7, 1,14, 2,13, 6,15, 0, 9,10, 4, 5, 3
Data.b 12, 1,10,15, 9, 2, 6, 8, 0,13, 3, 4,14, 7, 5,11
Data.b 10,15, 4, 2, 7,12, 9, 5, 6, 1,13,14, 0,11, 3, 8
Data.b 9,14,15, 5, 2, 8,12, 3, 7, 0, 4,10, 1,13,11, 6
Data.b 4, 3, 2,12, 9, 5,15,10,11,14, 1, 7, 6, 0, 8,13
Data.b 4,11, 2,14,15, 0, 8,13, 3,12, 9, 7, 5,10, 6, 1
Data.b 13, 0,11, 7, 4, 9, 1,10,14, 3, 5,12, 2,15, 8, 6
Data.b 1, 4,11,13,12, 3, 7,14,10,15, 6, 8, 0, 5, 9, 2
Data.b 6,11,13, 8, 1, 4,10, 7, 9, 5, 0,15,14, 2, 3,12
Data.b 13, 2, 8, 4, 6,15,11, 1,10, 9, 3,14, 5, 0,12, 7
Data.b 1,15,13, 8,10, 3, 7, 4,12, 5, 6,11, 0,14, 9, 2
Data.b 7,11, 4, 1, 9,12,14, 2, 0, 6,10,13,15, 3, 5, 8
Data.b 2, 1,14, 7, 4,10, 8,13,15,12, 9, 0, 3, 5, 6,11
; Key schedule of 16 48-bit subkeys generated from 64-bit key
KS:
Data.b 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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data.b 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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data.b 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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data.b 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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data.b 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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data.b 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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data.b 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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data.b 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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data.b 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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data.b 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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data.b 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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data.b 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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data.b 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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data.b 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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data.b 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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data.b 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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
EndDataSection
;******************************************************************************
;* PACK8() Pack 64 bytes at 1 bit/byte into 8 bytes at 8 bits/byte *
;* packed packed block ( 8 bytes at 8 bits/byte) *
;* binary unpacked block (64 bytes at 1 bit /byte) *
;******************************************************************************
Procedure pack8(*packed.BYT,*binary.BYT)
For i=0 To 7
d=0
For j=0 To 7
d+(*binary\b[i*8+j]&1)<<(7-j)
Next j
*packed\b[i] = d
Next i
EndProcedure
;******************************************************************************
;* UNPACK8() Unpack 8 bytes at 8 bits/byte into 64 bytes at 1 bit/byte *
;* packed packed block ( 8 bytes at 8 bits/byte) *
;* binary unpacked block (64 bytes at 1 bit /byte) *
;******************************************************************************
Procedure unpack8(*packed.BYT,*binary.BYT)
For i=0 To 63
*binary\b[i]= *packed\b[i/8]>>(7-i%8)&1
Next i
EndProcedure
;******************************************************************************
;* SETKEY() Generate key schedule For given key And type of cryption *
;* sw1 parity: 0=ignore, 1=check *
;* sw2 type cryption: 0=encrypt,1=decrypt *
;* pkey 64-bit key packed into 8 bytes *
;******************************************************************************
Procedure setkey(sw1,sw2,*pkey)
*key.BYT = AllocateMemory (63)
*cd.BYT = AllocateMemory (63)
; /* Double-check 'parity' parameter */
If sw1<>0 And sw1<>1
PrintN("setkey: bad parity parameter")
Input()
End
EndIf
; Double-check 'type of cryption' parameter
If sw2 <> 0 And sw2 <> 1
PrintN("setkey: bad cryption parameter")
Input()
End
EndIf
; Unpack KEY from 8 bits/byte into 1 bit/byte
unpack8(*pkey,*key)
; Check For ODD key parity
If sw1=1
For i=0 To 63
k=1
For j=0 To 6
i+1
k+*key\b[i-1]
k=k%2
Next j
If *key\b[i]=k
Else
PrintN("parity error")
Input()
End
EndIf
Next i
EndIf
; Permute unpacked key with PC1 To generate C And D
For i=0 To 55
*cd\b[i] = *key\b[PeekB(?PC1+i)-1]
Next i
; Rotate And permute C And D To generate 16 subkeys
For i=0 To 15
; Rotate C And D
For j=0 To (PeekB(?shifts+i))-1
t1 = *cd\b
t2 = *cd\b[28]
For k=0 To 26
*cd\b[k] =*CD\b[k+ 1]
*cd\b[k+28]=*CD\b[k+29]
Next k
*cd\b[27] = t1
*cd\b[55] = t2
Next j
; Set order of subkeys For type of cryption
If sw2 = 1
j = 15-i
Else
j = i
EndIf
; Permute C And D with PC2 To generate KS
For k=0 To 47
PokeB(?KS+j*48+k,PeekB(*CD+PeekB(?PC2+k)-1))
Next k
Next i
FreeMemory (*key)
FreeMemory (*CD)
EndProcedure
;******************************************************************************
;* DES() *
;* in; packed 64-bit INPUT block *
;* out; packed 64-bit OUTPUT block *
;******************************************************************************
Procedure des(*in,*out)
*block.BYT = AllocateMemory(63)
*LR.BYT = AllocateMemory(63)
*preS.BYT = AllocateMemory(48)
*f.BYT = AllocateMemory(32)
*IP.BYT = ?IP
*KS.BYT = ?KS
*E.BYT = ?E
*S.BYT = ?S
*P.BYT = ?P
*RFP.BYT= ?RFP
; Unpack the INPUT block
unpack8(*in,*block)
; Permute unpacked input block with IP To generate L And R
For j=0 To 63
*LR\b[j] = *block\b[*IP\b[j]-1]
Next j
; Perform 16 rounds
For i=0 To 15
; Expand R To 48 bits with E And XOR with i-th subkey
For j=0 To 47
*preS\b[j]=*KS\b[(i*48)+j]!*LR\b[*E\b[j]+31]
Next j
; Map 8 6-bit blocks into 8 4-bit blocks using S-Boxes
For j=0 To 7
; Compute index t into j-th S-box
k=6*j
t= *preS\b[k ]
t=(t<<1)|*preS\b[k+5]
t=(t<<1)|*preS\b[k+1]
t=(t<<1)|*preS\b[k+2]
t=(t<<1)|*preS\b[k+3]
t=(t<<1)|*preS\b[k+4]
; Fetch t-th entry from j-th S-box
t=*S\b[j*64+t]
; Generate 4-bit block from S-box entry
k=4*j
*f\b[k] =(t>>3)&1
*f\b[k+1]=(t>>2)&1
*f\b[k+2]=(t>>1)&1
*f\b[k+3]= t &1
Next j
For j=0 To 31
; Copy R */
t=*LR\b[j+32]
; Permute f w/ P And XOR w/ L To generate newR
*LR\b[j+32] = *LR\b[j]!*f\b[*P\b[j]-1]
*LR\b[j] = t
Next j
Next i
; /* Permute L And R with reverse IP-1 To generate output block */
For j=0 To 63
*Block\b[j]=*LR\b[*RFP\b[j]-1]
Next j
pack8(*out,*block)
FreeMemory(*block)
FreeMemory(*LR)
FreeMemory(*preS)
FreeMemory(*f)
EndProcedure
;************
Procedure.s speicherout_hex(*mem.BYT,l,q$)
For i = 0 To l-1
q$ = q$ + RSet(Hex(Val(StrU(*mem\b[i],#BYTE))),2,"0") + " "
Next i
ProcedureReturn q$
EndProcedure
; -- MAIN
DataSection
key:
Data.b $0E,$32,$92,$32,$EA,$6D,$0D,$73
Daten:
Data.b $87,$87,$87,$87,$87,$87,$87,$87
EndDataSection
*ergebnis = AllocateMemory(7)
Debug(speicherout_hex(?key,8,"key :"))
Debug(speicherout_hex(?Daten,8,"Daten:"))
Debug("-----------------------------")
Debug("")
Debug("DES decryption")
setkey(1,0,?key)
des(?daten,*ergebnis)
Debug("soll: 00 00 00 00 00 00 00 00")
Debug(speicherout_hex(*ergebnis,8,"ist :"))
Debug("DES encryption")
setkey(1,1,?key)
des(*ergebnis,*ergebnis)
Debug("soll: 87 87 87 87 87 87 87 87")
Debug(speicherout_hex(*ergebnis,8,"ist :"))
FreeMemory(*ergebnis)