des Algo

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
andi256
Beiträge: 100
Registriert: 06.11.2004 11:23
Computerausstattung: PB 5.30 (x64) Win7
Wohnort: Österreich

des Algo

Beitrag 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
Zuletzt geändert von andi256 am 21.01.2005 10:38, insgesamt 1-mal geändert.
Benutzeravatar
nicolaus
Moderator
Beiträge: 1175
Registriert: 11.09.2004 13:09
Kontaktdaten:

Beitrag von nicolaus »

wenn du jetzt auch noch eben erklärst was das is oder für was das gut is?!
Benutzeravatar
benny
Beiträge: 383
Registriert: 29.08.2004 09:18
Wohnort: Am Ende des www's
Kontaktdaten:

Beitrag 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
So long,
benny!
.
nur t0te f1sche schw1mmen m1t dem str0m - 00100 !
Benutzeravatar
crossroads
Beiträge: 244
Registriert: 29.08.2004 05:41
Wohnort: Rhine Main Area

Beitrag 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 :)
Man soll die Tür aufmachen, bevor man durchgeht ...
Benutzeravatar
freedimension
Admin
Beiträge: 1987
Registriert: 08.09.2004 13:19
Wohnort: Ludwigsburg
Kontaktdaten:

Beitrag 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
Beginne jeden Tag als ob es Absicht wäre!
Bild
BILDblog
Benutzeravatar
bluejoke
Beiträge: 1244
Registriert: 08.09.2004 16:33
Kontaktdaten:

Beitrag 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!
Ich bin Ausländer - fast überall
Windows XP Pro SP2 - PB 4.00
Antworten