AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Rijndael DEC 5.2 und Cryptography von Visual Studio

Rijndael DEC 5.2 und Cryptography von Visual Studio

Ein Thema von TheProfi · begonnen am 27. Nov 2014 · letzter Beitrag vom 27. Nov 2014
Antwort Antwort
Benutzerbild von TheProfi
TheProfi

Registriert seit: 30. Mai 2005
Ort: Emden
42 Beiträge
 
Delphi 10.3 Rio
 
#1

Rijndael DEC 5.2 und Cryptography von Visual Studio

  Alt 27. Nov 2014, 11:16
Moin,

wir wollen Loginpasswörter die in einer MSSQL gespeichert sind, ver- und entschlüsseln sowohl in XE6 mit DEC 5.2 und Visual Studio 2013 damit wir das Anmeldefenster bauen können. Nun ist es so, dass wir dabei nicht auf die selben Ergebnisse kommen

Code Visual Studio
Code:
       public static string EncryptString(string stringToEncrypt,string encryptionKey)
        {
            string encrypted = String.Empty;
            byte[] key = Encoding.Unicode.GetBytes(encryptionKey);

            RijndaelManaged RMCrypto = new RijndaelManaged();      
            MemoryStream ms = new MemoryStream();
            CryptoStream cs = new CryptoStream(ms, RMCrypto.CreateEncryptor(key, key), CryptoStreamMode.Write);

            byte[] encryptedString = Encoding.ASCII.GetBytes(stringToEncrypt);
            cs.Write(encryptedString, 0, encryptedString.Length);
            cs.FlushFinalBlock();

            return Convert.ToBase64String(ms.ToArray());
            ms.Close();
            cs.Close();
        }
Key: 12345678 (encryptionKey)
Wert: test (stringToEncrypt)
Ergebnis: 1iJosVDlt3OJZeMtfWhulQ==

Delphi-Quellcode:
   with TCipher_Rijndael.Create do
   begin
     try
       m1.Lines.Add('KEY : '+ wsKey);
       m1.Lines.Add('Text : '+ wsString);

       SetLength(vKEY,16);
       setlength(vIV,16);
       vKey := TEncoding.Unicode.GetBytes(wsKey);
       vIv := TEncoding.Unicode.GetBytes(wsKey);
       Init(vkey, 16, vKey, 16);
       Mode := cmCBCx;
       Data := EncodeBinary(wsString, TFormat_MIME64);
       m1.Lines.Add('Data : '+ Data + ' '+inttostr(length(data)));
     finally
       Free;
     end;
   end;
KEY : 12345678 (wsKey)
Text : test (wsString)
Data : 8jnglg==

Wir haben hier bewusst auf Hash und Salt verzichte um erstmal eine gemeinsame Basis zu finden. Hat jemand dazu eine Idee???
Georg Reimann
------------------------------------------------------
Sicher ist nur eines, dass nichts sicher ist...
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#2

AW: Rijndael DEC 5.2 und Cryptography von Visual Studio

  Alt 27. Nov 2014, 11:28
Ja, kommt so häufig vor, daß sich es sich fast als FAQ eignet:

DEC-Modus cmCBCx ist nicht standard.

Zitat: Cipher Block Chainung, with CFB8 padding of truncated final block
  Mit Zitat antworten Zitat
Benutzerbild von TheProfi
TheProfi

Registriert seit: 30. Mai 2005
Ort: Emden
42 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: Rijndael DEC 5.2 und Cryptography von Visual Studio

  Alt 27. Nov 2014, 11:31
Ja, kommt so häufig vor, daß sich es sich fast als FAQ eignet:

DEC-Modus cmCBCx ist nicht standard.

Zitat: Cipher Block Chainung, with CFB8 padding of truncated final block
OK - was ist denn Standard - wir haben im Forum vieles gefunden, hat uns aber nicht weitergeholfen...
Georg Reimann
------------------------------------------------------
Sicher ist nur eines, dass nichts sicher ist...
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#4

AW: Rijndael DEC 5.2 und Cryptography von Visual Studio

  Alt 27. Nov 2014, 11:42
Ihr müßt erst einmal herausbekommen, was eigentlich auf VS-Seite verwendet wird. Also

1. Schlüsselgröße: 128,192, oder 256 Bit

2. Betriebmodus (ECB, CBC, CTR, CFB ...).

3. IV (Initialisierungsvektoren falls nicht ECB)

4. Bei ECB und CBC müssen die Textlängen ein Vielfaches von 16 Bytes sein, sonst wird Padding verwendet (Welches?). Hier ist der Nicht-Standard von DEC: die ganzen 16-Bytesblocks wird CBC verwendet, für den Rest CFB8.

Möglich Lösungen: Da DEC keinen CTR-Modus kann, könntet ihr zB immer CFB8 verwenden. Oder ein PKCS7-Padding auf VS-Seite, das auf DEC-Seite manuell entfernt wird.

Auf jeden Fall müssen die Punkte 1 und 3 geklärt werden.

Edit: Übrigens ist '12345678' (wahrscheinlich) kein gültiger Schlüssel, sondern der wird (??) via Key-Derivation-Function/Hash aus '12345678' erzeugt.

