为什么生成license文件
有时候对于离线软件,需要进行功能控制,使用权限控制等,可以通过发布软件时候,先对部分功能进行加锁,禁掉部分功能,或者 控制使用期限。通过更新license文件,进行解锁,打开软件使用权,或者延长使用期限等。
实现该功能主要有以下几步:
1.设定好用于软件控制的信息
2.对要存入license文件中的信息进行加密;
3.加密信息写入license中;
4.读取license中的信息并进行解密
编辑控制信息
这个可以直接用QString 或者QStringList 表示,自己设定好格式就可以;解密后,安装设定的格式读取,在主程序里判断就可以。
加密信息方式
简单加密
通过改变编码方式,用户直接打开license文件时,是乱码:
加密:
//QString txt,dst;
QByteArray b64 = txt.toLocal8Bit().toBase64();// txt 被加密信息
dst = QString(b64);
解密:
QByteArray b64 = QByteArray::fromBase64(txt.toLocal8Bit());// txt 被解密信息
dst = QString(b64);
dst = QString(b64);
密码加密
通过设定加密密码,对文件进行加密,直接打开license文件时,也是乱码:
加密:
QString pwd = ui.edtPassword->text().trimmed(); // 输入密码
QString txt = ui.edtInput->text().trimmed(); // 加密信息
if (pwd.isEmpty() || txt.isEmpty()) return;
QString dst;
QByteArray key = pwd.toLocal8Bit();
QByteArray src_data = txt.toLocal8Bit();
for (int i = 0; i < src_data.size(); ++i) {
int idx = i % key.size();
src_data[i] = src_data[i] ^ key[idx];// 同密码进行异或,也可以做其他移位运算
}
dst = QString(src_data);
ui.edtEncrypt->setText(dst);
saveMyFile(m_licFile, src_data);
解密:
QByteArray src_data;
loadMyFile(m_licFile, src_data);
if (src_data.isEmpty()) return;
QString dst;
QByteArray key = ui.edtPassword->text().toLocal8Bit();
for (int i = 0; i < src_data.size(); ++i) {
int idx = i % key.size();
src_data[i] = src_data[i] ^ key[idx];
}
dst = QString(src_data);
ui.edtDecrypt->setText(dst);
license文件的读写
就是基本的文件操作
void myLicFile::saveMyFile(const QString& filename, const QByteArray bytes)
{
QFile f;
f.setFileName(filename);
if (!f.open(QIODevice::WriteOnly))
{
QMessageBox::warning(this, "Warning",tr("文件写入失败!"));
return;
}
f.write(bytes);
f.close();
}
void myLicFile::loadMyFile(const QString& filename, QByteArray& bytes)
{
QFile f;
f.setFileName(filename);
if (!f.open(QIODevice::ReadOnly))
{
QMessageBox::warning(this, "Warning", tr("文件读取失败!"));
return;
}
bytes.clear();
bytes = f.readAll();
f.close();
}