ccy
6 天以前 5e1e4a4b57e298806dba97175fa1fbd5c771c7cd
licensedata.h
@@ -38,6 +38,31 @@
    bool fromBinary(const QByteArray &data);
    QString toDebugString() const;
    /**
     * @brief V3 紧凑格式(28位纯大写许可密钥用,恰好16字节)
     *
     * 二进制布局(大端序):
     *  [0..7]    8B  机器指纹 = SHA256(密钥‖UUID(16B)‖CPU(8B)) 截断前8字节
     *  [8..9]    2B  失效日期(距2000-01-01的天数,uint16,与V2同基准)
     *  [10]      1B  产品号
     *  [11]      1B  版本号(高4位主版本 | 低4位次版本)
     *  [12]      1B  标志(高4位格式版本=1,低4位激活状态)
     *  [13..14]  2B  CRC16-CCITT(覆盖[0..12])
     *  [15]      1B  随机盐(避免同机同日期密文完全相同)
     *
     * 与V2的区别:UUID/CPU不再明文随密钥携带,只带不可逆指纹;
     * 设备ID仍用V2格式(需要还原机器信息),仅许可密钥用V3。
     */
    QByteArray toBinaryV3(const QByteArray &key) const;
    bool fromBinaryV3(const QByteArray &data);
    QString toDebugStringV3() const;
    QByteArray machineFp;    // V3解出的机器指纹(8字节);V2中为空
    // 机器指纹:授权端与验证端必须用同一算法、同一密钥
    static QByteArray machineFingerprint(const QByteArray &uuid, const QByteArray &cpu, const QByteArray &key);
    static quint16 crc16(const QByteArray &data);
    // 辅助转换
    static QByteArray uuidStringToBinary(const QString &uuidStr);
    static QString    uuidBinaryToString(const QByteArray &bin);