Chinaunix首页 | 论坛 | 博客
  • 博客访问: 846642
  • 博文数量: 158
  • 博客积分: 4380
  • 博客等级: 上校
  • 技术积分: 2367
  • 用 户 组: 普通用户
  • 注册时间: 2006-09-21 10:45
文章分类

全部博文(158)

文章存档

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();

阅读(2897) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~