home *** CD-ROM | disk | FTP | other *** search
/ PC Professionell 1999 October / PCpro_1999_10.ISO / Tools / vbcrypt / DES.frm (.txt) next >
Encoding:
Visual Basic Form  |  1998-03-02  |  14.6 KB  |  575 lines

  1. VERSION 5.00
  2. Object = "{07D7C6E4-AE76-11D0-9A6F-000100000000}#1.0#0"; "DES.OCX"
  3. Object = "{F9043C88-F6F2-101A-A3C9-08002B2F49FB}#1.1#0"; "COMDLG32.OCX"
  4. Object = "{6B7E6392-850A-101B-AFC0-4210102A8DA7}#1.2#0"; "COMCTL32.OCX"
  5. Begin VB.Form frmHaupt 
  6.    BorderStyle     =   3  'Fester Dialog
  7.    Caption         =   "VBCrypt 0.9"
  8.    ClientHeight    =   3060
  9.    ClientLeft      =   1635
  10.    ClientTop       =   1695
  11.    ClientWidth     =   5505
  12.    Icon            =   "DES.frx":0000
  13.    LinkTopic       =   "Form1"
  14.    MaxButton       =   0   'False
  15.    MinButton       =   0   'False
  16.    ScaleHeight     =   3060
  17.    ScaleWidth      =   5505
  18.    ShowInTaskbar   =   0   'False
  19.    Begin VB.CheckBox chkProtokolldatei 
  20.       Caption         =   "&Protokolldatei erstellen"
  21.       BeginProperty Font 
  22.          Name            =   "Arial"
  23.          Size            =   9.75
  24.          Charset         =   0
  25.          Weight          =   400
  26.          Underline       =   0   'False
  27.          Italic          =   0   'False
  28.          Strikethrough   =   0   'False
  29.       EndProperty
  30.       Height          =   255
  31.       Left            =   120
  32.       TabIndex        =   5
  33.       Top             =   2400
  34.       Width           =   2535
  35.    End
  36.    Begin ComctlLib.ProgressBar barFortschritt 
  37.       Height          =   315
  38.       Left            =   120
  39.       TabIndex        =   4
  40.       Top             =   960
  41.       Visible         =   0   'False
  42.       Width           =   5115
  43.       _ExtentX        =   9022
  44.       _ExtentY        =   556
  45.       _Version        =   327680
  46.       Appearance      =   1
  47.       MouseIcon       =   "DES.frx":0442
  48.    End
  49.    Begin MSComDlg.CommonDialog CommonDialog1 
  50.       Left            =   4320
  51.       Top             =   2520
  52.       _ExtentX        =   847
  53.       _ExtentY        =   847
  54.       _Version        =   327680
  55.       CancelError     =   -1  'True
  56.    End
  57.    Begin VB.CommandButton cmdEntschl
  58. sseln 
  59.       Caption         =   "&Entschl
  60. sseln"
  61.       BeginProperty Font 
  62.          Name            =   "Arial"
  63.          Size            =   9.75
  64.          Charset         =   0
  65.          Weight          =   400
  66.          Underline       =   0   'False
  67.          Italic          =   0   'False
  68.          Strikethrough   =   0   'False
  69.       EndProperty
  70.       Height          =   675
  71.       Left            =   3720
  72.       TabIndex        =   2
  73.       Top             =   1440
  74.       Width           =   1515
  75.    End
  76.    Begin VB.TextBox txtSchl
  77. ssel 
  78.       BeginProperty Font 
  79.          Name            =   "Arial"
  80.          Size            =   9.75
  81.          Charset         =   0
  82.          Weight          =   400
  83.          Underline       =   0   'False
  84.          Italic          =   0   'False
  85.          Strikethrough   =   0   'False
  86.       EndProperty
  87.       Height          =   375
  88.       Left            =   2520
  89.       MaxLength       =   8
  90.       TabIndex        =   1
  91.       Top             =   360
  92.       Width           =   1575
  93.    End
  94.    Begin DESLib.DES DES1 
  95.       Left            =   4680
  96.       Top             =   2640
  97.       _Version        =   65536
  98.       _ExtentX        =   741
  99.       _ExtentY        =   741
  100.       _StockProps     =   0
  101.    End
  102.    Begin VB.CommandButton cmdVerschl
  103. sseln 
  104.       Caption         =   "&Verschl
  105. sseln"
  106.       BeginProperty Font 
  107.          Name            =   "Arial"
  108.          Size            =   9.75
  109.          Charset         =   0
  110.          Weight          =   400
  111.          Underline       =   0   'False
  112.          Italic          =   0   'False
  113.          Strikethrough   =   0   'False
  114.       EndProperty
  115.       Height          =   675
  116.       Left            =   120
  117.       TabIndex        =   0
  118.       Top             =   1440
  119.       Width           =   1515
  120.    End
  121.    Begin MSComDlg.CommonDialog CommonDialog2 
  122.       Left            =   4800
  123.       Top             =   2520
  124.       _ExtentX        =   847
  125.       _ExtentY        =   847
  126.       _Version        =   327680
  127.       CancelError     =   -1  'True
  128.    End
  129.    Begin VB.Label Label1 
  130.       Caption         =   "DES-Schl
  131. ssel (8-Zeichen):"
  132.       BeginProperty Font 
  133.          Name            =   "Arial"
  134.          Size            =   9.75
  135.          Charset         =   0
  136.          Weight          =   400
  137.          Underline       =   0   'False
  138.          Italic          =   0   'False
  139.          Strikethrough   =   0   'False
  140.       EndProperty
  141.       Height          =   195
  142.       Left            =   720
  143.       TabIndex        =   3
  144.       Top             =   360
  145.       Width           =   1695
  146.    End
  147. Attribute VB_Name = "frmHaupt"
  148. Attribute VB_GlobalNameSpace = False
  149. Attribute VB_Creatable = False
  150. Attribute VB_PredeclaredId = True
  151. Attribute VB_Exposed = False
  152. Option Explicit
  153. Option Base 0 'Alle Arrays beginnen bei 0!!!
  154. 'Cipher-Clock-Chaining-Verfahren:
  155. 'Verschl
  156. sselung:
  157. '  Neue Chiffre = Verschl
  158. sseln( Klartext XOR vorangehende Chiffre )
  159. 'Entschl
  160. sselung:
  161. ' Klartext = vorangehende Chiffre XOR Entschl
  162. sseln( aktuell zu entschl
  163. sselnde Chiffre)
  164. 'Achtung! Die folgenden Funktionen operieren auf Byte-Arrays mit einer
  165. e von jeweils 8 Elementen. Das DES-Control arbeitet allerdings mit
  166. 'Streings. Daher sind einige umst
  167. ndliche Umwandlungen zwischen String und
  168. 'Byte-Array n
  169. tig. Weil der Quiellcode des Controls vorliegt, l
  170. t es sich
  171. 'aber nach Bedarf anpassen.
  172. 'Byte-Array per XOR mit anderem Byte-Array verkn
  173. Sub DoCBC(finew() As Byte, fiprev() As Byte)
  174.   Dim i As Integer
  175.   For i = 0 To 7
  176.     finew(i) = finew(i) Xor fiprev(i)
  177.   Next i
  178. End Sub
  179. 'Entschl
  180. sseln
  181. Private Sub cmdEntschl
  182. sseln_Click()
  183.   Dim fn1 As Integer
  184.   Dim fn2 As Integer
  185.   Dim fs As Long      'In verschl
  186. sselter Datei gespeicherte Dateil
  187.   Dim l As Long
  188.   Dim i As Integer
  189.   Dim s As String
  190.   Dim fi(7) As Byte
  191.   Dim finew(7) As Byte
  192.   Dim fiprev(7) As Byte
  193.   'Schl
  194. ssel g
  195. ltig?
  196.   If Len(txtSchl
  197. ssel) <> 8 Then
  198.     MsgBox "Bitte geben Sie einen Schl
  199. ssel mit genau 8 Zeichen ein!"
  200.     Exit Sub
  201.   End If
  202.   'Zu entschl
  203. sselnde Datei und Zieldateinamen erfragen
  204.   On Error Resume Next
  205.   Err = 0
  206.   CommonDialog1.DialogTitle = "Zu entschl
  207. sselnde Datei:"
  208.   CommonDialog1.ShowOpen
  209.   If Err Then Exit Sub  'Cancel?
  210.   CommonDialog2.DialogTitle = "Entschl
  211. sselte Datei:"
  212.   CommonDialog2.ShowSave
  213.   If Err Then Exit Sub  'Cancel?
  214.   'Quelldatei 
  215. ffnen
  216.   fn1 = FreeFile
  217.   Open CommonDialog1.filename For Binary Access Read As fn1
  218.   If Err Then
  219.     MsgBox Error$ & ": " & CommonDialog1.filename
  220.     Exit Sub
  221.   End If
  222.   'Zioeldatei 
  223. ffnen/erzeugen
  224.   fn2 = FreeFile
  225.   Open CommonDialog2.filename For Binary Access Write As fn2
  226.   If Err Then
  227.     MsgBox Error$ & ": " & CommonDialog2.filename
  228.     Close #fn1
  229.     Exit Sub
  230.   End If
  231.   'Schl
  232. ssel an Control 
  233. bergeben
  234.   DES1.Key = txtSchl
  235.   'ersten Block mit abgespeicherter Dateil
  236. nge laden
  237.   Get #fn1, , fi
  238.   'Verschl
  239. sselungsergebnis des vorangehenden Blocks zun
  240. chst = 0
  241.   ClearByteArray fiprev
  242.   'Chiffre entschl
  243. sseln
  244.   StringToByte DES1.DecryptString(ByteToString(fi)), finew
  245.   'CBC-ausf
  246. hren (in diesem Fall eigentlich 
  247. berfl
  248. ssig)
  249.   DoCBC finew, fiprev
  250.   'vorangehenden Chiffre-Block f
  251. r weitre CBS
  252. s merken
  253.   CopyByteArray fiprev, fi
  254.   'genaue L
  255. nge der Datei ermitteln
  256.   'Datei liegt als Long (4 Bytes) vor
  257.   fs = finew(3)
  258.   fs = fs * 256
  259.   fs = fs + finew(2)
  260.   fs = fs * 256
  261.   fs = fs + finew(1)
  262.   fs = fs * 256
  263.   fs = fs + finew(0)
  264.   'Die Bytes 4 bis 7 k
  265. nnten zur 
  266. berpr
  267. fung der Dateig
  268. ltigkeit
  269.   '(z.B. Magicnumber) verwendet werden.
  270.   barFortschritt.Visible = True 'Fortschrittsanzeige dargtellen
  271.   l = fs
  272.   While l >= 8
  273.     Get #fn1, , fi  'n
  274. chsten Chiffre-Block laden
  275.     'Fortschrittsanzeige aktualisieren
  276.     barFortschritt.Value = 100 - CInt((CSng(l) / CSng(fs)) * 100)
  277.     If Err Then
  278.       MsgBox Error$ & ": " & CommonDialog1.filename
  279.       GoTo Exit_Entschl
  280. sseln
  281.     End If
  282.     'Chiffre entschl
  283. sseln
  284.     StringToByte DES1.DecryptString(ByteToString(fi)), finew
  285.     'CBC mit vorangehender Chiffre
  286.     DoCBC finew, fiprev
  287.     'aktuelle Chiffre f
  288. r weitere CBC
  289. s merken
  290.     CopyByteArray fiprev, fi
  291.     'Klartext speichern
  292.     Put #fn2, , finew
  293.     If Err Then
  294.       MsgBox Error$ & ": " & CommonDialog2.filename
  295.       GoTo Exit_Entschl
  296. sseln
  297.     End If
  298.     'Dateil
  299. nge verringern
  300.     l = l - 8
  301.   Wend
  302.   If l Then 'Ist das noch 
  303. brig?
  304.     Get #fn1, , fi(i) ' letzten Chiffre-Block laden
  305.     If Err Then
  306.       MsgBox Error$ & ": " & CommonDialog1.filename
  307.       GoTo Exit_Entschl
  308. sseln
  309.     End If
  310.     'Chiffre entschl
  311. sseln
  312.     StringToByte DES1.DecryptString(ByteToString(fi)), finew
  313.     'CBC mit vorangehender Chiffre
  314.     DoCBC finew, fiprev
  315.     'Die letzten Bytes aus der Chiffre holen
  316.     i = 0
  317.     While l
  318.       Put #fn2, , finew(i) '
  319.       If Err Then
  320.         MsgBox Error$ & ": " & CommonDialog2.filename
  321.         GoTo Exit_Entschl
  322. sseln
  323.       End If
  324.       l = l - 1 'Dateil
  325. nge verringern
  326.       i = i + 1 'Index in Klartext-Array erh
  327.     Wend
  328.  End If
  329.  ' Verschl
  330. sselung in Protokolldatei eintragen
  331.  If chkProtokolldatei.Value = 1 Then
  332.     Dim DateiNr As Integer
  333.     DateiNr = FreeFile
  334.     Open "Des.log" For Append As DateiNr
  335.       Print #DateiNr, Format(Now, "Short Date")
  336.       Print #DateiNr, CommonDialog1.filename
  337.       Print #DateiNr, "Entschl
  338. sselt"
  339.     Close
  340.  End If
  341. Exit_Entschl
  342. sseln: 'Ende (auch vorzeitiges)
  343.   barFortschritt.Visible = False 'Fortschroittsanzeige weg!
  344.   Close #fn1  'Dateien schlie
  345.   Close #fn2
  346. End Sub
  347. 'Verschl
  348. sseln
  349. Private Sub cmdVerschl
  350. sseln_Click()
  351.   Dim fn1 As Integer
  352.   Dim fn2 As Integer
  353.   Dim fs As Long 'In verschl
  354. sselter Datei zu speichernde Dateil
  355.   Dim l As Long
  356.   Dim i As Integer
  357.   Dim s As String
  358.   Dim fi(7) As Byte
  359.   Dim finew(7) As Byte
  360.   Dim fiprev(7) As Byte
  361.   If Len(txtSchl
  362. ssel.Text) <> 8 Then
  363.     MsgBox "Bitte geben Sie einen Schl
  364. ssel mit genau 8 Zeichen ein!"
  365.     Exit Sub
  366.   End If
  367.   'Zu verschl
  368. sselnde Datei und Namen der verschl
  369. sselten Datei ermitteln
  370.   On Error Resume Next
  371.   Err = 0
  372.   CommonDialog1.DialogTitle = "Zu verschl
  373. sselnde Datei:"
  374.   CommonDialog1.ShowOpen
  375.   If Err Then Exit Sub
  376.   CommonDialog2.DialogTitle = "Verschl
  377. sselte Datei:"
  378.   CommonDialog2.ShowSave
  379.   If Err Then Exit Sub
  380.   'Dateil
  381. nge holen
  382.   fs = FileLen(CommonDialog1.filename)
  383.   If Err Then
  384.     MsgBox Error$ & ": " & CommonDialog1.filename
  385.     Exit Sub
  386.   End If
  387.   'Zu verschl
  388. sselnde Datei 
  389. ffnen
  390.   fn1 = FreeFile
  391.   Open CommonDialog1.filename For Binary Access Read As fn1
  392.   If Err Then
  393.     MsgBox Error$ & ": " & CommonDialog1.filename
  394.     Exit Sub
  395.   End If
  396.   'Zieldatei 
  397. ffnen/erzeugen
  398.   fn2 = FreeFile
  399.   Open CommonDialog2.filename For Binary Access Write As fn2
  400.   If Err Then
  401.     MsgBox Error$ & ": " & CommonDialog2.filename
  402.     Close #fn1
  403.     Exit Sub
  404.   End If
  405.   'Schl
  406. ssel an Control 
  407. bergeben
  408.   DES1.Key = txtSchl
  409. ssel.Text
  410.   'effektive Dateil
  411. nge in erstem, verschl
  412. sselten Block speichern
  413.   l = fs
  414.   fi(0) = l And 255
  415.   l = l \ 256
  416.   fi(1) = l And 255
  417.   l = l \ 256
  418.   fi(2) = l And 255
  419.   l = l \ 256
  420.   fi(3) = l And 255
  421.   'den rest des blocks mit zufallszahlen f
  422.   fi(4) = Int(Rnd() * 256)
  423.   fi(5) = Int(Rnd() * 256)
  424.   fi(6) = Int(Rnd() * 256)
  425.   fi(7) = Int(Rnd() * 256)
  426.   cmdVerschl
  427. sseln.Enabled = False
  428.   'Verschl
  429. sselungsergebnis des vorangehenden Blocks (zun
  430. chst alles 0)
  431.   ClearByteArray fiprev
  432.   'CBC ausf
  433.   DoCBC fi, fiprev
  434.   'Verschl
  435. sseln
  436.   StringToByte DES1.EncryptString(ByteToString(fi)), finew
  437.   'Chiffre f
  438. r weitere CBCs merken
  439.   CopyByteArray fiprev, finew
  440.   'Block speichern
  441.   Put #fn2, , finew
  442.   If Err Then
  443.     MsgBox Error$ & ": " & CommonDialog2.filename
  444.     GoTo Exit_Verschl
  445. sseln
  446.   End If
  447.   'Fortschrittsanzeige einblenden
  448.   barFortschritt.Visible = True
  449.   l = fs
  450.   While l >= 8 'Schleife 
  451. ber alle Bl
  452.     Get #fn1, , fi 'Block mit Klartext holen
  453.      
  454.     barFortschritt.Value = 100 - CInt((CSng(l) / CSng(fs)) * 100)
  455.     DoEvents
  456.     If Err Then
  457.       MsgBox Error$ & ": " & CommonDialog1.filename
  458.       GoTo Exit_Verschl
  459. sseln
  460.     End If
  461.     'CBC durchf
  462.     DoCBC fi, fiprev
  463.     'Verschl
  464. sseln
  465.     StringToByte DES1.EncryptString(ByteToString(fi)), finew
  466.     'Chiffre speichern
  467.     Put #fn2, , finew
  468.     If Err Then
  469.       MsgBox Error$ & ": " & CommonDialog2.filename
  470.       GoTo Exit_Verschl
  471. sseln
  472.     End If
  473.     'Chiffre-Block f
  474. r weitere CBCs merken
  475.     CopyByteArray fiprev, finew
  476.     'soeben verschl
  477. sselten Block von Dateil
  478. nge abziehen
  479.     l = l - 8
  480.   Wend
  481.   'Bleiben noch ein paar Bytes 
  482. brig?
  483.   If l Then
  484.     i = 0
  485.     'restliche Bytes enzeln einlesen
  486.     While l
  487.       Get #fn1, , fi(i)
  488.       If Err Then
  489.         MsgBox Error$ & ": " & CommonDialog1.filename
  490.         GoTo Exit_Verschl
  491. sseln
  492.       End If
  493.       
  494.       i = i + 1
  495.       l = l - 1
  496.     Wend
  497.     'den Rest des Block mit Zufallszahlen auff
  498.     For i = i To 7
  499.       fi(i) = Int(Rnd() * 255)
  500.     Next
  501.     'CBC mit vorangehender Chiffre ausf
  502.     DoCBC fi, fiprev
  503.     'Verschl
  504. sseln
  505.     StringToByte DES1.EncryptString(ByteToString(fi)), finew
  506.     'Chiffre Speichern
  507.     Put #fn2, , finew
  508.     If Err Then
  509.       MsgBox Error$ & ": " & CommonDialog2.filename
  510.       GoTo Exit_Verschl
  511. sseln
  512.     End If
  513.  End If
  514.  ' Verschl
  515. sselung in Protokolldatei eintragen
  516.  If chkProtokolldatei.Value = 1 Then
  517.     Dim DateiNr As Integer
  518.     DateiNr = FreeFile
  519.     Open "Des.log" For Append As DateiNr
  520.       Print #DateiNr, Format(Now, "Long Date")
  521.       Print #DateiNr, CommonDialog1.filename
  522.       Print #DateiNr, "Verschl
  523. sselt mit Schl
  524. ssel: "; txtSchl
  525. ssel.Text
  526.     Close
  527.  End If
  528. Exit_Verschl
  529. sseln:
  530.   barFortschritt.Visible = False
  531.   Close #fn1
  532.   Close #fn2
  533.   cmdVerschl
  534. sseln.Enabled = True
  535. End Sub
  536. 'Byte-Array ion einen String aus 8 Zeichen wandeln
  537. Function ByteToString(b() As Byte) As String
  538.   Dim s As String
  539.   Dim i As Integer
  540.   For i = 0 To 7
  541.     s = s & Chr$(b(i))
  542.   Next
  543.   ByteToString = s
  544. End Function
  545. 'String (8-Zeichen) in eine Byte-Array wandeln
  546. Sub StringToByte(s As String, ByRef b() As Byte)
  547.   Dim i As Integer
  548.   For i = 0 To 7
  549.     b(i) = Asc(Mid$(s, i + 1, 1))
  550.   Next
  551. End Sub
  552. 'Byte-Array elementweise in anderes kopieren
  553. Sub CopyByteArray(ByRef bdst() As Byte, ByRef bsrc() As Byte)
  554.   bdst(0) = bsrc(0)
  555.   bdst(1) = bsrc(1)
  556.   bdst(2) = bsrc(2)
  557.   bdst(3) = bsrc(3)
  558.   bdst(4) = bsrc(4)
  559.   bdst(5) = bsrc(5)
  560.   bdst(6) = bsrc(6)
  561.   bdst(7) = bsrc(7)
  562. End Sub
  563. 'Elemente eines Byte-Arrays l
  564. schen
  565. Sub ClearByteArray(ByRef bdst() As Byte)
  566.   bdst(0) = 0
  567.   bdst(1) = 0
  568.   bdst(2) = 0
  569.   bdst(3) = 0
  570.   bdst(4) = 0
  571.   bdst(5) = 0
  572.   bdst(6) = 0
  573.   bdst(7) = 0
  574. End Sub
  575.