Geändert von gammatester (27. Nov 2014 um 11:50 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von TheProfi
TheProfi

Registriert seit: 30. Mai 2005
Ort: Emden
42 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: Rijndael DEC 5.2 und Cryptography von Visual Studio

  Alt 27. Nov 2014, 12:10
Ihr müßt erst einmal herausbekommen, was eigentlich auf VS-Seite verwendet wird. Also

1. Schlüsselgröße: 128,192, oder 256 Bit

2. Betriebmodus (ECB, CBC, CTR, CFB ...).

3. IV (Initialisierungsvektoren falls nicht ECB)

4. Bei ECB und CBC müssen die Textlängen ein Vielfaches von 16 Bytes sein, sonst wird Padding verwendet (Welches?). Hier ist der Nicht-Standard von DEC: die ganzen 16-Bytesblocks wird CBC verwendet, für den Rest CFB8.

Möglich Lösungen: Da DEC keinen CTR-Modus kann, könntet ihr zB immer CFB8 verwenden. Oder ein PKCS7-Padding auf VS-Seite, das auf DEC-Seite manuell entfernt wird.

Auf jeden Fall müssen die Punkte 1 und 3 geklärt werden.

Edit: Übrigens ist '12345678' (wahrscheinlich) kein gültiger Schlüssel, sondern der wird (??) via Key-Derivation-Function/Hash aus '12345678' erzeugt.
zu 1. 256 Bit
zu 2. ECB

Code:
        public static string EncryptString(string stringToEncrypt,string encryptionKey)
        {
            string encrypted = String.Empty;
            byte[] key = Encoding.Unicode.GetBytes(encryptionKey);

            RijndaelManaged RMCrypto = new RijndaelManaged();      
            RMCrypto.Mode = CipherMode.ECB;
            RMCrypto.KeySize = 256;
            MemoryStream ms = new MemoryStream();
            CryptoStream cs = new CryptoStream(ms, RMCrypto.CreateEncryptor(key, key), CryptoStreamMode.Write);

            byte[] encryptedString = Encoding.ASCII.GetBytes(stringToEncrypt);
            cs.Write(encryptedString, 0, encryptedString.Length);
            cs.FlushFinalBlock();

            return Convert.ToBase64String(ms.ToArray());
            ms.Close();
            cs.Close();
        }
Nachdem wir es auf cmECBx in Delphi umgestellt haben bekommen wir die Meldung: Message length for cmECBx must be a multiple of 16 bytes
Georg Reimann
------------------------------------------------------
Sicher ist nur eines, dass nichts sicher ist...
  Mit Zitat antworten Zitat
Dawn87

Registriert seit: 15. Feb 2007
Ort: Lüdenscheid
189 Beiträge
 
Delphi XE5 Professional
 
#6

AW: Rijndael DEC 5.2 und Cryptography von Visual Studio

  Alt 27. Nov 2014, 12:14
gelöscht

Geändert von Dawn87 (27. Nov 2014 um 12:17 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von cookie22
cookie22

Registriert seit: 28. Jun 2006
Ort: Düsseldorf
936 Beiträge
 
Delphi XE2 Professional
 
#7

AW: Rijndael DEC 5.2 und Cryptography von Visual Studio

  Alt 27. Nov 2014, 12:32
Nachdem wir es auf cmECBx in Delphi umgestellt haben bekommen wir die Meldung: Message length for cmECBx must be a multiple of 16 bytes
Das hört sich ganz danach an, als wenn du dich da selbst um das Padding kümmern musst. Ganz nebenbei solltet ihr fals es möglich ist, nicht ECB verwenden, denn das ist der unsicherste Modus.
Gruß
Cookie
  Mit Zitat antworten Zitat
Benutzerbild von TheProfi
TheProfi

Registriert seit: 30. Mai 2005
Ort: Emden
42 Beiträge
 
Delphi 10.3 Rio
 
#8

AW: Rijndael DEC 5.2 und Cryptography von Visual Studio

  Alt 27. Nov 2014, 13:54
Reicht es eventuell aus wenn man Passwort einfach nur als HASH speichert?
Dies läst sich mit VS und Delphi einfach umsetzen.

Delphi-Quellcode:
   wsString := 'test';
   wsKey := '123456';
   try
     Hash := THash_SHA256.Create; //var Hash : TDECHash;
     vKey := TEncoding.Unicode.GetBytes(wsKey);
     m1.Lines.Add('Hash : ' + Hash.CalcBinary(wsstring+wskey, TFormat_MIME64));
   finally
     Hash.Free;
   end;
Code:
       public static string GenerateHashWithSalt(string password,string key)
        {
            string sHashWithSalt = password + key;
            byte[] saltedHashBytes = Encoding.UTF8.GetBytes(sHashWithSalt);
            System.Security.Cryptography.HashAlgorithm algorithm = new System.Security.Cryptography.SHA256Managed();
            byte[] hash = algorithm.ComputeHash(saltedHashBytes);
            return Convert.ToBase64String(hash);
        }
Georg Reimann
------------------------------------------------------
Sicher ist nur eines, dass nichts sicher ist...
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:12 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz