389 字
2 分钟
文本加解密
2025-11-28

msbt.seku.su网站文本加解密的实现原理#

1. 核心思路#

  1. 把 UTF-8 字节流拆成 高 4 位低 4 位(每个字节 = 16 进制的高 + 低)。
  2. 给 0–15 这 16 个数字各分配一个「语气词」:
    0 齁 1 哦 2 噢 3 喔 4 咕 5 咿 6 嗯 7 啊
    8 ~ 9 哈 10 ! 11 唔 12 哼 13 ❤ 14 呃 15 呼
  3. 编码:高 4 位 → 取第 1 个词,低 4 位 → 取第 2 个词,拼起来。
    解码:逆过程,先查词得数字,再 (high << 4) | low 还原字节,最后 utf8.decode

2. 完整源码(基于dart)#

import 'dart:convert';
import 'dart:io';
const List<String> _codebook = [
"齁", "哦", "噢", "喔", "咕", "咿", "嗯", "啊",
"~", "哈", "!", "唔", "哼", "❤", "呃", "呼",
];
/// 词 → 数字 的反向索引
late final Map<String, int> _map = Map.fromEntries(
_codebook.indexed.map((e) => MapEntry(e.$2, e.$1)),
);
/// 编码:任意字符串 → 齁哦噢…
String encode(String input) {
final bytes = utf8.encode(input);
final buf = StringBuffer();
for (final b in bytes) {
buf.write(_codebook[(b >> 4) & 0x0F]);
buf.write(_codebook[b & 0x0F]);
}
return buf.toString();
}
/// 解码:齁哦噢… → 原字符串
String decode(String input) {
if (input.length.isOdd) throw FormatException('长度必须为偶数');
final runes = input.runes.toList();
final bytes = <int>[];
for (int i = 0; i < runes.length; i += 2) {
final high = _map[String.fromCharCode(runes[i])];
final low = _map[String.fromCharCode(runes[i + 1])];
if (high == null || low == null) {
throw FormatException('包含非法字符');
}
bytes.add((high << 4) | low);
}
try {
return utf8.decode(bytes);
} catch (_) {
// 如果 UTF-8 非法,退化为 16 进制字符串
return bytes.map((b) => b.toRadixString(16).padLeft(2, '0')).join();
}
}
void main(List<String> args) {
if (args.length != 2) {
print('用法: dart run main.dart <en|de> "文本"');
return;
}
final mode = args[0];
final text = args[1];
try {
print(mode == 'en' ? encode(text) : decode(text));
} catch (e) {
print('错误: $e');
}
}
文本加解密
https://laikmm.top/posts/文本加解密/
作者
Laik
发布于
2025-11-28
许可协议
CC BY-NC-SA 4.0