Autor |
Beitrag |
s-w
Hält's aus hier
Beiträge: 2
|
Verfasst: Do 07.08.08 09:53
Hallo zusammen,
ich habe gerade das Problem das ich Strings in Delphi verschlüsseln und in C# entschlüsseln muss und anders rum.
In Delphi verwende ich DECCipher (kann ich auch nicht ändern, muss benutzt werden)
Wenn ich nun etwas ver- und entschlüssel funktioniert das Einwandfrei!
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:
| ... const ACipherClass: TDECCipherClass = TCipher_Rijndael; ACipherMode: TCipherMode = cmCFBx; ...
procedure Encrypt(ASource, ADest: TStream; const APassword: String; const AProgress: IDECProgress = nil); overload; var Salt: Binary; begin Assert(ASource <> ADest, 'Encrypt(), ASource must be distinct to ADest');
with ValidCipher(ACipherClass).Create do try Salt := '1234567890123456'; Mode := ACipherMode; Init(APassword);
EncodeStream(ASource, ADest, -1, AProgress); finally Free; ProtectBinary(Salt); end; end;
procedure Decrypt(ASource, ADest: TStream; const APassword: String; const AProgress: IDECProgress = nil); overload; var Salt: Binary; begin Assert(ASource <> ADest, 'Encrypt(), ASource must be distinct to ADest');
with ValidCipher(ACipherClass).Create do try Salt := '1234567890123456'; Mode := ACipherMode; Init(APassword); DecodeStream(ASource, ADest, -1, AProgress); finally Free; ProtectBinary(Salt); end; end; |
Wenn ich nun versuche eine verschlüsselte Datei oder String, den ich in C# erstellt habe, in Delphi zu lesen, funktioniert es nicht.
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:
| public static string DecryptTextFromFile(String FileName, byte[] Key, byte[] IV) { FileStream fStream = File.Open(FileName, FileMode.OpenOrCreate);
Rijndael RijndaelAlg = Rijndael.Create(); RijndaelAlg.Mode = CipherMode.CFB; RijndaelAlg.Key = Key;
CryptoStream cStream = new CryptoStream(fStream, RijndaelAlg.CreateDecryptor(Key, IV), CryptoStreamMode.Read);
StreamReader sReader = new StreamReader(cStream);
string val = null;
try { val = sReader.ReadLine(); } catch (Exception e) { MessageBox.Show("Fehler."); } finally { sReader.Close(); cStream.Close(); fStream.Close(); } return val; }
public static void EncryptTextToFile(String Data, String FileName, byte[] Key, byte[] IV) { try { FileStream fStream = File.Open(FileName, FileMode.OpenOrCreate);
Rijndael myRijndael = Rijndael.Create(); myRijndael.Mode = CipherMode.CFB; myRijndael.Key = Key; CryptoStream cStream = new CryptoStream(fStream, myRijndael.CreateEncryptor(Key, IV), CryptoStreamMode.Write); StreamWriter sWriter = new StreamWriter(cStream);
try { sWriter.WriteLine(Data); } catch (Exception e) { MessageBox.Show("Fehler"); } finally { sWriter.Close(); cStream.Close(); fStream.Close(); } } |
Habe die verschiedenen Cipher-Modes ausprobiert. Mal mit mehr, mal mit weniger Erfolg. Kann das mit der Länge des zu ver-/entschlüsseldem Text zusammen hängen? Geht C# Damit anders um als Delphi?
Gruß
s-w
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 07.08.08 09:56
Wende dich mal direkt an Hagen in der Delphipraxis, der wird dir da weiterhelfen können. So einen ähnlichen Fall mit Delphi und PHP hatten wir dort schon mal.
|
|
Sirke
      
Beiträge: 208
Erhaltene Danke: 2
|
Verfasst: Do 07.08.08 12:30
Die verschiedenen Modi können Probleme machen, wenn unterschiedliche Initialisierungsvektoren verwendet werden. Bei C# gibst du den in IV ja an. In Delphi hingegen kann ich diesen nicht finden, sodass dort eventuell ein Standard von 0x00 verwendet wird.
Verwende einfach den ECB Mode, der hat keine IVs und sollte somit auch keine Probleme machen, da der Algorithmus ja immer gleich ist! Danach kann man mit den verschiedenen Modi rumspielen 
|
|
s-w 
Hält's aus hier
Beiträge: 2
|
Verfasst: Do 07.08.08 14:24
Wenn ich in Delphi den ECB benutze bekomme ich die Meldung "Messagelength for cmECBx must be a multiple of 16 bytes", was mir natürlich sagt das die länge nicht korrekt ist. Muss ich die Länge des zu verschlüsselnden Textex mit einem Befehl (padding oder sowas) irgendwie auffüllen?
Wenn ich den IV in Delphi benutze fkt. es auch nicht.
Dann sieht das ganze so aus
Delphi-Quelltext 1:
| Init(APassword, Length(APassword), Salt, Length(Salt)); |
Die folgende Procedure aufruft
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| procedure TDECCipher.Init(const Key; Size: Integer; const IVector; IVectorSize: Integer; IFiller: Byte); begin Protect;
if Size > Context.KeySize then raise EDECException.Create(sKeyMaterialToLarge); if IVectorSize > FBufferSize then raise EDECException.Create(sIVMaterialToLarge);
DoInit(Key, Size); if FUserSave <> nil then Move(FUser^, FUserSave^, FUserSize);
FillChar(FVector^, FBufferSize, IFiller); if IVectorSize = 0 then begin DoEncode(FVector, FVector, FBufferSize); if FUserSave <> nil then Move(FUserSave^, FUser^, FUserSize); end else Move(IVector, FVector^, IVectorSize); Move(FVector^, FFeedback^, FBufferSize); FState := csInitialized; end; |
Muss ich hier iwas für IFiller angeben?
Danke Gruß
|
|
Sirke
      
Beiträge: 208
Erhaltene Danke: 2
|
Verfasst: Do 07.08.08 15:03
IFiller könnte ich mir vorstellen ist das Padding-Byte!
Ich würde das ganze an ein paar Testvektoren z.B. 0x00 oder 0xFF im ECB testen. Sollte das Probleme machen, dann immer mit einem 0x00 IV und einem 0x00 Key.
Zur Kontrolle der Verschlüsselung kann ich CrypTool nur empfehlen!!
|
|
|