Crypto++ und std::wstring

badday

Erfahrenes Mitglied
Moin zusammen,

ich arbeite gerade an einem Projekt, dass Unicode benutzt. Dabei setze ich auch std::wstring. Ich brauche von einem solchen String einen MD5-Hash.
Bei normalen std::strings geht das so:
C++:
CryptoPP::StringSource(source, true, new CryptoPP::HashFilter(hash, new CryptoPP::HexEncoder(new CryptoPP::StringSink(md5_string))));
Wobei source nun eben ein std::string sein muss. Bei mir ist es aber ein std::wstring.

Eine Konvertierung von std::wstring nach std::string sollte auf jeden Fall vermieden werden.

Deshalb meine Frage: Kann ich irgendwie mit Crypto++ einen MD5-Hash eines wstrings generieren oder gibt es (falls ersteres nicht möglicht ist), andere Bibliotheken, die das ermöglichen? (Hinweis: Plattformspezifische Lösungen sollten vermieden werden, da das Projekt plattformübergreifend ist).


Vielen Dank.


Gruß,

badday
 
Wenn ich mir den Prototypen anschaue, würde ich es mal über den versuchen:

C++:
void MD5::Transform (word32 *digest, const word32 *in);

Wobei <digest> der Zielpuffer sein dürfte und <in> die Eingabe.
 
Hm... ich werde leider nicht ganz schlau daraus.
Bisher dachte ich an soetwas:
C++:
CryptoPP::Weak1::MD5 hash2;
byte digest[ CryptoPP::Weak1::MD5::DIGESTSIZE ];
hash2.CalculateDigest( digest, source.c_str(), source.length() );
CryptoPP::HexEncoder encoder;
std::string output;
encoder.Attach( new CryptoPP::StringSink( output ) );
encoder.Put( digest, sizeof(digest) );
encoder.MessageEnd();
Allerdings wüsste ich nicht, wie ich weitermachen sollte, falls das in die richtige Richtung geht.

Hier steht etwas zu Unicode:
C++:
MD5 hash;
hash.Put( (byte*)sink.c_str(), sink.size() );
hash.MessageEnd();
...

Allerdings werde ich auch daraus nicht schlau. Wäre echt super, wenn mich einer ein bisschen aufklären könnte.


Vielen Dank.


Gruß,

badday
 
Hi.
Hm... ich werde leider nicht ganz schlau daraus.
Bisher dachte ich an soetwas:
C++:
CryptoPP::Weak1::MD5 hash2;
byte digest[ CryptoPP::Weak1::MD5::DIGESTSIZE ];
hash2.CalculateDigest( digest, source.c_str(), source.length() );
CryptoPP::HexEncoder encoder;
std::string output;
encoder.Attach( new CryptoPP::StringSink( output ) );
encoder.Put( digest, sizeof(digest) );
encoder.MessageEnd();
Allerdings wüsste ich nicht, wie ich weitermachen sollte, falls das in die richtige Richtung geht.

Hier steht etwas zu Unicode:
C++:
MD5 hash;
hash.Put( (byte*)sink.c_str(), sink.size() );
hash.MessageEnd();
...
Du kannst die Rohdaten des wstring natürlich genauso verarbeiten wie die Rohdaten eines string:
C++:
hash.CalculateDigest(
    digest,
    reinterpret_cast<const byte*>(source.data()),
    source.size() * sizeof(wstring::value_type));
Je nachdem welche Kodierung du allerdings einsetzt (Unicode ist ja nur ein Zeichensatz und es gibt verschiedene Kodierungen dafür), ist das dann aber nicht portabel. (wchar_t ist unter Windows z.B. als 16-Bit Typ definiert (für UTF-16) und unter Linux aber als 32-Bit Typ; hinzu kommt die Endianess).

Gruß
 
Zuletzt bearbeitet:
Hey,

zunächst ein Danke an dich, deepthroat.
Das mit den locales sollte eine verschmerzbare Sache sein.
Gehe ich richtig in der Annahme, dass dieser Code das gewollte Resultat erzielen sollte?

Code:
CryptoPP::Weak1::MD5 hash;
		byte digest[ CryptoPP::Weak1::MD5::DIGESTSIZE ];
		hash.CalculateDigest(digest, reinterpret_cast<const byte*>(source.data()), source.size() * sizeof(std::wstring::value_type));
		CryptoPP::HexEncoder encoder;
		std::string output;
		encoder.Attach( new CryptoPP::StringSink( output ) );
		encoder.Put( digest, sizeof(digest) );
		encoder.MessageEnd();
Sodass output am Ende den Hash enthält. Ich denke es mach keinen Sinn, hier wstrings zu verwenden bzw. ist gar nicht möglich?


Vielen Dank nochmal.


Gruß,

badday
 
Zurück