VC++ 2008 - Config-Files



  • Hallo,
    ich habe die Express-Version von VC++ 2008 und versuche Konfigurationsdateien zu erstellen.
    Habe früher unter VB.Net INI-Dateien mit verschlüsselten Einträgen erstellt, hat eigentlich ganz gut funktioniert.
    Das Auslesen der verschlüsselten Einträge funktionieren allerdings unter VC++ nicht mehr.
    Welche ist denn die bevorzugte Vorgehensweise, Konfigurationsdateien zu erstellen, die Einträge enthalten, die nicht für jedermann ersichtlich sein sollten?
    Gruß tompkins



  • tompkins schrieb:

    Habe früher unter VB.Net INI-Dateien mit verschlüsselten Einträgen erstellt, hat eigentlich ganz gut funktioniert.

    womit hast Du verschlüsselt ?

    Welche ist denn die bevorzugte Vorgehensweise, Konfigurationsdateien zu erstellen, die Einträge enthalten, die nicht für jedermann ersichtlich sein sollten?

    verschlüsseln ?!

    hand, mogel



  • Verschlüsselt habe ich mit Rijndael, habe nur unter vc++ das Problem die verschlüsselten Einträge aus der INI wieder auszulesen. Ist in der verschlüsselten Zeichenfolge ein Zeichen, das als String-Ende interpretiert wird wird die Zeichenfolge abgeschnitten.



  • Vielleicht verschlüssele ich einfach falsch

    #using <System.dll>
    
    using namespace System;
    using namespace System::IO;
    using namespace System::Security::Cryptography;
    
    class RijndaelDeEncrypt
    {
    public:
    
    static String ^ encryptStringToBytes_AES(String^ plainText)
        {
         	String ^sKey = "xxx";
    
            MemoryStream ^   msEncrypt;
            CryptoStream ^   csEncrypt;
            StreamWriter ^   swEncrypt;
    
            RijndaelManaged ^ aesAlg;
    
    		array<Byte>^ byteArray = Encoding::ASCII->GetBytes(sKey);
    		MD5CryptoServiceProvider^ md5provider = gcnew MD5CryptoServiceProvider();
    		array<Byte>^ byteArrayHash = md5provider->ComputeHash(byteArray);
    
            try
            {
                aesAlg = gcnew RijndaelManaged();
                aesAlg->Padding = PaddingMode::PKCS7;
                aesAlg->Key = byteArrayHash;
                aesAlg->GenerateIV();
    
                ICryptoTransform ^ encryptor = aesAlg->CreateEncryptor(aesAlg->Key, aesAlg->IV);
    
                msEncrypt = gcnew MemoryStream();
                csEncrypt = gcnew CryptoStream(msEncrypt, encryptor, CryptoStreamMode::Write);
                swEncrypt = gcnew StreamWriter(csEncrypt);
    
                swEncrypt->Write(plainText);
                swEncrypt->Flush();
                csEncrypt->FlushFinalBlock();
                msEncrypt->Flush();
    
            }
            finally
            {
    
                if(swEncrypt)
                    swEncrypt->Close();
                if (csEncrypt)
                    csEncrypt->Close();
    
                if (aesAlg)
                    aesAlg->Clear();
            }
    
    		return Encoding::ASCII->GetString(msEncrypt->ToArray());
    
        }
    
    static String ^ decryptStringFromBytes_AES(String ^ cipherText)
        {
    
            String ^sKey = "xxx";
    
            MemoryStream   ^ msDecrypt;
            CryptoStream   ^ csDecrypt;
            StreamReader   ^ srDecrypt;
    
            RijndaelManaged ^ aesAlg;
    
            String ^ plaintext;
    
    		array<Byte>^ byteArray = Encoding::ASCII->GetBytes(sKey);
    		MD5CryptoServiceProvider^ md5provider = gcnew MD5CryptoServiceProvider();
    		array<Byte>^ byteArrayHash = md5provider->ComputeHash(byteArray);
    
            try
            {
                aesAlg = gcnew RijndaelManaged();
                aesAlg->Padding = PaddingMode::PKCS7;
                aesAlg->Key = byteArrayHash;
                aesAlg->GenerateIV();
    
                ICryptoTransform ^ decryptor = aesAlg->CreateDecryptor(aesAlg->Key, aesAlg->IV);
    
    	    msDecrypt = gcnew MemoryStream(Encoding::ASCII->GetBytes(cipherText));
                csDecrypt = gcnew CryptoStream(msDecrypt, decryptor, CryptoStreamMode::Read);
                srDecrypt = gcnew StreamReader(csDecrypt);
    
                plaintext = srDecrypt->ReadToEnd();
            }
            finally
            {
    
                if (aesAlg)
                    aesAlg->Clear();
            }
    
            return plaintext;
    
        }
    
    };
    


  • Moin,

    anstatt

    try {
        // ...
    } finaly {
        // ...
    }
    

    solltest Du mal

    try {
        // ...
    } catch(Exception ^ex) {
        Console::WriteLine(ex->Message);
    } finaly {
        // ...
    }
    

    ansonsten muss der IV wohl gleich sein

    hand, mogel



  • Also ich versuche die gleiche Funktionalität wie bei einem früherem VB.Net-Projekt hinzubekommen.

    Imports System.Security.Cryptography
    Imports System.IO
    Imports System.Text
    
    Module mdlCrypt
    
        Public Const sKEY As String = "xxx"
    
        ' Encrypt using stream (binary)
        Function Decrypt(ByVal sText As String) As String
            Dim rd As New RijndaelManaged
    
            Dim md5 As New MD5CryptoServiceProvider
            Dim key() As Byte = md5.ComputeHash(Encoding.UTF8.GetBytes(sKEY))
    
            md5.Clear()
            rd.Key = key
            rd.GenerateIV()
    
            Dim iv() As Byte = rd.IV
            Dim ms As New MemoryStream
    
            ms.Write(iv, 0, iv.Length)
    
            Dim cs As New CryptoStream(ms, rd.CreateEncryptor, CryptoStreamMode.Write)
            Dim data() As Byte = System.Text.Encoding.UTF8.GetBytes(sText)
    
            cs.Write(data, 0, data.Length)
            cs.FlushFinalBlock()
    
            Dim encdata() As Byte = ms.ToArray()
            Return Convert.ToBase64String(encdata)
            cs.Close()
            rd.Clear()
    
        End Function
    
        ' Decrypt using stream (binary)
        Function Encrypt(ByVal sText As String) As String
            Dim rd As New RijndaelManaged
            Dim rijndaelIvLength As Integer = 16
            Dim md5 As New MD5CryptoServiceProvider
            Dim key() As Byte = md5.ComputeHash(Encoding.UTF8.GetBytes(sKEY))
    
            md5.Clear()
    
            Dim encdata() As Byte = Convert.FromBase64String(sText)
            Dim ms As New MemoryStream(encdata)
            Dim iv(15) As Byte
    
            ms.Read(iv, 0, rijndaelIvLength)
            rd.IV = iv
            rd.Key = key
    
            Dim cs As New CryptoStream(ms, rd.CreateDecryptor, CryptoStreamMode.Read)
    
            Dim data(ms.Length - rijndaelIvLength) As Byte
            Dim i As Integer = cs.Read(data, 0, data.Length)
    
            Return System.Text.Encoding.UTF8.GetString(data, 0, i)
            cs.Close()
            rd.Clear()
        End Function
    
    End Module
    


  • Moin,

    Deine Verschlüsselungs und Entschlüsselungs Methoden arbeiten mit Strings ... das passt aber nicht ganz, da Du mit Bytes arbeiten musst ... übergib den Methoden mal Bytes ... wenn ich mich recht erinnere dann wird in dem Beispiel von VBArchive das verschlüsselte Byte-Array mittels Base64 codiert - dann ist es natürlich auch als String verwendbar

    hand, mogel



  • Die VB.Net Version funktioniert einwandfrei. Nur ich kriege es nicht hin den code in c++ zu übersetzen.



  • mogel schrieb:

    Deine Verschlüsselungs und Entschlüsselungs Methoden arbeiten mit Strings ... das passt aber nicht ganz, da Du mit Bytes arbeiten musst ... übergib den Methoden mal Bytes

    http://www.vbarchiv.net/tipps/details.php?id=1351 ... da ist ein Convert.???Base64String mit drinnen ... der fehlt in Deinem Quelltextbeispiel



  • So, habe versucht das Beispiel aus VBArchiv 1:1 in c++ zu übersetzen. Beim Dekodieren kommen aber nur cryptische Zeichen raus.

    #using <System.dll>
    
    using namespace System;
    using namespace System::IO;
    using namespace System::Security::Cryptography;
    
    class DeEncrypt
    {
    private:
    
     public:
        static String ^ encryptStringToBytes_AES(String^ plainText)
        {
         	String ^sKey = "xxx";
    
    		RijndaelManaged ^ aesAlg = gcnew RijndaelManaged;
    
    		MD5CryptoServiceProvider^ md5provider = gcnew MD5CryptoServiceProvider();
    
    		array<Byte>^ byteArrayHash = md5provider->ComputeHash(Encoding::UTF8->GetBytes(sKey));
    
    		md5provider->Clear();
    
    		aesAlg->Key = byteArrayHash;
    		aesAlg->GenerateIV();
    
    		array<Byte>^ iv = aesAlg->IV;
    
    		MemoryStream ^   msEncrypt =  gcnew MemoryStream();
    
    		msEncrypt->Write(iv,0,iv->Length );
    
            CryptoStream ^   csEncrypt;
    
    		ICryptoTransform ^ encryptor = aesAlg->CreateEncryptor(aesAlg->Key, aesAlg->IV);
            csEncrypt = gcnew CryptoStream(msEncrypt, encryptor, CryptoStreamMode::Write);
    
    		array<Byte>^ data = System::Text::Encoding::UTF8->GetBytes(plainText);
    
    		csEncrypt->Write(data, 0 ,data->Length );
    		csEncrypt->FlushFinalBlock();
    
    		array<Byte> ^encdata = msEncrypt->ToArray();
    
    		return Convert::ToBase64String(encdata);
    
    		csEncrypt->Close();
    		aesAlg->Clear();
    
    	}
    
        static String ^ decryptStringFromBytes_AES(String ^ cipherText)
        {
    
    		String ^sKey = "xxx";
    
    		RijndaelManaged ^ aesAlg = gcnew RijndaelManaged;
    
    		int IVLength = 16;
    
       		MD5CryptoServiceProvider^ md5provider = gcnew MD5CryptoServiceProvider();
    
    		array<Byte>^ byteArrayHash = md5provider->ComputeHash(Encoding::UTF8->GetBytes(sKey));
    
    		md5provider->Clear();
    
    		array<Byte>^ encdata = Convert::FromBase64String(cipherText);
    
            MemoryStream   ^ msDecrypt =  gcnew MemoryStream(encdata);
    
    		array<Byte>^ iv = gcnew array<Byte>(16);
    
    		msDecrypt->Read(iv, 0,IVLength);
    
    		aesAlg->IV = iv;
    		aesAlg->Key = byteArrayHash;
    
            CryptoStream ^   csEncrypt;
    
    		ICryptoTransform ^ encryptor = aesAlg->CreateEncryptor(aesAlg->Key, aesAlg->IV);
    		csEncrypt = gcnew CryptoStream(msDecrypt, encryptor, CryptoStreamMode::Read);
    
    		array<Byte>^ data = gcnew array<Byte> (msDecrypt->Length - IVLength);
    		int i = csEncrypt->Read(data, 0,data->Length );
    
    		return System::Text::Encoding::UTF8->GetString(data,0,i);
    
    		csEncrypt->Close();
    		aesAlg->Clear();
    
        }
    
    };
    


  • Habe jetzt mal versucht den IV in beiden Funktionen fest vorzugeben:

    array<Byte>^ iv = gcnew array<Byte>{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
    aesAlg->IV = iv;
    

    Aber auch das brachte keinen Erfolg.
    Im Debugger habe ich kontrolliert, dass beide aesAlg->Key-Bytes gleich initialisiert sind.
    Woran kann es noch liegen?



  • Der Inhalt des MemoryStream scheint auch gleich zu sein wie in der funktionierenden VB.NET Version.
    Erst wenn der CryptoStream den MenoryStream in das Byte-Array schreibt, kommen die falschen Zeichen raus.


Log in to reply