/** ================================* eli960@qq.com* http:/linuxmail.cn/* 2016年09月09日* ================================*/#include "zcc/zcc_stdlib.h"zcc_namespace_begin;/*** @brief 根据给定的盐值和MAC地址生成许可证字符串** @param salt 用于生成许可证的盐值字符串* @param mac 设备的MAC地址字符串* @return std::string 生成的许可证字符串*/std::string license_build(const char *salt, const char *mac){// 用于存储拼接后的临时字符串std::string tmpstr;// 将盐值和逗号拼接到临时字符串中tmpstr.append(salt).append(",");// 遍历MAC地址字符串,将每个字符转换为小写并添加到临时字符串中for (auto *p = mac; *p; p++){tmpstr.push_back((char)tolower(*p));}// 计算临时字符串的64位CRC校验值int64_t crc = crc64(tmpstr);// 用于存储格式化后的许可证字符串char new_license[32 + 1];// 将CRC校验值格式化为16位十六进制字符串std::sprintf(new_license, "%016zX", crc);return new_license;}/*** @brief 检查给定的许可证是否有效** @param salt 用于验证许可证的盐值字符串* @param license 待验证的许可证字符串* @return int 验证结果,1表示有效,0表示无效,小于0表示获取MAC地址失败*/int license_check(const char *salt, const char *license){// 用于存储设备的MAC地址列表std::vector<std::string> mac_vector;// 查找许可证字符串中逗号的位置const char *ps = std::strchr(license, ',');if (ps){// 提取逗号之前的部分作为密钥std::string key(license, ps - license);// 生成许可证并与逗号之后的部分进行比较if (license_build(salt, key.c_str()) == ps + 1){return 1; // 许可证有效}return 0; // 许可证无效}// 获取设备的MAC地址列表int r = get_mac_address(mac_vector);if (r < 1){return r; // 获取MAC地址失败,返回错误码}// 遍历MAC地址列表,逐一验证许可证for (auto it = mac_vector.begin(); it != mac_vector.end(); it++){const char *mac = it->c_str();if (license_build(salt, mac) == license){return 1; // 许可证有效}}return 0; // 许可证无效}zcc_namespace_end;
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。
1. 开源生态
2. 协作、人、软件
3. 评估模型