一直想做一个序列号的生成器,今天终于有了开始了,目前只有读取硬件生成,还没有做生成序列号的规则。
目前实现的功能就是读取系统磁盘卷加上CPU ID 和自己的加密字符串,在利用MD5加密,转换成标准32位序列号。称为一个伪装好的加密序列。防止别人看我怎么生成,哈哈,不知道管用不。
上最丑的界面
核心代码
/* * 生成序列号 */ const QString Poewr_Key::get_SerialNumber() { QString cpu_id = ""; QProcess p(0); p.start("wmic CPU get ProcessorID"); p.waitForStarted(); p.waitForFinished(); cpu_id = QString::fromLocal8Bit(p.readAllStandardOutput()); cpu_id = cpu_id.remove("ProcessorId").trimmed(); QString lpRootPathName = "C:\\"; LPTSTR lpVolumeNameBuffer=new TCHAR[12];//磁盘卷标 DWORD nVolumeNameSize=12;// 卷标的字符串长度 DWORD VolumeSerialNumber;//硬盘序列号 DWORD MaximumComponentLength;// 最大的文件长度 LPTSTR lpFileSystemNameBuffer=new TCHAR[10];// 存储所在盘符的分区类型的长指针变量 DWORD nFileSystemNameSize=10;// 分区类型的长指针变量所指向的字符串长度 DWORD FileSystemFlags;// 文件系统的一此标志 GetVolumeInformation((LPTSTR)lpRootPathName.utf16(), lpVolumeNameBuffer, nVolumeNameSize, &VolumeSerialNumber, &MaximumComponentLength, &FileSystemFlags, lpFileSystemNameBuffer, nFileSystemNameSize); return (cpu_id.mid(0,4) + "D-"+ cpu_id.mid(4,4) + "R-" + cpu_id.mid(8,4) + "E-" + cpu_id.mid(12,4) + "A-" + QString::number(VolumeSerialNumber,10).mid(0,4)+"M"); } /* * MD5加密 */ const QString Poewr_Key::hash_Encryption(const QString temp) { QByteArray byte_array; byte_array.append(temp); QByteArray hash_byte_array = QCryptographicHash::hash(byte_array,QCryptographicHash::Md5); return hash_byte_array.toHex().toUpper(); } /* * 格式化生成序列号 */ const QString Poewr_Key::format_HASHString(const QString hashtemp) { QString retemp = ""; for(int i = 0; i < 7; i++) { retemp += hashtemp.mid(4*i,4) + "-"; } retemp += hashtemp.mid(28,4); return retemp; } /* * 去除格式,还原MD5序列 */ const QString Poewr_Key::remove_Format(const QString formathash) { QString temp = ""; for(int i = 0; i < 8; i++) { temp += formathash.mid(5*i,4); } return temp; }
源码连接 码云地址:https://gitee.com/DreamLife-Technology_DreamLife/Qt-Power_Key
GitHub地址:https://github.com/DreamLifeOffice/Power_Key (已更新)