From a715f9c49f732908691341951b1643f7b8fae91b Mon Sep 17 00:00:00 2001
From: ccy <3140717620@qq.com>
Date: 星期五, 23 十月 2026 14:48:42 +0800
Subject: [PATCH] 将加密字符修改为全部是英文大小写,去掉之前奇怪的标识符号
---
shortcrypto.cpp | 60 +++++++++++++++++++++++++++--
shortcrypto.h | 21 +++++++---
2 files changed, 70 insertions(+), 11 deletions(-)
diff --git a/shortcrypto.cpp b/shortcrypto.cpp
index e6d80fd..f373ba2 100644
--- a/shortcrypto.cpp
+++ b/shortcrypto.cpp
@@ -12,6 +12,10 @@
const char *ShortCrypto::V3_CHARS =
"ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+// V2 瀛楃闆嗭細澶у皬鍐欏瓧姣嶏紙52瀛楃锛夛紝璁惧ID鍙惈瀛楁瘝銆佷笉鍚暟瀛椾笌鐗规畩瀛楃
+const char *ShortCrypto::BASE52_CHARS =
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
+
namespace {
QByteArray pkcs7Pad(const QByteArray &data, int blockSize) {
int padLen = blockSize - (data.size() % blockSize);
@@ -63,8 +67,8 @@
reinterpret_cast<const uint8_t*>(adjustedIv.constData()));
AES_CBC_encrypt_buffer(&ctx, reinterpret_cast<uint8_t*>(encrypted.data()), encrypted.size());
- // 3. Base85 缂栫爜锛岀缉鐭瓧绗︽暟
- QByteArray encoded = base85Encode(encrypted);
+ // 3. 绾瓧姣嶇紪鐮侊紙52瀛楃闆嗭級锛�48瀛楄妭瀵嗘枃 鈫� 68瀛楃
+ QByteArray encoded = baseNEncode(encrypted, BASE52_CHARS, 52);
return QString::fromLatin1(encoded);
}
@@ -83,10 +87,18 @@
adjustedIv.append(QByteArray(16 - adjustedIv.size(), '\0'));
}
- // 1. Base85 瑙g爜
- QByteArray encrypted = base85Decode(ciphertext);
+ // 1. 浼樺厛鎸夌函瀛楁瘝琛紙52瀛楃闆嗭級瑙g爜锛�52^瀛楃鏁� 涓� 256瀛楄妭鐣� 鐨勫ご绌洪棿涓嶈冻1瀛楄妭锛�
+ // 鐪熷�艰嚦澶氫涪澶�1涓墠瀵奸浂瀛楄妭锛岄暱搴︿笉瀵归綈鏃惰ˉ鍥�
+ QByteArray encrypted = baseNDecodeVar(ciphertext, BASE52_CHARS, 52);
+ if (!encrypted.isEmpty() && encrypted.size() % 16 != 0) {
+ encrypted.prepend('\0');
+ }
+ if (encrypted.isEmpty() || encrypted.size() % 16 != 0) {
+ // 鍥為��锛氭棭鏈烞ase85鐗堝瘑鏂�
+ encrypted = base85Decode(ciphertext);
+ }
if (encrypted.isEmpty()) {
- qWarning() << "ShortCrypto::decrypt: base85 decode failed";
+ qWarning() << "ShortCrypto::decrypt: decode failed";
return QByteArray();
}
@@ -234,6 +246,44 @@
return num;
}
+QByteArray ShortCrypto::baseNDecodeVar(const QString &text, const char *alphabet, int base)
+{
+ // 寤虹珛瀛楃绱㈠紩琛�
+ int charToVal[256];
+ memset(charToVal, -1, sizeof(charToVal));
+ for (int i = 0; i < base; ++i) {
+ charToVal[static_cast<unsigned char>(alphabet[i])] = i;
+ }
+
+ // 灏忕鍔ㄦ�佸瓧鑺傛暟缁勬墽琛� Horner锛歯um = num * base + v
+ // num[0] 涓烘渶浣庡瓧鑺傦紝杩涗綅鍚戝熬閮紙楂樹綅锛変紶鎾�
+ QByteArray num(1, '\0');
+ QByteArray input = text.toLatin1();
+ for (int i = 0; i < input.size(); ++i) {
+ int v = charToVal[static_cast<unsigned char>(input.at(i))];
+ if (v < 0) {
+ qWarning() << "ShortCrypto::baseNDecodeVar: invalid character:" << QChar(input.at(i));
+ return QByteArray();
+ }
+ unsigned int carry = static_cast<unsigned int>(v);
+ for (int b = 0; b < num.size(); ++b) {
+ unsigned int cur = (static_cast<unsigned int>(static_cast<unsigned char>(num.at(b))) * static_cast<unsigned int>(base)) + carry;
+ num[b] = static_cast<char>(cur & 0xFF);
+ carry = cur >> 8;
+ }
+ while (carry != 0) {
+ num.append(static_cast<char>(carry & 0xFF));
+ carry >>= 8;
+ }
+ }
+
+ // 杞ぇ绔苟鍘绘帀鍓嶅闆讹紙鍙橀暱妯″紡涓嬪墠瀵奸浂鐨勭湡瀹炰釜鏁扮敱璋冪敤鏂硅ˉ榻愯鍒欐仮澶嶏級
+ std::reverse(num.begin(), num.end());
+ int firstNonZero = 0;
+ while (firstNonZero < num.size() - 1 && num.at(firstNonZero) == 0) ++firstNonZero;
+ return num.mid(firstNonZero);
+}
+
QByteArray ShortCrypto::base85Encode(const QByteArray &data)
{
QByteArray result;
diff --git a/shortcrypto.h b/shortcrypto.h
index f34dcdd..d8306b4 100644
--- a/shortcrypto.h
+++ b/shortcrypto.h
@@ -6,23 +6,25 @@
/**
* @brief 鏈�鐭瘑鏂囧姞瀵嗗伐鍏风被
- * 娴佺▼锛氭槑鏂� 鈫� PKCS7濉厖 鈫� AES-128-CBC鍔犲瘑 鈫� Base85缂栫爜
+ * 娴佺▼锛氭槑鏂� 鈫� PKCS7濉厖 鈫� AES-128-CBC鍔犲瘑 鈫� 绾瓧姣嶇紪鐮侊紙52瀛楃闆嗭級
+ * V3璁稿彲瀵嗛挜鍙︾敤鏃犲~鍏呭彉浣擄紙encryptRaw锛夛紝杈撳嚭绾ぇ鍐�26瀛楃闆�
*/
class ShortCrypto
{
public:
/**
- * @brief 鍔犲瘑
- * @param plaintext 鍘熷鏄庢枃
+ * @brief 鍔犲瘑锛圴2璁惧ID绛夛紝鍚玃KCS7濉厖锛�
+ * @param plaintext 鍘熷鏄庢枃锛堜换鎰忛暱搴︼級
* @param key 16瀛楄妭瀵嗛挜锛圓ES-128锛�
* @param iv 16瀛楄妭鍒濆鍚戦噺锛屽彲涓虹┖锛堝唴閮ㄨ嚜鍔ㄨˉ闆讹級
- * @return Base85缂栫爜鐨勫瘑鏂囧瓧绗︿覆
+ * @return 绾瓧姣嶇紪鐮佺殑瀵嗘枃瀛楃涓诧紙A-Z/a-z锛�52瀛楃闆嗭紝瀵嗘枃姣�48瀛楄妭鈫�68瀛楃锛�
+ * @note 瑙e瘑绔嚜鍔ㄥ洖閫�鍏煎鏃╂湡Base85鐗堝瘑鏂�
*/
static QString encrypt(const QByteArray &plaintext, const QByteArray &key, const QByteArray &iv = QByteArray());
/**
- * @brief 瑙e瘑
- * @param ciphertext Base85缂栫爜鐨勫瘑鏂�
+ * @brief 瑙e瘑锛圴2璁惧ID绛夛紝鍚玃KCS7楠岃瘉锛�
+ * @param ciphertext 绾瓧姣嶇紪鐮佺殑瀵嗘枃锛堝吋瀹规棭鏈烞ase85鐗堝瘑鏂囷紝鑷姩鍥為��锛�
* @param key 16瀛楄妭瀵嗛挜锛圓ES-128锛�
* @param iv 16瀛楄妭鍒濆鍚戦噺锛屽繀椤讳笌鍔犲瘑鏃朵竴鑷�
* @return 鍘熷鏄庢枃
@@ -54,12 +56,19 @@
// 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);
// 浠绘剰杩涘埗鐨勫ぇ鏁扮紪瑙g爜锛堟暣娈靛瓧鑺傚簭浣滀负澶ф暣鏁帮紝鍓嶅闆朵互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
--
Gitblit v1.9.1