Zum Inhalt springen

Astasor

Mitglieder
  • Gesamte Inhalte

    50
  • Benutzer seit

  • Letzter Besuch

Alle Inhalte von Astasor

  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
  16. zu aller erst: Ich meinte einen Index vom Typ INT mit den Attributen PRIMARY KEY und AI Eure Antworten sind gut und so hatte ich das noch gar nicht betrachtet. Mein Gedanke war das es optisch schöner aussieht und irgendwie aufgeräumter, als wenn da so viele Lücken drin sind und das man die Indizes der gelöschten Datensätze halt wiederverwenden kann. Das man aber noch die gelöschten Datensätze eindeutig bestimmen können sollte hatte ich echt nicht bedacht xDD Aber angenommen man löscht etwas und dann ist so viel Zeit vergangen, das es keinen mehr stört. Sollte man dann nicht die Tabelle Indexmäßig wieder "herrichten"?
  17. Hallo liebe Leute, ich habe ein Problem mit einer MySQL-Datenbank. Ich habe eine geschrieben in der man unter anderem etwas einfügen und löschen kann. Doch wenn ich das mache setzt sich der Index nicht zurück. Beispiel: Ich füge 3 Einträge ein, die mit dem Index: 1, 2, und 3 bezeichnet sind. Wenn ich nun den Eintrag mit Index 3 lösche und einen neuen Einfüge hat dieser den Index 4. Dann klafft da aber ne Lücke und das würde ich gerne vermeiden oder im nachhinein korrigieren. Ist das in MySQL möglich? Habe im Handbuch kein Befehl wie "Set Index" gefunden, nur einen "Create Index" um einen zu erstellen und "Drop Index" um einen zu löschen, als Unterbefehle von "Alter Table" Könnt ihr mir bitte einen Rat geben? mfg Astasor
  18. Kann mir bitte jemand erklären, wie Werte in den Fibonacci Heap eingefügt werden? Also ich weis, das es eine Wurzelliste mit Wurzeln gibt und jede Wurzel hat noch einen Baum unter sich in dem eine totale Ordnung gilt. Doch nach welcher Regel würde so ein Baum aufgebaut werden? Ab wann werden neue Elemente nicht mehr in der Wurzelliste aufgenommen sondern in einen Baum gepackt? In der Vorlesung hatten wir da etwas vom Rang des höchsten Elements in der Wurzelliste gelernt, also das nie mehr Elemente in der Liste sein dürfen, als der Rang des höchsten Elements hoch ist. Doch genau kapier ich das nicht. Heißt das, sollten 5, 4, 3, 2, 1 in meiner wurzelliste stehen würde eine neu eingefügte 6 das erste element sein, das eine wurzel als baum gehängt würde? steh hier gerade voll auf dem schlauch mfg Astasor:(
  19. Hey Mir ist hier etwas bei dem Algorithmus zu Max-Heapify nicht ganz klar. Mit Size-Heap(A) ist doch die größe des Arrays gemeint? Warum prüft man if l ≤ heap-size[A] and A[l] > A?? für mich würde nur sinn machen wenn man nur prüfen würde if A[l] > A eingabe Array A und Index i Max-Heapify(A,i){ l <- Left (i) r <- Right (i) if l ≤ heap-size[A] and A[l] > A[i] then largest <- l else largest <- i if r ≤ heap-size[A] and A[r] > A[largest] then largest <- r if largest != i then exchange A[i] <-> A[largest] Max-Heapify (A, largest) } mfg Astasor
  20. Astasor

    Textdatei auslesen

    hui danke für die flotte antwort mfg Astasor
  21. Astasor

    Textdatei auslesen

    Heyho ich habe hier ein kleines programmstück, das eine .txt Datei ausliest. Zerstört das auslesen der Datei den Inhalt, also den Text, oder kann ich die Datei beliebig oft auslesen? br = new BufferedReader(new FileReader("./recent.txt")); line=br.readLine(); String readMessage=""; while(line!=null){ readMessage=readMessage+line+"\n"; //recent.txt zeile für zeile auslesen line=br.readLine(); } mfg Astasor
  22. :old ich spiel mal totengräber. hat die levelordertraversierung genau wie alle anderen "baumdurchläufe" auch eine laufzeit von O(n)? Aus dem Code erschliest sich mir das nicht wirklich. Oder hängt das gar davon ab, wie man es implementiert? mfg Astasor.
  23. mit abschätzen meinst du sicherlich diese methode? Substitutionsmethode mfg Astasor
  24. Danke für deine Hilfe, flashpixx, doch hier mal das genaue Problem. Und mit Rechenregeln, meinst du da die mathematische definition oder was man macht, wenn man T(n)= 3T(n/4)+O(n) vorgesetzt bekommt und das dann einordnen soll? ich will zwei Rot-Schwarz-Bäume vereinigen, so dass ein Rot-Schwarz-Baum ausgegeben wird, der alle Elemente enthält. hier mal mein Algorithmus in Pseudocode, der sehr stark an Java angelehnt ist. Die Prozedur für das Einfügen in einen RS-Baum habe ich jetzt mal weggelassen, da bekannt ist, das dass Einfügen und Reparieren in solch einen Baum zusammen O(log n) im worst case brauch. int getBH(T){ //Bestimmung der BH um herauszufinden, welcher Baum größer ist. O(log n) //T RS-Baum Node tmp<- root[T] int bh<-1 while (tmp.left!=null){ tmp.left if (tmp.color=black) then bh=bh+1 } return bh } preOrder( x,T ){ //x knoten, wurzel wird zuerst in den größeren Baum eingefügt, dann der Rest RSinsert(T,x) O(logn) //einfügen in einen Rot-Schwarz Baum O(log n) if knoten.links ≠ null then //pre Order durchlauf O(n), da alle Knoten angeschaut werden müssen preOrder( knoten.links ) if knoten.rechts ≠ null then preOrder( knoten.rechts ) } vereineRstrees(T1,T2){ Node tmp if (getBH(T1)>getBH(T2)) then{ tmp<-root[T2] preOrder(x,T1) //einfügen von T2 in T1 return T1 } else{ tmp<-root[T1] preOrder(x,T2) //einfügen von T1 in T2 return T2 } } Mit so was tue ich mich noch schwer. Doch es gibt auch keine guten Bücher über das Laufzeitverhalten. mfg Astasor
  25. neue Frage aber gleiches Thema, deswegen alter Thread. wenn ich teile eines Algorithmusses habe, die mit O(n) Zeit laufen und Teile die mit O(log n) Zeit laufen, wie lautet dann die Gesamtlaufzeit? O(n*log n)? 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...