Seite 1 von 1

des Algo

Verfasst: 18.01.2005 10:00
von andi256
DES ALGO:

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) 
Andi256

Verfasst: 18.01.2005 10:59
von nicolaus
wenn du jetzt auch noch eben erklärst was das is oder für was das gut is?!

Verfasst: 18.01.2005 11:12
von benny
Scheint um den Data Encrpytion Standard (kurz: DES) zu gehen.

Mehr Infos wie immer hier :

http://de.wikipedia.org/wiki/Data_Encryption_Standard

Verfasst: 18.01.2005 11:12
von crossroads
nicolaus hat geschrieben:wenn du jetzt auch noch eben erklärst was das is oder für was das gut is?!
Sieht stark nach Packer mit Ver-/Entschlüsselung aus :)

Verfasst: 18.01.2005 11:37
von freedimension
Na, ohne Packer.

Nice to have.

Großes Dankeschön

Wenn jetzt noch jemand PGP oder ElGamal oder sowas ähnliches implementieren könnte :D

Verfasst: 18.01.2005 21:15
von bluejoke
Hallo! Dankeschön!

Whow, PGP... Das wäre echt mal was. Ich hab mir überlegt, das man so auch ein sicheres Protokoll mit einem PHP-Skript (vorausgesetzt, PHP kann auch PGP) verwirklichen kann.
Das wäre echt ein Traum!