#ifndef SHORTCRYPTO_H #define SHORTCRYPTO_H #include #include /** * @brief 最短密文加密工具类 * 流程:明文 → PKCS7填充 → AES-128-CBC加密 → Base85编码 */ class ShortCrypto { public: /** * @brief 加密 * @param plaintext 原始明文 * @param key 16字节密钥(AES-128) * @param iv 16字节初始向量,可为空(内部自动补零) * @return Base85编码的密文字符串 */ static QString encrypt(const QByteArray &plaintext, const QByteArray &key, const QByteArray &iv = QByteArray()); /** * @brief 解密 * @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; 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); }; #endif // SHORTCRYPTO_H