Autor Beitrag
daywalker0086
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 243


Delphi 2005 Architect
BeitragVerfasst: Mi 27.03.13 10:17 
Hallo Leute, ich muss mal wieder ein kleines Programm schreiben bei dem Daten aus ein paar Edit Feldern in eine Textdatei geschrieben werden.
Soweit so gut, das mache ich einfachst mit:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
function tform1.Datei_speichern():integer;
var
Datei: Textfile;
begin
AssignFile(Datei,'Kunden.txt');

        if IOResult = 0 then
        begin
        Append(Datei);
        writeln(Datei,Name_edit.Text+#9+Email_Edit.Text+#9+Tel_Edit.Text+#9+FloatToStr(PA)+#9+Jsv_Edit.Text+#9+Dn_edit.Text+#9+IntToStr(Richtungswert)+#9+Adresse_Memo.Text);

        CloseFile(Datei);
        end;


end;


Jetzt soll die Datei aber verschlüsselt gespeichert werden.
Da bin ich ziemlich schnell auf die Libraries von Hagen Reddmann gestoßen.

Nur hab ich keine Ahnung wie ich das einbinden kann. Hab hier schon gesucht und auch viele Beiträge gefunden, nur bin ich daraus nicht schlau geworden weil es miestns andere Problemstellungen waren und die Leute meist schonmal wussten wie sie da ran zu gehen hatten.
Die Demo der Library funktioniert bei mir nicht, er vermisst da die Datei DECTTest.test.
Kann mir jemand sagen wie ich die Library bei der Speciherung der Daten anwenden kann?

Grüße Christian
Jens01
Hält's aus hier
Beiträge: 9
Erhaltene Danke: 3



BeitragVerfasst: Mi 27.03.13 12:30 
Hast Du Dir die "Example.pas" angeguckt?
Quitzlinga
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 60
Erhaltene Danke: 2

Win XP
Delphi 2007 Prof. Codegear Win32
BeitragVerfasst: Mi 27.03.13 12:48 
Hallo,

1. Entpacke erst einmal das DEC in ein Verzeichnis (Bspw. C:\DEC).
Es sollten dann folgende Dateien in diesem Verzeichnis sein:

- ASN1.pas
- CPU.pas
- CRC.pas
- DECCipher.pas
- DECData.pas
- DECFmt.pas
- DECHash.pas
- DECHash.inc
- DECRandom.pas
- DECUtils.pas
- TypInfoEx.pas
- Ver.inc

2. Nehme in Deinem Projekt das Verzeichnis in den Suchpfad auf bzw. setze es in den Optionen global.

3. Nimm in die Uses-Klausel der entsprechenden Unit folgende Unitverweise mit auf.

- DECCipher, DECUtil, DECRandom, DECHash, DECFmt
(Bsp.: Uses SysUtils, DECCipher, DECUtil, DECRandom, DECHash, DECFmt)

4. Zum Verschlüsseln, Entschlüsseln und Registrieren kannst Du folgende Fuktionen benutzen (Aus den Examples zum DEC):

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:
217:
218:
219:
220:
221:
222:
223:
224:
225:
226:
227:
228:
229:
230:
231:
232:
233:
234:
235:
236:
237:
238:
239:
240:
241:
procedure DLL_TceCrypto.InitDecVars(aSymCypher, aChainIds : integer; var ACipherClass : TDECCipherClass;
                          var ACipherMode : TCipherMode; var AHashClass : TDECHashClass;
                          var ATextFormat: TDECFormatClass; var AKDFIndex : LongWord);
begin
  AHashClass := THash_Whirlpool;
  ATextFormat := TFormat_Mime64;
  AKDFIndex := 1;

  case aSymCypher of
    0 : ACipherClass := TCipher_Blowfish;
    1 : ACipherClass := TCipher_Twofish;
    2 : ACipherClass := TCipher_IDEA;
    3 : ACipherClass := TCipher_Cast256;
    4 : ACipherClass := TCipher_Mars;
    5 : ACipherClass := TCipher_RC4;
    6 : ACipherClass := TCipher_RC6;
    7 : ACipherClass := TCipher_Rijndael;
    8 : ACipherClass := TCipher_Square;
    9 : ACipherClass := TCipher_SCOP;
    10 : ACipherClass := TCipher_Sapphire;
    11 : ACipherClass := TCipher_1DES;
    12 : ACipherClass := TCipher_2DES;
    13 : ACipherClass := TCipher_3DES;
    14 : ACipherClass := TCipher_2DDES;
    15 : ACipherClass := TCipher_3DDES;
    16 : ACipherClass := TCipher_3TDES;
    17 : ACipherClass := TCipher_3Way;
    18 : ACipherClass := TCipher_Cast128;
    19 : ACipherClass := TCipher_Gost;
    20 : ACipherClass := TCipher_Misty;
    21 : ACipherClass := TCipher_NewDES;
    22 : ACipherClass := TCipher_Q128;
    23 : ACipherClass := TCipher_RC2;
    24 : ACipherClass := TCipher_RC5;
    25 : ACipherClass := TCipher_SAFER;
    26 : ACipherClass := TCipher_Shark;
    27 : ACipherClass := TCipher_Skipjack;
    28 : ACipherClass := TCipher_TEA;
    29 : ACipherClass := TCipher_TEAN;
    else aCipherClass := TCipher_Rijndael;
  end;

  case aChainIds of
    0 : ACipherMode := TCipherMode.cmCTSx; // Cypher Double CBC
    1 : ACipherMode := TCipherMode.cmCBCx; // Cypher Block Chaining
    2 : ACipherMode := TCipherMode.cmCFB8; // Cypher Feedback 8 Bit
    3 : ACipherMode := TCipherMode.cmCFBx; // Cypher Feedback Blocksize
    4 : ACipherMode := TCipherMode.cmOFB8; // Cypher Output Feedback 8 Bit
    5 : ACipherMode := TCipherMode.cmOFBx; // Cypher Output Feedback Blocksize
    6 : ACipherMode := TCipherMode.cmCFS8; // 8Bit CFS, double CFB
    7 : ACipherMode := TCipherMode.cmCFSx; // CFS on Blocksize bytes
    8 : ACipherMode := TCipherMode.cmECBx; // Electronic Codebook
    else ACipherMode := cmCBCx;
  end;

end;

function DLL_TceCrypto.DECEncrypt(const aText: Stringconst aPassword: Stringconst aSymCypher : integer = 0const aChainIds : integer = 0): String;
var
  ASalt: Binary;
  AData: Binary;
  APass: Binary;
  ACipherClass: TDECCipherClass; //= TCipher_Rijndael;
  ACipherMode: TCipherMode; //= cmCBCx;
  AHashClass: TDECHashClass; //= THash_Whirlpool;
  ATextFormat: TDECFormatClass; //= TFormat_Mime64;
  AKDFIndex: LongWord; //= 1;
begin
  InitDecVars(aSymCypher, aChainIds, ACipherClass, ACipherMode, AHashClass, ATextFormat, AKDFIndex);
  with ValidCipher(ACipherClass).Create, Context do
  try
    ASalt := RandomBinary(16);
    APass := ValidHash(aHashClass).KDFx(APassword[1], Length(APassword) * SizeOf(APassword[1]), ASalt[1], Length(ASalt), KeySize, TFormat_Copy, AKDFIndex);
    Mode := ACipherMode;
    Init(APass);
    SetLength(AData, Length(AText) * SizeOf(AText[1]));
    Encode(AText[1], AData[1], Length(AData));
    Result := ValidFormat(aTextFormat).Encode(aSalt + aData + CalcMAC);
  finally
    Free;
    ProtectBinary(ASalt);
    ProtectBinary(AData);
    ProtectBinary(APass);
  end;
end;

function DLL_TceCrypto.DECEncrypt(const AText: WideString; const APassword: WideString; const aSymCypher : integer = 0const aChainIds : integer = 0): WideString;
var
  ASalt: Binary;
  AData: Binary;
  APass: Binary;
  ACipherClass: TDECCipherClass; // = TCipher_Rijndael;
  ACipherMode: TCipherMode; // = cmCBCx;
  AHashClass: TDECHashClass; // = THash_Whirlpool;
  ATextFormat: TDECFormatClass; // = TFormat_Mime64;
  AKDFIndex: LongWord; // = 1;
begin
  InitDecVars(aSymCypher, aChainIds, ACipherClass, ACipherMode, AHashClass, ATextFormat, AKDFIndex);
  with ValidCipher(ACipherClass).Create, Context do
  try
    ASalt := RandomBinary(16);
    APass := ValidHash(AHashClass).KDFx(APassword[1], Length(APassword) * SizeOf(APassword[1]), ASalt[1], Length(ASalt), KeySize, TFormat_Copy, AKDFIndex);
    Mode := ACipherMode;
    Init(APass);
    SetLength(AData, Length(AText) * SizeOf(AText[1]));
    Encode(AText[1], AData[1], Length(AData));
    Result := ValidFormat(ATextFormat).Encode(ASalt + AData + CalcMAC);
  finally
    Free;
    ProtectBinary(ASalt);
    ProtectBinary(AData);
    ProtectBinary(APass);
  end;
end;

function DLL_TceCrypto.DECDecrypt(const aText: Stringconst aPassword: Stringconst aSymCypher : integer = 0const aChainIds : integer = 0): String;
var
  ASalt: Binary;
  AData: Binary;
  ACheck: Binary;
  APass: Binary;
  ALen: Integer;
  ACipherClass: TDECCipherClass; // = TCipher_Rijndael;
  ACipherMode: TCipherMode; // = cmCBCx;
  AHashClass: TDECHashClass; // = THash_Whirlpool;
  ATextFormat: TDECFormatClass; // = TFormat_Mime64;
  AKDFIndex: LongWord; // = 1;
begin
  InitDecVars(aSymCypher, aChainIds, ACipherClass, ACipherMode, AHashClass, ATextFormat, AKDFIndex);
  with ValidCipher(ACipherClass).Create, Context do
  try
    ASalt := ValidFormat(ATextFormat).Decode(AText);
    ALen := Length(ASalt) - 16 - BufferSize;
    AData := System.Copy(ASalt, 17, ALen);
    ACheck := System.Copy(ASalt, ALen + 17, BufferSize);
    SetLength(ASalt, 16);
    APass := ValidHash(AHashClass).KDFx(APassword[1], Length(APassword) * SizeOf(APassword[1]), ASalt[1], Length(ASalt), KeySize, TFormat_Copy, AKDFIndex);
    Mode := ACipherMode;
    Init(APass);
    SetLength(Result, ALen div SizeOf(AText[1]));
    Decode(AData[1], Result[1], ALen);
    if ACheck <> CalcMAC then
      raise Exception.Create('Invalid data');
  finally
    Free;
    ProtectBinary(ASalt);
    ProtectBinary(AData);
    ProtectBinary(ACheck);
    ProtectBinary(APass);
  end;
end;

function DLL_TceCrypto.DECDecrypt(const AText: WideString; const APassword: WideString; const aSymCypher : integer = 0const aChainIds : integer = 0): WideString;
var
  ASalt: Binary;
  AData: Binary;
  ACheck: Binary;
  APass: Binary;
  ALen: Integer;
  ACipherClass: TDECCipherClass; // = TCipher_Rijndael;
  ACipherMode: TCipherMode; // = cmCBCx;
  AHashClass: TDECHashClass; // = THash_Whirlpool;
  ATextFormat: TDECFormatClass; // = TFormat_Mime64;
  AKDFIndex: LongWord; // = 1;
begin
  InitDecVars(aSymCypher, aChainIds, ACipherClass, ACipherMode, AHashClass, ATextFormat, AKDFIndex);
  with ValidCipher(ACipherClass).Create, Context do
  try
    ASalt := ValidFormat(ATextFormat).Decode(AText);
    ALen := Length(ASalt) - 16 - BufferSize;
    AData := System.Copy(ASalt, 17, ALen);
    ACheck := System.Copy(ASalt, ALen + 17, BufferSize);
    SetLength(ASalt, 16);
    APass := ValidHash(AHashClass).KDFx(APassword[1], Length(APassword) * SizeOf(APassword[1]), ASalt[1], Length(ASalt), KeySize, TFormat_Copy, AKDFIndex);
    Mode := ACipherMode;
    Init(APass);
    SetLength(Result, ALen div SizeOf(AText[1]));
    Decode(AData[1], Result[1], ALen);
    if ACheck <> CalcMAC then
      raise Exception.Create('Invalid data');
  finally
    Free;
    ProtectBinary(ASalt);
    ProtectBinary(AData);
    ProtectBinary(ACheck);
    ProtectBinary(APass);
  end;
end;

function DLL_TceCrypto.DECRegister() : boolean;
begin
  try
    //IdentityBase := $84282255;

    TFormat_Copy.register;
    TFormat_HEX.register;
    TFormat_MIME64.register;
    TFormat_MIME32.register;

    THash_SHA512.register;
    THash_Whirlpool.register;

    TCipher_Blowfish.register;
    TCipher_Twofish.register;
    TCipher_IDEA.Register;
    TCipher_Cast256.Register;
    TCipher_Mars.Register;
    TCipher_RC4.Register;
    TCipher_RC6.Register;
    TCipher_Rijndael.Register;
    TCipher_Square.Register;
    TCipher_SCOP.Register;
    TCipher_Sapphire.Register;
    TCipher_1DES.Register;
    TCipher_2DES.Register;
    TCipher_3DES.Register;
    TCipher_2DDES.Register;
    TCipher_3DDES.Register;
    TCipher_3TDES.Register;
    TCipher_3Way.Register;
    TCipher_Cast128.Register;
    TCipher_Gost.Register;
    TCipher_Misty.Register;
    TCipher_NewDES.Register;
    TCipher_Q128.Register;
    TCipher_RC2.Register;
    TCipher_RC5.Register;
    TCipher_SAFER.Register;
    TCipher_Shark.Register;
    TCipher_Skipjack.Register;
    TCipher_TEA.Register;
    TCipher_TEAN.Register;

    SetDefaultCipherClass(TCipher_Rijndael);
    SetDefaultHashClass(THash_SHA512);

    result := true;
  except
    on exception do result := false;
  end;
end;


Das Registrieren muss einmalig erfolgen (Bspw. im OnCreate Ereignis) und es müssen auch nicht alle Cipher- und Hash-Funktionen registriert werden (Nur halt die, die genutzt werden sollen).

Kleiner Tip: Packe das ganze am besten in eine DLL und rufe dies dann auf. Ansonsten schau Dir auch mal Turbo Power Lockbox an.

MfG

Quitzlinga
daywalker0086 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 243


Delphi 2005 Architect
BeitragVerfasst: Mi 27.03.13 13:59 
Also hab die Units eingebunden.
Ich hatte in einem anderen Beitrag folgenden Code gefunden mit dem ich testen kann ob überhaupt etwas funktioniert:
ausblenden Delphi-Quelltext
1:
ShowMessage( THash_SHA1.CalcFile(ParamStr(0), nil, fmtMIME64) );					


Da erhalte ich aber einen undefinierten Bezeichner für fmtMime64.

Im on FormShowereignis habe ich mal TFormat_MIME64.register;
eingesetzt, dacht das hat damit zu tun.

Naja kurz und knapp wie kann ich jetzt weiter vor gehen?
Quitzlinga
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 60
Erhaltene Danke: 2

Win XP
Delphi 2007 Prof. Codegear Win32
BeitragVerfasst: Mi 27.03.13 18:51 
Hi,

der Aufruf dürfte so nicht funktionieren. Versuchs mal mit

ausblenden Delphi-Quelltext
1:
ShowMessage( THash_SHA1.CalcFile(ParamStr(0), TFormat_MIME64, NIL) );					


MfG

Quitzlinga
daywalker0086 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 243


Delphi 2005 Architect
BeitragVerfasst: Do 28.03.13 10:46 
Ok das hat funktioniert, er zeigt einen kryptischen String.
Kann mir einer die Routine nenn mit der ich einen String verschlüsseln kann?
Ich würde ihn dann erst verschlüsseln und dann die Ausgabe in eine Textdatei speichern.
Quitzlinga
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 60
Erhaltene Danke: 2

Win XP
Delphi 2007 Prof. Codegear Win32
BeitragVerfasst: Do 28.03.13 11:02 
Hi,

Zitat:
Ok das hat funktioniert, er zeigt einen kryptischen String.


Das ist so nicht richtig. Er zeigt den Hashcode Deiner Anwendung (SHA1). Mit kodieren hat das, erst einmal, nicht viel zu tun.

Die Routinen zum kodieren (= Encryption) und dekodieren (= Decryption) habe ich Dir oben schon gepostet. Ein ensprechendes Beispiel ist aber auch in den mitgelieferten Beispielen vorhanden.

MfG

Quitzlinga
daywalker0086 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 243


Delphi 2005 Architect
BeitragVerfasst: Do 28.03.13 11:45 
nur nochmal zum Verständnis:
Die von dir geposteten Routinen muss ich erst in meine Unit kopieren, die liegen nicht schon in einer von den eingebundenen Units?
Weil wenn ich DLL_TceCrypto.DECEncrypt eingebe wirds gleich unterstrichen, er kenn t die Unit also nicht.
Quitzlinga
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 60
Erhaltene Danke: 2

Win XP
Delphi 2007 Prof. Codegear Win32
BeitragVerfasst: Do 28.03.13 13:32 
Hi,

Das ist richtig. Die Routinen musst Du natürlich auf dein Unit anpassen. Diese habe ich aus meiner eigenen Crypto-Dll herauskopiert. DLL_TceCrypto ist ja nur die Klasse, innerhalb derer die Routinen eingesetzt werden. Ist in meinem Fall ein Interface. Wenn es dazu Probleme gibt, dann poste bitte mal Deinen bisherigen Code mit den Problemstellen.

MfG

Quitzlinga