Zum Inhalt springen

Astasor

Mitglieder
  • Gesamte Inhalte

    50
  • Benutzer seit

  • Letzter Besuch

  1. Mit der anderen Zeichenkette und einer #define-Anweisung funktioniert es. Tja, hätte ich nur mal richtig hingeschaut -__-. Ich werde mir VS-Express mal genauer anschauen. Vielleicht steige ich auch um. Wieder vielen Dank, Klotzkopp ^___^ Bis zum nächsten mal.
  2. Danke für deine Antwort, Klotzi. Eigentlich brauch man den Static_Cast da nicht, da es fest definierte Konstanten gibt. Zu sehen auf dieser Seite Cryptographic Provider Names Der Provider mit dem ich gerne arbeiten würde, ist der hier MS_ENH_RSA_AES_PROV. Eigentlch müsste ich in die CryptAquireContext Funktion statt des static_casts nur diesen Schriftzug einsetzen und zwar auf die folgende Art. if(CryptAcquireContext(&hProvKey,NULL,MS_ENH_RSA_AES_PROV,PROV_RSA_AES,0)) {std::cout<<"Kontext erfolgreich erstellt"<<std::endl;} else{std::cout<<"Es ist ein Fehler aufgetreten"<<std::endl; std::cout<<"Fehler: "<<GetLastError()<<std::endl;} [/PHP] Doch dann schreibt mir Bloodshed Dev C++, das es [code]MS_ENH_RSA_AES_PROV[/CODE] nicht kennt. In der Funktionsapi ist der dritte Parameter als LPCTSTR angegeben. Zu sehen hier als Auszug: [CODE]BOOL WINAPI CryptAcquireContext( _Out_ HCRYPTPROV *phProv, _In_ LPCTSTR pszContainer, _In_ LPCTSTR pszProvider, _In_ DWORD dwProvType, _In_ DWORD dwFlags );[/code] Deswegen dachte ich, ich umgehe die Konstante, die vielleicht nur fehlt und caste es direkt dahin. Doch das funktioniert auch nicht. Deswegen frage ich jetzt hier: Was kann ich tun, um an diesen Provider zu kommen. Oder hatte jemand schon mal dasselbe Problem wie ich? Oder könnte es gar an meiner verwendeten IDE selbst liegen? Könnt ihr mir eine andere Entwicklungsumgebung mit integriertem Compiler empfehlen? Denn die andere Alternative wäre, das RIJNDAEL selbst zu implementieren, eine Arbeit die ich mir liebend gerne ersparen würde. Viele Grüße Astasor
  3. Hallöchen liebe Forums-Community, ich arbeite mit C++ und würde gerne den im Titel genannten Cryptographischen Provider verwenden. Doch mit Bloodshed Dev C++ kann ich ihn irgendwie nicht korrekt mit CryptAquireContext ansprechen. Auch wenn ich WinCrypt.h inkludiere. if(CryptAcquireContext(&hProvKey,NULL,static_cast<LPCTSTR>("MS_ENH_RSA_AES_PROV"),PROV_RSA_AES,0)){ std::cout<<"Kontext erfolgreich erstellt"<<std::endl;} else{std::cout<<"Es ist ein Fehler aufgetreten"<<std::endl; std::cout<<"Fehler: "<<GetLastError()<<std::endl;} [/PHP] Auf diese Art compiliert es zwar, aber GetLastError haut dann immer noch einen Fehler raus. [code]2148073497[/CODE] durch Google habe ich herausbekommen, das der Fehler diese Meldung zum Hintergrund hat [CODE]NTE_KEYSET_NOT_DEF[/code] Bedeutet das, dass der im Titel genannte Provider auf meinem Lappi mit Win 7 nicht installiert ist? Könnt ihr mir da weiterhelfen? Viele Grüße Astasor
  4. Ich habe noch eine Nachfrage bezüglich des "Name Mangling". Ich habe bereits danach gegoogelt, doch es scheint niemand je ernsthafte Anstrengungen unternommen zu haben, das zu unterbinden und die Funktionsnamen im Klartext verfügbar zu halten. Warum ist das so? Wenn ich eine DLL schreibe, gebe ich sie unter Umständen an jemand anderes weiter und es wäre toll, wenn Derjenige normale Funktionsnamen zum Aufrufen der exportierten Funktionen verwenden könnte und nicht so ein komisches Wortgewürfel.
  5. Ich nutze jetzt die Lösung, die ich in anderen Foren schon gesehen habe. Ich definiere Funktionen mit konkreten Datentypen, die dann, in ihrer Implementation, mit ihrem jeweiligen Datentyp das entsprechende Template aufrufen. So kann ich die erstellten Templates sinnvoll nutzen und die Funktionen selbst exportieren. Wie immer Danke für deine Hilfe, Klotzi mfg Astasor
  6. Hallöchen, ich habe eine dll mit verschiedenen Template-Funktionen geschrieben. Eine solche Funktion sehen sie hier: #ifndef _SELECT_H_ #define _SELECT_H_ #include "./../common.h" #include <vector> template <typename T1> __declspec(dllexport) inline bool SimpleSelect(std::vector<T1>& values,int& i,int left,int right){ int pivot=0; if(i>right+1){i=0;return false;} if(left==right){i=values.at(left); return true;} else{ pivot=left; order<T1>(values,pivot,left,right); if(i==(pivot-left)){i=values.at(pivot); return true;} else{ if(i<(pivot-left)){SimpleSelect<T1>(values,i,left,right-1); return true;} else{ i=i-1; SimpleSelect<T1>(values,i,left+1,right); return true; } } } } #endif [/PHP] Doch dummerweise wird die Funktion SimpleSelect nicht exportiert. Ich habe in anderen Foren gelesen, das man Template-Funktionen für jeden Datentyp, der exportiert werden soll, explizit spezifizieren muss, aber das würde doch irgendwo dem Sinn von Templates zuwider laufen, oder? Was mache ich hier falsch? Ein Stichwort oder ein Hinweis wären toll. Ich will nicht das hier jemand die Arbeit für mich macht. Zur Vollständigkeit halber. [PHP] //in common.h template <typename T1> inline bool order(std::vector<T1>& values,int& pivot,int left,int right){ int tmpleft=left; int tmpright=right; bool finish=false; if((left>pivot)||(right<pivot)){return false;} while(finish==false){ finish=true; if(tmpleft<=pivot){ if(values.at(tmpleft)<=values.at(pivot)){tmpleft=tmpleft+1;} else{ flip<T1>(values.at(tmpleft),values.at(pivot)); pivot=tmpleft; } finish=false; } if(tmpright>=pivot){ if(values.at(tmpright)>=values.at(pivot)){tmpright=tmpright-1;} else{ flip<T1>(values.at(tmpright),values.at(pivot)); pivot=tmpright; } finish=false; } } return true; } Die Select.h habe ich in die dllmain.cpp mit inkludiert, also wird sie auch mit zusammengelinkt. Die dll wird vom Compiler auch erstellt, aber halt die Template-Funktion SimpleSelect nicht exportiert. Bitte gebt mir nen Tipp. Vielen Dank mfg Astasor
  7. Danke für deine Antwort. Ich hatte die Funtion auch erst anders geschrieben und sie dann wegen Testzwecken abgeändert. Danke für deinen Tipp mit dem kleinen nützlichen Zusatzprogramm. Nun kann ich endlich mit DLL's arbeiten. mfg Astasor
  8. Das mit dem Dependency Walker war ein wirklich guter Tipp. Meine Funktion hatte einen Namen mit Buchstabengewürfel drum rum. Dazu kam noch ein _. Auf deine erste Frage: Nein. Ich habe gegoogelt wie es geht und bin dabei auf diese Funktionen gestoßen. Was ist der Unterschied zwischen den beiden Verfahren?
  9. Hallöchen, ich konnte bei Problemen immer auf das Board vertrauen und deshalb komme ich jetzt wieder zu euch zurück Ich habe eine DLL erstellt und würde sie gerne in einem anderen Projekt nutzen. Mithilfe von LoadLibrary konnte ich die DLL auch laden, aber GetProcAccess gibt mir nicht die Addresse meiner Function aus, obwohl ich sie mit __declspec(dllexport) aus der DLL exportiert und __declspec(dllimport) in das Zweitprogramm importiert habe. Hier mal mein Code. Ich nehm das PHP-Tag, da es dort schönes Syntax-Coloring gibt. Die erste Zeile ist der jeweilige Name der Datei. Hier ist der Code von meiner DLL. #dll.h #ifndef _DLL_H_ #define _DLL_H_ #if BUILDING_DLL # define DLLIMPORT __declspec (dllexport) #else /* Not BUILDING_DLL */ # define DLLIMPORT __declspec (dllimport) #endif /* Not BUILDING_DLL */ #include <string> class DLLIMPORT DllClass { public: DllClass(); virtual ~DllClass(void); private: }; __declspec(dllexport) std::string testDll(); #endif /* _DLL_H_ */ [/PHP] [PHP] #dllmain.cpp #include "dll.h" #include <windows.h> #include <string> DllClass::DllClass() { } DllClass::~DllClass () { } __declspec(dllexport) std::string testDll(); BOOL APIENTRY DllMain (HINSTANCE hInst /* Library instance handle. */ , DWORD reason /* Reason this function is being called. */ , LPVOID reserved /* Not used. */ ) { switch (reason) { case DLL_PROCESS_ATTACH: break; case DLL_PROCESS_DETACH: break; case DLL_THREAD_ATTACH: break; case DLL_THREAD_DETACH: break; } /* Returns TRUE on success, FALSE on failure */ return TRUE; } std::string testDll(){ std::string test="Die DLL wurde erfolgreich eingebunden."; return test; } Hier ist der Code von meinem Zweitprogramm, indem ich die DLL nutzen will. #TestDll.cpp #include "./TestDll.h" #include <windows.h> TestDll::TestDll(){ HINSTANCE hInstance; hInstance = ::LoadLibrary("./../Test/DLL/Test.dll"); pDllFunction = (LPFNDLLFUNC1*)::GetProcAddress((HMODULE)hInstance,"testDll"); } bool TestDll::CallDllFunction(){ if(pDllFunction){ return true; } else{ return false; } } [/PHP] [PHP] #TestDll.h #ifndef _TESTDLL_H_ #define _TESTDLL_H_ #include <string> class TestDll{ private: typedef std::string LPFNDLLFUNC1(); LPFNDLLFUNC1 *pDllFunction; public: TestDll(); bool CallDllFunction(); }; #endif #main.cpp #include <cstdlib> #include <iostream> #include <windows.h> #include "./TestDll.h" #include <string> using namespace std; __declspec(dllimport) string testDll(); int main(int argc, char *argv[]) { TestDll DllTest; cout<<DllTest.CallDllFunction()<<endl; system("PAUSE"); return EXIT_SUCCESS; } [/PHP] Danke das ihr bis hier her gelesen habt. Jetzt noch mal konkret meine Fragen: Was mache ich hier falsch? Sind die Präprozessordirektiven in der dll.h korrekt? Stimmt das typedef in der TestDll.h so, wie es zur Zeit dasteht? Vielen Dank mfg Astasor
  10. Der reinterpret_cast ist aber genauso schlecht wie die C-Casts, da er den Inhalt einer Variable als beliebig interpretierbares Bitmuster wahrnimmt. Das ist genau dieselbe Philosophie wie bei den zu vermeidenden C-Casts.
  11. Hallöchen, ich versuche den Hintergrund mehrerer STATIC-Fenster einzufärben. Dazu zeichne ich den Hintergrund der Fenster wenn die WM_PAINT Message gespeichert wird. Wenn ich das Fenster jedoch verschiebe oder an den Rändern ziehe, zeichnet es die Farbe nicht mehr nach. Dann werden die einzelnen Fenster einfach weis. Ich habe aber absolut keine Ahnung warum das so ist. hier mal die WM_CREATE und die WM_PAINT Messages. Die Handler und die PAINTSTRUCT habe ich global deklariert, damit sie mir dauerhaft zur Verfügung stehen, und nicht nach dem Beenden der Funktion gelöscht werden. case WM_CREATE:{ unsigned int l=0,h=0,ll=50,lh=50,n=1; for(int i=0; i<tmpplg.getSizeX();i++){ for(int j=0; j<tmpplg.getSizeY();j++){ hwndplg[i][j]=CreateWindow(TEXT("STATIC"),TEXT(""),WS_VISIBLE | WS_CHILD | WS_BORDER, l,h,ll,lh,hwnd,(HMENU) n, NULL, NULL); l=l+50;n++; } l=0;h=h+50; } break; } case WM_PAINT:{ unsigned int n=1; HDC dcWindow[4][4]; for(int i=0;i<tmpplg.getSizeX();i++){ unsigned int l=0, h=0, ll=50, lh=50; vector<Cell> tmpcell = tmpplg.getAllCells(); for(int j=0;j<tmpplg.getSizeY();j++){ dcWindow[i][j]=BeginPaint(hwndplg[i][j],&ps); if(tmpcell.at(j+i*tmpplg.getSizeX()).getState()==0){ /* GetClientRect(hwndplg[i][j],&tmprect[i][j]); tmprect[i][j].left=l; tmprect[i][j].top=h; tmprect[i][j].right=ll; tmprect[i][j].bottom=lh; dcWindow[i][j] = GetDC(hwndplg[i][j]); FillRect(dcWindow[i][j], &tmprect[i][j], CreateSolidBrush(RGB(255, 255, 255))); */ FillRect(dcWindow[i][j], &ps.rcPaint, CreateSolidBrush(RGB(255, 255, 255))); //SendDlgItemMessage(hwnd,n,WM_CTLCOLORSTATIC,(WPARAM)dcWindow[i][j],(LPARAM)hwndplg[i][j]); //ReleaseDC(hwndplg[i][j],dcWindow[i][j]); //EndPaint(hwndplg[i][j],&ps); } if(tmpcell.at(j+i*tmpplg.getSizeX()).getState()==1){ //dcWindow[i][j]=BeginPaint(hwndplg[i][j],&ps); /* GetClientRect(hwndplg[i][j],&tmprect[i][j]); tmprect[i][j].left=l; tmprect[i][j].top=h; tmprect[i][j].right=ll; tmprect[i][j].bottom=lh; dcWindow[i][j] = GetDC(hwndplg[i][j]); FillRect(dcWindow[i][j], &tmprect[i][j], CreateSolidBrush(RGB(0, 255, 0))); */ FillRect(dcWindow[i][j], &ps.rcPaint, CreateSolidBrush(RGB(0, 255, 0))); //ReleaseDC(hwndplg[i][j],dcWindow[i][j]); //EndPaint(hwndplg[i][j],&ps); } if(tmpcell.at(j+i*tmpplg.getSizeX()).getState()==2){ //dcWindow[i][j]=BeginPaint(hwndplg[i][j],&ps); /* GetClientRect(hwndplg[i][j],&tmprect[i][j]); tmprect[i][j].left=l; tmprect[i][j].top=h; tmprect[i][j].right=ll; tmprect[i][j].bottom=lh; dcWindow[i][j] = GetDC(hwndplg[i][j]); FillRect(dcWindow[i][j], &tmprect[i][j], CreateSolidBrush(RGB(255, 0, 0))); */ FillRect(dcWindow[i][j], &ps.rcPaint, CreateSolidBrush(RGB(255, 0, 0))); ReleaseDC(hwndplg[i][j],dcWindow[i][j]); //EndPaint(hwndplg[i][j],&ps); } EndPaint(hwndplg[i][j],&ps); n++;} } paint=true; break; }[/PHP] Ich bin mir nicht sicher, ob es was hilft, die WM_PAINT Message halt periodisch aufzurufen, damit das Fenster immer wieder neu gezeichnet wird. Oder muss ich die WM_SIZE Message abfangen und darauf mit einem Neuzeichnen reagieren? Wäre schön, wenn ihr mir hier nen Tipp oder einen Denkanstoß geben könntet. mfg Astasor
  12. Ich kann diir das Buch von Bjarne Stroustrup empfehlen. Dieser Mann weis wovon er schreibt, da er C++ entwickelt hat. Hier gehts zu einer Leseprobe des Buches
  13. Vielen Dank euch allen und ganz besonders dir Klotzi, ich konnte jetzt alle Probleme lösen. Danke das ihr euch alle die Zeit genommen habt, meinen Thread zu lesen und zu Antworten. Die Dateiendung habe ich auf .bin geändert. Damit wird mein Ciphertext nicht mehr verändert, so wie wenn ich ihn als Text oder in Dateien mit .dat-Endung schreiben würde. Ich habe mir die Funktion CryptEncrypt mal genau angeschaut und wenn ich sie nur mit dem Parameter der die Länge des Eingangspuffers durchlaufen lasse, dann enthält dieser dann die erforderliche Größe für den Ciphertext beim zweiten Aufruf. Krass, sage ich mal. Die Funktion CryptDeriveKey sollte mit gleichem CSP, gleichem Algorithmus und gleicher Datenbasis eigentlich dasselbe Ergebnis liefern. Hier von http://msdn.microsoft.com Aber naja, die Probleme haben sich geklärt. Könnte aber noch jemand den Titel des Threads in "Verschlüsselung von Daten und deren Speicherung" ändern? Denn das mit den fstreams tangiert das behandelte Problem ja nur ein wenig. mfg Astasor
  14. Vielen Dank für eure beiden Antworten. @uenetz: Das bringt glaube ich weniger @Klotzkopp: Ich habe mir deine Vorschläge angesehen und Dinge verändert. BYTE* encrDecrData=(BYTE*)content.c_str(); habe ich durch long length=content.length(); char* buf = new char[length]; content.copy(buf,content.length()-1,0); BYTE* encrDecrData=(BYTE*)buf; ersetzet und das hier tmptxt<<encrDecrData; durch das tmptxt.write((char*)encrDecrData,strlen((LPCTSTR)encrDecrData)); Die Größe des Zielpuffers habe ich so gewählt, da ich gehört habe, das zu wenig Platz eine Fehlermeldung auslöst, aber zuviel Platz geht quasi immer fehlerlos durch und mache nie Probleme. Das Format der Dateien habe ich von .txt auf .dat geändert. Nun, was ich erreichen will ist eigentlich das, ich will Daten von einem Programm verschlüsseln lassen, diese Dateien werden dann kopiert und von einem anderen Programm wieder entschlüsselt. Die Funktion CryptDeriveKey sollte bei gleichem Passwort und gleichen verwendeten Algorithmen eigentlich auch einen identischen Schlüssel garantieren. Das Ver- und Entschlüsseln innerhalb einer Datei und wenn ich es in die Datei schreibe und hiermit wieder auslese und entschlüssel, geht ja alles fabelhaft, aber wenn ich es von einem Programm schreiben und von einem anderen lesen und entschlüsseln lasse, liest er nur bis zum ersten Zeilenumbruch. So schreibt es Programm A in die spezifische Datei: //----------------------Ergebnisse zusammenfügen-------------------------------- finalres=firstres+secondres+thirdres; finalres=(string)userannounce+","+finalres; long sizeFinalres = finalres.length(); char* bufFinalres = new char[sizeFinalres]; finalres.copy(bufFinalres,finalres.length()-1,0); byteFinalres=(BYTE*)bufFinalres; dlength = strlen((LPCTSTR)byteFinalres); // MessageBox(hwnd,finalres.c_str(),"Title",MB_OK); //zum testen //----------------------Ergebnisse verschlüsseln-------------------------------- bResult = CryptAcquireContext( &hProv, // Variable to hold returned handle. NULL, // Use default key container. MS_DEF_PROV, // Use default CSP. PROV_RSA_FULL, // Type of provider to acquire. 0); // No special action. //if(bResult==true){MessageBox(hwnd,"1 geschafft","title",MB_OK);} hashresult = CryptCreateHash( hProv, CALG_MD5, 0, 0, &phHash); //if(hashresult==true){MessageBox(hwnd,"2 geschafft","title",MB_OK);} hashdata = CryptHashData( phHash, hashdatabuf, dwhashdatabuflen, 0); //if(hashdata==true){MessageBox(hwnd,"3 geschafft","title",MB_OK);} hashdatakey = CryptDeriveKey( hProv, CALG_RC4, phHash, CRYPT_EXPORTABLE, &phKey); //if(hashdatakey==true){MessageBox(hwnd,"4 geschafft","title",MB_OK);} encryptdata = CryptEncrypt( phKey, 0, true, 0, byteFinalres, &dlength, 2048); //if(encryptdata==true){MessageBox(hwnd,"5 geschafft","title",MB_OK);} /* decryptdata = CryptDecrypt( phKey, 0, true, 0, byteFinalres, &dlength); */ //----------------------Ergebnisse in die Datei schreiben----------------------- if(true){ string filetmp="EncodedT0Answers"+(string)userannounce+".dat"; fstream a_file(filetmp.c_str(), ios_base::out | ios_base::binary); GetLocalTime(&loctime); long finalresLength=finalres.length(); char* finalresBuf = new char[finalresLength]; finalres.copy(finalresBuf,finalres.length()-1,0); a_file.write(finalresBuf,strlen(finalresBuf)); // a_file.write((char*)byteFinalres,strlen((LPCTSTR)byteFinalres));[/PHP] Problem: wenn ich das Byte Objekt in die Datei schreiben will, dann schreibt es nur bis zum ersten Zeilenumbruch, schreibe ich den String [b]finalres[/b] in die Datei, dann schreibt er alles aber Programm B liest dann nur bis zum ersten Zeilenumbruch. und so liest es Programm B aus eben jener Datei und entschlüsselt es dann wie in Post 1: [PHP] lpFileName=(LPCTSTR)".\\Encoded*.dat"; h= FindFirstFile(lpFileName,&lpFindFileData); fstream lpFile(lpFindFileData.cFileName,ios_base::in | ios_base::binary); lpFile.seekg(0,lpFile.ios_base::end); long lpFileSize = lpFile.tellg(); lpFile.seekg(0,lpFile.ios_base::beg); char* fbuf = new char[lpFileSize]; lpFile.read(fbuf,lpFileSize); BYTE* encrDecrData=(BYTE*)fbuf; DWORD dlength = strlen((LPCTSTR)encrDecrData); . .//hier findet dann die Entschlüsselung statt . FindClose(h); lpFile.close(); kurze Zusammenfassung: Ich schaffe es nicht, etwas von einem Programm verschlüsseln und dann von einem anderen wieder entschlüsseln zu lassen. Das was ein Programm geschrieben hat, kann es fehlerlos selbst wieder lesen und entschlüsseln, aber von Programm zu Programm kommt nur Gekrissel als Klartext heraus. Vielen Dank, wenn ihr bis hierhin gelesen habt. mfg Astasor
  15. Hallo und danke das ihr euch mein Problem anschaut. Ich versuche einen Text zu verschlüsseln, ihn in verschlüsselter Form in eine .txt Datei zu schreiben und dann wieder zu entschlüsseln. Das mit dem Ver- und Entschlüsseln klappt auch alles doch beim Schreiben in die "tmp.txt" macht der fstream Zeilenumbrüche rein, die verhindern, das beim auslesen der Datei die ganzen Daten mitgelesen werden. Ich habe schon alles probiert um die Zeilenumbrüche wegzubekommen oder trotzdem mir alle Daten zu holen. Wäre nett wenn ich hier nen Denkanstoß bekommen könnte. Aber hier erstmal der Code: #include <cstdlib> #include <iostream> #include <stdlib.h> #include <fstream> #include <string> #include <windows.h> #include <stdio.h> #include <sstream> #include <wincrypt.h> using namespace std; bool bResult,hashresult,hashdata,hashdatakey,decryptdata,encryptdata; HCRYPTPROV hProv; HCRYPTHASH phHash=0; HCRYPTKEY phKey=0; BYTE *hashdatabuf =(BYTE*)"Testpasswort1234"; DWORD dwhashdatabuflen = strlen((char*)hashdatabuf); int main(int argc, char *argv[]) { fstream tmptxt("tmp.txt",ios_base::out | ios_base::binary); string content="M_220,11.1987.,1,1,5,1,5,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,70,0,3,100,1,0,1,3,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,75,1,2,3,2,1,2,3,2,5,5,1,2,3,3"; BYTE* encrDecrData=(BYTE*)content.c_str(); cout<<encrDecrData<<endl; DWORD dlength = strlen((LPCTSTR)encrDecrData)+1; bResult = CryptAcquireContext( &hProv, // Variable to hold returned handle. NULL, // Use default key container. MS_DEF_PROV, // Use default CSP. PROV_RSA_FULL, // Type of provider to acquire. 0); // No special action. if(bResult==true){cout<<"1 geschafft"<<endl;} hashresult = CryptCreateHash( hProv, CALG_MD5, 0, 0, &phHash); if(hashresult==true){cout<<"2 geschafft"<<endl;} hashdata = CryptHashData( phHash, hashdatabuf, dwhashdatabuflen, 0); if(hashdata==true){cout<<"3 geschafft"<<endl;} hashdatakey = CryptDeriveKey( hProv, CALG_RC4, phHash, CRYPT_EXPORTABLE, &phKey); encryptdata = CryptEncrypt( phKey, 0, true, 0, encrDecrData, &dlength, 2048); cout<<encrDecrData<<endl; tmptxt<<encrDecrData; tmptxt.close(); decryptdata = CryptDecrypt( phKey, 0, true, 0, encrDecrData, &dlength); if(decryptdata==true){cout<<"4 geschafft"<<endl;} cout<<encrDecrData<<endl; system("PAUSE"); return EXIT_SUCCESS; } [/PHP] Ach ja, her die Ausgabe der tmp.txt, wenn ich sie so im ordner öffne: [code] VL¶º´«ý>ì“3,d/´Î¨7|½›,Ã?K㌅’5BI€Ã‹â€™ÃšÃ€ÃžÄhŸ•&ÃŒäOÙΤ-SSÚÄËœ-äØ!zë]Ãg’ª†ÞÈlP§™8±gÅ¡;jÉeíú@‹zÿlŒ˜ÅÔÙ**aniÂÂ~€ÃJJty¿Âp¨(ÂlÅ [òn¬Ì}—kž ÈÓRHÃ~â„¢]`~è¤ÈW…§„PN=2a07 [/code] Öffne ich die tmp.txt aber in meiner IDE- (Bloodshed Dev C++), oder kopiere den String und füge ihn woanders ein, sieht er so aus: [code] VL¶º´«ý>ì“3,d/´Î¨7|½›,Ã?K㌅’5BI€Ã‹â€™ÃšÃ€ÃžÄhŸ•&ÃŒäOÙΤ-SSÚÄËœ-äØ!zë ]Ãg’ª†ÞÈlP§™8±gÅ¡;jÉeíú@‹zÿlŒ˜ÅÔÙ**aniÂÂ~€ÃJJty¿Âp¨(ÂlÅ [òn¬Ì}—kž ÈÓRHÃ~â„¢]`~è¤ÈW…§„PN=2a07[/code] Wie kann ich daran etwas ändern? Vielen Dank für eure Zeit. mfg Astasor

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...