| | |
| | | |
| | | /** |
| | | * @brief 最短密文加密工具类 |
| | | * 流程:明文 → PKCS7填充 → AES-128-CBC加密 → Base85编码 |
| | | * 流程:明文 → PKCS7填充 → AES-128-CBC加密 → 纯字母编码(52字符集) |
| | | * V3许可密钥另用无填充变体(encryptRaw),输出纯大写26字符集 |
| | | */ |
| | | class ShortCrypto |
| | | { |
| | | public: |
| | | /** |
| | | * @brief 加密 |
| | | * @param plaintext 原始明文 |
| | | * @brief 加密(V2设备ID等,含PKCS7填充) |
| | | * @param plaintext 原始明文(任意长度) |
| | | * @param key 16字节密钥(AES-128) |
| | | * @param iv 16字节初始向量,可为空(内部自动补零) |
| | | * @return Base85编码的密文字符串 |
| | | * @return 纯字母编码的密文字符串(A-Z/a-z,52字符集,密文每48字节→68字符) |
| | | * @note 解密端自动回退兼容早期Base85版密文 |
| | | */ |
| | | static QString encrypt(const QByteArray &plaintext, const QByteArray &key, const QByteArray &iv = QByteArray()); |
| | | |
| | | /** |
| | | * @brief 解密 |
| | | * @param ciphertext Base85编码的密文 |
| | | * @brief 解密(V2设备ID等,含PKCS7验证) |
| | | * @param ciphertext 纯字母编码的密文(兼容早期Base85版密文,自动回退) |
| | | * @param key 16字节密钥(AES-128) |
| | | * @param iv 16字节初始向量,必须与加密时一致 |
| | | * @return 原始明文 |
| | |
| | | // V3 密文字符集:纯大写字母,不含数字/小写/特殊字符(26字符集,16字节→28字符) |
| | | static const char *V3_CHARS; |
| | | |
| | | // V2 密文字符集:大小写字母,不含数字/特殊字符(52字符集,48字节→68字符) |
| | | static const char *BASE52_CHARS; |
| | | |
| | | static QByteArray base85Encode(const QByteArray &data); |
| | | static QByteArray base85Decode(const QString &text); |
| | | |
| | | // 任意进制的大数编解码(整段字节序作为大整数,前导零以alphabet[0]补齐固定位数) |
| | | static QByteArray baseNEncode(const QByteArray &data, const char *alphabet, int base); |
| | | static QByteArray baseNDecode(const QString &text, const char *alphabet, int base); |
| | | |
| | | // 变长版解码:返回去掉前导零的最短字节序(供长度不固定的V2密文使用, |
| | | // 调用方需自行补齐对齐;52字符集下真值至多丢失1个前导零字节) |
| | | static QByteArray baseNDecodeVar(const QString &text, const char *alphabet, int base); |
| | | }; |
| | | |
| | | #endif // SHORTCRYPTO_H |