2012年(158)
分类: C/C++
2012-11-26 16:05:47
本来想根据md5值,在网上查原始数据的(某甲的密码^_^),但发现总是查不到结果,才发现那个做加密的作者竟然用utf-16le编码的字符串直接做MD5。
不知道这种行为是傻到没边,还是聪明的阴险?反正我是傻到没想到有人会这么做,也就耗费了一整天时间。
同一字符串,在不同的字符编码下,其二进制数据不一样,所以导致获得的md5值也不一样,以下是我用"123456"做的MD5结果
UTF-8
{ 0x31, 0x32, 0x33, 0x34, 0x35, 0x36 }
E10ADC3949BA59ABBE56E057F20F883E
UTF-16LE
{ 0x31, 0x00, 0x32, 0x00, 0x33, 0x00, 0x34, 0x00, 0x35, 0x00,
0x36, 0x00 }
CE0BFD15059B68D67688884D7A3D3E8C
UTF-16BE
{ 0x00, 0x31, 0x00, 0x32, 0x00, 0x33, 0x00, 0x34, 0x00, 0x35,
0x00, 0x36 }
EF4DAFDA494AD517E9823AE7D102A4C8
BTW:Qt中的字符编码很乱很不方便(过度设计+边界模糊),google到的信息也没什么大用(都是互相转载的),以下代码基本上是看源代码的实现而写的
// QCryptographicHash::hash需要的参数为QByteArray类型
//
所以得将QString转化为QByteArray,这一步真费事
QString str = "123456"; // QString的格式为
utf-16LE
QTextCodec::ConverterState
convState(QTextCodec::IgnoreHeader); //
没这一句,下句QByteArray的内容起始默认加BOM,有病
QByteArray ba =
QTextCodec::codecForName("UTF-16LE")->fromUnicode(str.constData(),str.length(),&convState);
// 从utf16le到utf16le,嘿嘿
QByteArray md5 =
QCryptographicHash::hash ( ba, QCryptographicHash::Md5 );
QString md5_hex =
md5.toHex(); // CE0BFD15059B68D67688884D7A3D3E8C
//当然,也可以这么做,但不地道,只是写出来展示一下QCryptographicHash的用法
QCryptographicHash
a(QCryptographicHash::Md5);
a.addData( (const char*)str.constData(),
str.size()*2 );
QByteArray md5 = a.result();