#ifndef SHORTCRYPTO_H
|
#define SHORTCRYPTO_H
|
|
#include <QByteArray>
|
#include <QString>
|
|
/**
|
* @brief 最短密文加密工具类
|
* 流程:明文 → PKCS7填充 → AES-128-CBC加密 → 纯字母编码(52字符集)
|
* V3许可密钥另用无填充变体(encryptRaw),输出纯大写26字符集
|
*/
|
class ShortCrypto
|
{
|
public:
|
/**
|
* @brief 加密(V2设备ID等,含PKCS7填充)
|
* @param plaintext 原始明文(任意长度)
|
* @param key 16字节密钥(AES-128)
|
* @param iv 16字节初始向量,可为空(内部自动补零)
|
* @return 纯字母编码的密文字符串(A-Z/a-z,52字符集,密文每48字节→68字符)
|
* @note 解密端自动回退兼容早期Base85版密文
|
*/
|
static QString encrypt(const QByteArray &plaintext, const QByteArray &key, const QByteArray &iv = QByteArray());
|
|
/**
|
* @brief 解密(V2设备ID等,含PKCS7验证)
|
* @param ciphertext 纯字母编码的密文(兼容早期Base85版密文,自动回退)
|
* @param key 16字节密钥(AES-128)
|
* @param iv 16字节初始向量,必须与加密时一致
|
* @return 原始明文
|
*/
|
static QByteArray decrypt(const QString &ciphertext, const QByteArray &key, const QByteArray &iv = QByteArray());
|
|
/**
|
* @brief 无填充加密(V3专用)
|
* @param plaintext 原始明文,长度必须是16的倍数(16字节明文 → 16字节密文)
|
* @param key 16字节密钥(AES-128)
|
* @return 纯大写字母编码的密文字符串(A-Z,26字符集),16字节明文恰好输出28字符
|
* @note 不做PKCS7填充:16字节明文若走填充会扩成32字节
|
* @note 若想缩短到25字符,把V3_CHARS换成"A-Z0-9"并把base改为36即可
|
*/
|
static QString encryptRaw(const QByteArray &plaintext, const QByteArray &key);
|
|
/**
|
* @brief 无填充解密(V3专用)
|
* @param ciphertext 纯大写字母编码的密文(兼容早期Base85/纯字母版V3密文,自动回退)
|
* @param key 16字节密钥(AES-128)
|
* @return 原始明文(长度与密文一致),完整性由上层CRC校验保证
|
*/
|
static QByteArray decryptRaw(const QString &ciphertext, const QByteArray &key);
|
|
private:
|
// Base85 字符集(RFC 1924 变体,不含引号/逗号/句点/斜杠,避免JSON/XML转义问题)
|
static const char *BASE85_CHARS;
|
|
// 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
|