Difference between revisions of "DCPcrypt/de"

From Free Pascal wiki
Jump to navigationJump to search
(→‎Usage: Translation of Usage-Blocks)
m (Fixed syntax highlighting)
(8 intermediate revisions by one other user not shown)
Line 1: Line 1:
 
{{DCPcrypt}}
 
{{DCPcrypt}}
  
=== About ===
+
=== Allgemeines ===
 
* [http://www.cityinthesky.co.uk/opensource/dcpcrypt/ DCPcrypt] ist eine Sammlung cryptographischer Komponenten für Lazarus.
 
* [http://www.cityinthesky.co.uk/opensource/dcpcrypt/ DCPcrypt] ist eine Sammlung cryptographischer Komponenten für Lazarus.
  
* Die Idee hinter DCPcrypt ist, daß es möglich sein muß, per "drop in" jegliche Algorithmen und deren Implementierung einfach gegeneinander auszutauschen, mit nur einem Minimum an Codeänderung.  
+
* Die Idee hinter DCPcrypt ist, daß es möglich sein muß, per "drop in" jegliche Algorithmen und deren Implementierung einfach gegeneinander auszutauschen, nur mit minimalen Codeänderungen.  
 
Diese Ziel vor Augen sind alle kryptographischen Komponenten von einer, aus einer Reihe von mehreren, Basisklassen abgeleitet, TDCP_cipher für Verschlüsselungsalgorithmen und TDCP_hash für Hash-algorithmen.
 
Diese Ziel vor Augen sind alle kryptographischen Komponenten von einer, aus einer Reihe von mehreren, Basisklassen abgeleitet, TDCP_cipher für Verschlüsselungsalgorithmen und TDCP_hash für Hash-algorithmen.
  
Line 22: Line 22:
  
 
==== Beitragende ====
 
==== Beitragende ====
* Port to Lazarus by [http://wiki.freepascal.org/User:Barko barko] - 2006
+
* Portierung nach FPC/Lazarus von [http://wiki.freepascal.org/User:Barko barko] - 2006
 
* [http://geldenhuys.co.uk Graeme Geldenhuys] - 2009 (aktueller Bearbeiter)
 
* [http://geldenhuys.co.uk Graeme Geldenhuys] - 2009 (aktueller Bearbeiter)
  
Line 73: Line 73:
  
 
Um DCPCrypt mit der Lazarus IDE zum ersten zu Mal benutzen:
 
Um DCPCrypt mit der Lazarus IDE zum ersten zu Mal benutzen:
* In 'Package > Package-Datei (.lpk) öffnen', dcpcrypt.lpk öffnen und '''Kompilieren''' drücken.
+
* In '''Package > Package-Datei (.lpk) öffnen''', dcpcrypt.lpk öffnen und '''Kompilieren''' drücken.
* Um die DCPCrypt-Komponenten in der Lazarus-IDE Komponentenleiste zu haben, muß man noch dcpcrypt_laz.lpk öffnen (s.o.), dann '''Kompilieren''' drücken und dann '''Installieren''' auswählen. Die Lazarus-IDE kompiliert sich nun selbst (mit der gewählten Komponente).
+
* Um die DCPCrypt-Komponenten in der Lazarus-IDE Komponentenleiste zu haben, muß man noch dcpcrypt_laz.lpk öffnen (s.o.), dann '''Kompilieren''' drücken und dann '''Nutzung... > Installieren''' auswählen und ggf. den Dialog bestätigen. Die Lazarus-IDE kompiliert sich nun selbst (mit der gewählten Komponente).
 
* Warten bis der kompilieren-Vorgang beendet ist (i.d.R: beendet sich die IDE selbst), und danach die Lazarus-IDE neu starten. DCPCrypt steht nun bereit.
 
* Warten bis der kompilieren-Vorgang beendet ist (i.d.R: beendet sich die IDE selbst), und danach die Lazarus-IDE neu starten. DCPCrypt steht nun bereit.
  
Line 90: Line 90:
 
Normalerweise wird in DCPcrypt beim verschlüsseln davon ausgegangen, daß der Schlüssel "gehasht" wird wenn er mit ''.InitStr'' übergeben wird.<br>
 
Normalerweise wird in DCPcrypt beim verschlüsseln davon ausgegangen, daß der Schlüssel "gehasht" wird wenn er mit ''.InitStr'' übergeben wird.<br>
 
Man kann allerdings auch einen Klartext-String mit ''[http://is.muni.cz/th/51468/fi_b/priloha/DCPcrypt/Docs/Ciphers.html#Init .Init]'' übergeben, z.B. so:
 
Man kann allerdings auch einen Klartext-String mit ''[http://is.muni.cz/th/51468/fi_b/priloha/DCPcrypt/Docs/Ciphers.html#Init .Init]'' übergeben, z.B. so:
<syntaxhighlight>
+
 
 +
<syntaxhighlight lang=pascal>
 
var s:string;
 
var s:string;
 
begin
 
begin
Line 99: Line 100:
 
Quelle: [http://lazarus.freepascal.org/index.php/topic,18108.msg101683.html#msg101683 Forumsbeitrag].
 
Quelle: [http://lazarus.freepascal.org/index.php/topic,18108.msg101683.html#msg101683 Forumsbeitrag].
  
=== Bugs ===
+
=== Bekannte Fehler ===
If you are using DCPrijndael, be advised that key sizes that are not in the AES standard are known to produce key schedules
+
Bei der Benutzung von [[DCPrijndael]] ist darauf zu achten, daß Schlüssellängen ausserhalb des [[AES]]-standart dafür bekannt sind Schlüssel-Schemata zu erzeugen, so daß der Datenaustausch mit anderen Implementationen von Rijndael '''nicht''' unproblematisch ist.
that are '''not''' inter-operable with other Rijndael implementations. Few implementations provide the non-standard key (or block) sizes. [https://web.archive.org/web/20090201173123/http://fp.gladman.plus.com/cryptography_technology/rijndael/ Brian Gladman] and [https://web.archive.org/web/20110826031605/http://jclement.ca/software/pyrijndael/ Jeffrey Clement] provide implementations (C and Python) that are known to be incompatible with DCPrijndael for non-standard key sizes. Test program provided below with comments showing the expect
+
Nur wenige dieser Implementationen bieten überhaupt die Möglichkeit nicht-standartisierte Schlüssel- oder Blocklängen zu verarbeiten. [https://web.archive.org/web/20090201173123/http://fp.gladman.plus.com/cryptography_technology/rijndael/ Brian Gladman] and [https://web.archive.org/web/20110826031605/http://jclement.ca/software/pyrijndael/ Jeffrey Clement] bieten beispielsweise Implementationen (in C und Python) an, von denen bekannt ist, daß sie bei solchen Schlüssellängen mit [[DCPrijndael]] inkompatible Ergebnisse produzieren.  
results:
+
Das beigefügte, kommentierte Testprogramm (unten) zeigt das zu erwartende Ergebnis:  
  
<syntaxhighlight>program ctst;
+
<syntaxhighlight lang=pascal>
 +
program ctst;
 
{$mode objfpc}{$H+}
 
{$mode objfpc}{$H+}
 
uses
 
uses
Line 155: Line 157:
 
end.</syntaxhighlight>
 
end.</syntaxhighlight>
  
The output that freepascal 2.2.0 produces is:
+
Die Ausgaben die Freepascal 2.2.0 erzeugt sind:
  
 
   128-bit block & 160-bit key results:
 
   128-bit block & 160-bit key results:
Line 164: Line 166:
 
   TRUE
 
   TRUE
  
What this meas is that using 160-bit keys you can only decrypt the output with DCPrijndael, but it won't work with other implementations. On the other hand, 256-bit keys are interoperable. The 160-bit case is important because SHA-1 outputs 160-bit hashes, which makes it a convenient way to generate a key from a password, so it's used by some (hardware) systems.
+
Das bedeutet, daß bei der Benutzung von 160-bit Schlüsseln die Chiffre nur mit [[DCPrijndael]] wieder entschlüsselt werden kann, jedoch nicht mit anderen Implementationen. Andererseits funktioniert dies mit 256-bittigen Schlüsseln. Der 160-bit-Fall ist deswegen so wichtig, da SHA-1 eine genau 160-bit-Prüfsumme liefert, was die Benutzung dieser Schlüssellänge zum haschen eines Paßworts vorzüglich einfach macht, und somit auch von einigen (Hardware-)Systemen genutzt wird.
 +
 
 +
=== Externe Verweise ===
 +
 
 +
* [http://keit.co/p/dcpcrypt-hmac-rfc2104/ HMAC/PBKDF1/PBKDF2] Implementationen basierend auf DCPcrypt.
  
=== External links ===
+
=== Siehe auch... ===  
  
* [http://keit.co/p/dcpcrypt-hmac-rfc2104/ HMAC/PBKDF1/PBKDF2] implementation based on DCPcrypt.
+
* [https://de.wikipedia.org/wiki/Angewandte_Kryptographie Bruce Schneier: Angewandte Kryptographie ISBN:3-8273-7228-3 (Wikipedia-Eintrag)]

Revision as of 07:13, 12 February 2020

Deutsch (de) English (en) español (es) suomi (fi) français (fr)

Allgemeines

  • DCPcrypt ist eine Sammlung cryptographischer Komponenten für Lazarus.
  • Die Idee hinter DCPcrypt ist, daß es möglich sein muß, per "drop in" jegliche Algorithmen und deren Implementierung einfach gegeneinander auszutauschen, nur mit minimalen Codeänderungen.

Diese Ziel vor Augen sind alle kryptographischen Komponenten von einer, aus einer Reihe von mehreren, Basisklassen abgeleitet, TDCP_cipher für Verschlüsselungsalgorithmen und TDCP_hash für Hash-algorithmen.

  • Seit der v2.0.4-Release, unterstützt DCPcrypt auch 64-Bit-Systeme.


Status: Production/Stable
Letzte Version: v2.0.4.1

Screenshot

  • Dcp1.png
  • Dcp2.png

Autor

Beitragende

Lizenz (eng.)

The MIT License

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

Download

Die letzte 'stable release' kann auf Lazarus-CCR Files heruntergeladen werden.

Abhängigkeiten / Systemerfordernisse

Seit v2.0.4 lässt es sich mit FPC 2.4.1 (und höher) kompilieren und ist unter 32-bit & 64-bit Linux und 32-bit Windows getestet.

Quelltext

Seit März 2010, wird der DCPCrypt-Quellcode als Teil des Lazarus-CCR Projekt auf SourceForge.net gehostet.

DCPCrypt steht in einem Git-Repository bereit. Um den letzten Stand des Quelltexts aus dem Archiv zu die folgenden Befehle in der Kommandozeile ausführen. Für weitergehende Informationen über Git siehe auch Git Mirrors.

 git clone git://lazarus-ccr.git.sourceforge.net/gitroot/lazarus-ccr/dcpcrypt
 git clone http://git.code.sf.net/p/lazarus-ccr/dcpcrypt lazarus-ccr-dcpcrypt


Dannach führt man weitere Updates durch mit:

 git pull

Installation

Seit dem v2.0.4-Release ist DCPCrypt in zwei Pakete aufgeteilt:

dcpcrypt.lpk
Dies ist ein Nur-Laufzeit-Paket und nur den GUI-unbelasteten Kern-Code. Man kann diese Packet für Konsolen-Programme und andere nicht-LCL Projekte (z.B: für fpGUI oder MSEgui basierende Projekte).
dcpcrypt_laz.lpk
Dies ist das Design-Packet das die diversen Komponenten in der Lazarus IDE registriert und in der entsprechenden Palette zur Verfügung stellt.

Um DCPCrypt mit der Lazarus IDE zum ersten zu Mal benutzen:

  • In Package > Package-Datei (.lpk) öffnen, dcpcrypt.lpk öffnen und Kompilieren drücken.
  • Um die DCPCrypt-Komponenten in der Lazarus-IDE Komponentenleiste zu haben, muß man noch dcpcrypt_laz.lpk öffnen (s.o.), dann Kompilieren drücken und dann Nutzung... > Installieren auswählen und ggf. den Dialog bestätigen. Die Lazarus-IDE kompiliert sich nun selbst (mit der gewählten Komponente).
  • Warten bis der kompilieren-Vorgang beendet ist (i.d.R: beendet sich die IDE selbst), und danach die Lazarus-IDE neu starten. DCPCrypt steht nun bereit.

Nutzung

Es ist zu beachten daß ein grundsätzliches Verständniss der Prinzipien hinter der Ver-/Entschlüsselung und Schlüssel-Verwaltung die Voraussetzung für die Benutzung der in diesem Paket implementierten Chiffren ist.
Eine gute Einführung zu diesem Thema bietet "Angewandte Kryptographie" <rev>Bruce Schneier ,ISBN:3-8273-7228-3</rev>, siehe auch die NIST-Puplikation SP800-38A mit Information über die Verkettungsarten von Block-Chiffren.

  • Chiffren - Der Grundbaustein von DCPcrypt ist die TDCP_cipher-Komponente.
  • Blockchiffren - Die Basis aller blockchiffren ist die TDCP_blockcipher-Komponente.
  • Hashs - Die Grundlage aller hash(Prüfsummen)-Algorithmen ist die TDCP_hash-Komponente.

Siehe auch die beigefügte Dokumentation.

Verschlüsselung mit Klar(-text)schlüsseln

Normalerweise wird in DCPcrypt beim verschlüsseln davon ausgegangen, daß der Schlüssel "gehasht" wird wenn er mit .InitStr übergeben wird.
Man kann allerdings auch einen Klartext-String mit .Init übergeben, z.B. so:

var s:string;
begin
  s:='1234567890ABCDEF1234567890ABCDEF';
  DCP_3des1.Init(s[1],length(s)*8,nil);

Quelle: Forumsbeitrag.

Bekannte Fehler

Bei der Benutzung von DCPrijndael ist darauf zu achten, daß Schlüssellängen ausserhalb des AES-standart dafür bekannt sind Schlüssel-Schemata zu erzeugen, so daß der Datenaustausch mit anderen Implementationen von Rijndael nicht unproblematisch ist. Nur wenige dieser Implementationen bieten überhaupt die Möglichkeit nicht-standartisierte Schlüssel- oder Blocklängen zu verarbeiten. Brian Gladman and Jeffrey Clement bieten beispielsweise Implementationen (in C und Python) an, von denen bekannt ist, daß sie bei solchen Schlüssellängen mit DCPrijndael inkompatible Ergebnisse produzieren. Das beigefügte, kommentierte Testprogramm (unten) zeigt das zu erwartende Ergebnis:

program ctst;
{$mode objfpc}{$H+}
uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Sysutils, DCPrijndael;
const
  InData: array[0..15] of byte =
    ($32,$43,$f6,$a8,$88,$5a,$30,$8d,$31,$31,$98,$a2,$e0,$37,$07,$34);
  Key1: array[0..19] of byte =
    ($2b,$7e,$15,$16,$28,$ae,$d2,$a6,$ab,$f7,$15,$88,$09,$cf,$4f,$3c,$76,$2e,$71,$60);
  Key2: array[0..31] of byte =
    ($2b,$7e,$15,$16,$28,$ae,$d2,$a6,$ab,$f7,$15,$88,$09,$cf,$4f,$3c,$76,$2e,$71,$60,
     $f3,$8b,$4d,$a5,$6a,$78,$4d,$90,$45,$19,$0c,$fe);
  OutData1: array[0..15] of byte =
    ($23,$1d,$84,$46,$39,$b3,$1b,$41,$22,$11,$cf,$e9,$37,$12,$b8,$80);
  OutData2: array[0..15] of byte =
    ($1a,$6e,$6c,$2c,$66,$2e,$7d,$a6,$50,$1f,$fb,$62,$bc,$9e,$93,$f3);
var
  Cipher: TDCP_rijndael;
  Block: array[0..15] of byte;
begin
// lengths:  block = 16 bytes, key = 20 bytes
// key     = 2b7e151628aed2a6abf7158809cf4f3c762e7160
// input   = 3243f6a8885a308d313198a2e0370734
// encrypt = 231d844639b31b412211cfe93712b880
// decrypt = 3243f6a8885a308d313198a2e0370734
  Cipher := TDCP_rijndael.Create(nil);
  Cipher.Init(Key1, Sizeof(Key1) * 8, nil);
  Cipher.EncryptECB(InData, Block);
  writeln('128-bit block & 160-bit key results:');
  writeln(boolean(CompareMem(@Block, @OutData1, 16)));
  Cipher.DecryptECB(Block, Block);
  writeln(boolean(CompareMem(@Block, @InData, 16)));
  Cipher.Free;
// lengths:  block = 16 bytes, key = 32 bytes
// key     = 2b7e151628aed2a6abf7158809cf4f3c762e7160f38b4da56a784d9045190cfe
// input   = 3243f6a8885a308d313198a2e0370734
// encrypt = 1a6e6c2c662e7da6501ffb62bc9e93f3
// decrypt = 3243f6a8885a308d313198a2e0370734
  Cipher := TDCP_rijndael.Create(nil);
  Cipher.Init(Key2, Sizeof(Key2) * 8, nil);
  Cipher.EncryptECB(InData, Block);
  writeln('128-bit block & 256-bit key results:');
  writeln(boolean(CompareMem(@Block, @OutData2, 16)));
  Cipher.DecryptECB(Block, Block);
  writeln(boolean(CompareMem(@Block, @InData, 16)));
  Cipher.Free;
end.

Die Ausgaben die Freepascal 2.2.0 erzeugt sind:

 128-bit block & 160-bit key results:
 FALSE
 TRUE
 128-bit block & 256-bit key results:
 TRUE
 TRUE

Das bedeutet, daß bei der Benutzung von 160-bit Schlüsseln die Chiffre nur mit DCPrijndael wieder entschlüsselt werden kann, jedoch nicht mit anderen Implementationen. Andererseits funktioniert dies mit 256-bittigen Schlüsseln. Der 160-bit-Fall ist deswegen so wichtig, da SHA-1 eine genau 160-bit-Prüfsumme liefert, was die Benutzung dieser Schlüssellänge zum haschen eines Paßworts vorzüglich einfach macht, und somit auch von einigen (Hardware-)Systemen genutzt wird.

Externe Verweise

Siehe auch...