389 字
2 分钟
文本加解密
msbt.seku.su网站文本加解密的实现原理
1. 核心思路
- 把 UTF-8 字节流拆成 高 4 位 和 低 4 位(每个字节 = 16 进制的高 + 低)。
- 给 0–15 这 16 个数字各分配一个「语气词」:
0 齁 1 哦 2 噢 3 喔 4 咕 5 咿 6 嗯 7 啊8 ~ 9 哈 10 ! 11 唔 12 哼 13 ❤ 14 呃 15 呼
- 编码:高 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'); }}