{"service":"entropy-cipher","summary":"用只有双方知道的字符表把文本编码成汉字密文，或把汉字密文还原成明文。","instructions":"字符表即密钥：先 build_table 拿到表与指纹，双方核对一致后再 encrypt / decrypt。两种模式：字节级传 source（字符表文本，双方各持一份）；词级 mode=word 只需一个种子或一个 session 会话串（口令 + 词表指纹 + 掩码标记），约定成本最低。起一段新约定：generate_phrase（或 POST /api/phrase）一次给出可念的口令、念读版与会话串，ttl_minutes 给会话串定有效期。群发：encrypt 传 recipients 数组，同一段明文按各人自己的会话串各加密一份。预检：encrypt / decrypt 传 dry_run=true 只回校验结果，不出密文或明文。认领：decrypt 传 sessions 数组逐个试解；confidence=single 表示只有一条能解出（就是发给你的），multiple 时把候选都列出来按语义确认。体检：check_session 看一份约定对不对；identify_table 看字符表来自哪个内置经典；self_check 把整条链路跑一遍确认环境健康。资源：entropy://endpoints（端点目录）、entropy://agent-kit（上手包）、entropy://recipes（照抄即可的配方）、entropy://skill（技能包正文）、entropy://tables/index 与 entropy://tables/<key>（内置字符表）。字符表与口令本身就是密钥，不要写进公开日志、提交记录或对话摘要。先读资源 entropy://index —— 那是这个服务的地图（工具、提示词、资源、端点、隐私承诺、从哪开始）；照抄即可的配方在 entropy://recipes。","modes":{"byte":{"key":"source","key_description":"一段双方各自持有的字符集文本（表即密钥）","ciphertext":"逐字节换成汉字，标点原样","agreement_cost":"传一段文本 + 核对指纹"},"word":{"key":"seed","optional_key":"words（自定义词表，双方必须一致，指纹会覆盖它）","key_description":"一个种子串，或带校验位的口令（seed_phrase）","ciphertext":"中文部分是替换后的常用词，读起来像中文；非中文走符号层","agreement_cost":"只传一个种子或口令"}},"workflow":["1. build_table（词级传 seed，字节级传 source）→ 拿到 fingerprint","2. 把 fingerprint 给对方核对；不一致就停，任何解密结果都不可信","3. encrypt / decrypt；批量用 items 数组（最多 50 条，单条出错不影响整批）","3b. 词级模式也可以直接传 session（EC1:口令:词表指纹:掩码），响应给出 session 与 share_link","3c. 要起一段新的词级约定：先 generate_phrase（或 POST /api/phrase）拿到口令与念读版，再发给对方","4. 想先预检就加 dry_run: true —— 只回校验结果，不回密文或明文","5. 群发用 recipients 数组：同一段明文按各人自己的会话串各加密一份（每人可带自己的措辞）","6. 照抄配方：MCP 资源 entropy://recipes（或 /skills/entropy-cipher/references/recipes.md）"],"mcp":{"http":"POST /api/mcp（JSON-RPC 2.0，协议 2025-06-18）","stdio":"python mcp/server.py","tools":["build_table","encrypt","decrypt","identify_table","identify_sender","check_session","self_check","generate_phrase"],"resources":["entropy://tables/index","entropy://tables/<key>","entropy://index","entropy://endpoints","entropy://agent-kit","entropy://recipes","entropy://events","entropy://self-check","entropy://skill"],"prompts":["encrypt_text","decrypt_text","share_link","group_chat","encrypted_call","start_agreement","claim_cipher","troubleshoot"]},"http_endpoints":{"POST /api/encrypt":{"text":"或 items[]","source":"字节级必填","mode":"dedup|hash|raw|word","seed":"词级","seed_phrase":"词级口令","n":256,"amb":16,"mask":false},"POST /api/decrypt":{"cipher":"或 items[]","source":"字节级必填","mode":"dedup|hash|raw|word","seed":"词级","seed_phrase":"词级口令","n":256,"amb":16,"mask":false},"POST /api/identify":{"fingerprint":"8 位","source":"或原文"},"POST /api/phrase":{"ttl_minutes":"有效期（分钟），0 表示永久","words":"可选自定义词表"},"POST /api/encrypt（群发）":{"text":"同一段明文","recipients":[{"session":"EC1:..."}]},"POST /api/decrypt（认领）":{"cipher":"收到的密文","sessions":["EC1:..."]},"会话串体检":{"tool":"check_session","arguments":{"session":"EC1:..."},"http":"POST /api/session-check"},"部署自检":{"http":"GET /api/self-check","returns":"{ok, steps:[{name, ok, detail, ms}]}"},"GET /api/stats?format=csv":"埋点聚合计数的 CSV 导出（event,date,count）","POST /api/event":{"name":"事件名","props":{}},"GET /api/stats":"埋点聚合计数，只对同源请求开放"},"examples":[{"call":"POST /api/encrypt","body":{"text":"我的微信是 ABCD1234","source":"<双方约定的字符集文本>","mode":"dedup"}},{"call":"POST /api/encrypt","body":{"text":"我的微信是 ABCD1234","mode":"word","seed_phrase":"芦苇-湖泊-9066-0MKN"}},{"call":"POST /api/encrypt","body":{"text":"甲方乙方","mode":"word","seed":"abc","words":"甲方 乙方"}},{"call":"POST /api/encrypt","body":{"items":[{"text":"甲","source":"<字符集>"},{"text":"乙","mode":"word","seed":"abc"}]}}],"scenarios":[{"id":"share_link","title":"把一个链接藏进普通中文里","mode":"byte","why":"链接本身就要完全不可读，逐字节换字最直接。","steps":["build_table（传 source）→ 核对指纹","encrypt → 把密文粘进别处","对方用同一张表解密"],"tools":["build_table","encrypt","decrypt"],"note":"字符表必须双方各持一份；公开经典当表强度有限。"},{"id":"group_chat","title":"群聊里说一句只有某个人能懂的话","mode":"word","why":"词级模式密文读起来像中文，平台看不出异常；约定成本只有一个口令。","steps":["make 一条会话串（或 build_table 传 seed）→ 核对指纹","encrypt（可带 recipients 给每人不同措辞）","对方用 check_session 体检后 decrypt"],"tools":["encrypt","check_session","identify_sender"],"note":"词级模式下错的会话串也能解出一段像中文的文本（用词频率几乎一样），所以接口不猜赢家：能解出的候选全列出并标出差异，由语义确认。"},{"id":"call","title":"加密通话（双方各自持表）","mode":"byte","why":"对话内容敏感且不能像乱码，按字节换字最不容易被平台注意到异常。","steps":["双方线下约定字符表并核对指纹","每条消息单独 encrypt（可开掩码）","对方 decrypt"],"tools":["build_table","encrypt","decrypt"],"note":"开掩码能摧毁重复模式，但表与掩码流必须双方一致。"},{"id":"bulk","title":"一次处理多条消息","mode":"any","why":"批量接口一次最多 50 条，单条出错不拖垮整批。","steps":["encrypt / decrypt 传 items 数组","认领用 sessions 数组逐个试解"],"tools":["encrypt","decrypt","identify_sender"],"note":"每条可以带自己的 source 或 session，互不影响。"}],"caveats":["算法公开，安全性只来自字符表/种子的私密性与明文里的不可猜成分","明文里建议放一段随机串或暗语，攻击者的候选空间才会按 2^n 增长","公开经典当表强度有限；需要私密表就用双方自己持有的文本","这不是标准加密，高风险通信请用 Signal / WireGuard / age","不要把字符集或口令写进公开日志、提交记录或对话摘要"],"troubleshooting":[{"symptom":"密文解不出来","faq_key":"decrypt_failed","tool":"check_session","endpoint":"/api/session-check","cause":"字符表或会话串不对，或者密文在复制时掉了字。","fix":"双方各自核对一次指纹；指纹一致还解不开，多半是密文被改过 —— 从原处重新复制，别经过会替换字符的地方。"},{"symptom":"两边指纹对不上","faq_key":"fingerprint_mismatch","tool":"build_table","endpoint":"/api/encrypt","cause":"字符表文本差了一个标点、空格或换行；词级模式下则多半是自定义词表不一致。","fix":"指纹算的是全文，差一个字就不同。把双方用的那份文本逐字比一遍；词级模式还要确认词表也一样（词表指纹会算进模式指纹）。"},{"symptom":"认领时好几条会话串都能解出文本","faq_key":"claim_ambiguous","tool":"identify_sender","endpoint":"/api/decrypt","cause":"词级模式的特点：错的会话串也会解出一段像中文的文本（词按同长度、同词频档置换，用词频率几乎一样）。","fix":"看语义确认：哪一条读起来像人话，那条才是发给你的。要硬信号就用字节级模式 —— 字节层解不出合法 UTF-8，就说明字符表不对。"},{"symptom":"密文里混着一串看不懂的符号","faq_key":"entropy_symbols","tool":"encrypt","endpoint":"/api/encrypt","cause":"多半是你自己加的随机熵（暗语）—— 它就是用来让攻击者猜不到的。","fix":"别删。删了就少了一层成本。但复制密文时一个字符都不能少。"},{"symptom":"会话串突然失效了","faq_key":"session_expired","tool":"generate_phrase","endpoint":"/api/phrase","cause":"它是 EC2 开头的话，说明这段约定带有效期，过期后是直接解不了，不是提示一下。","fix":"重新起一段约定（generate_phrase 再来一次）。要长期有效就用 EC1。"},{"symptom":"打开配置链接说词表指纹不一致","faq_key":"config_words","tool":"check_session","endpoint":"/api/session-check","cause":"词表太长，配置链接带不动（链接里会标成 wx=1）。","fix":"把词表手动贴进「自定义词表」框，或改用不带自定义词表的会话串。"}],"skill_package":{"path":"/skills/entropy-cipher/","files":["SKILL.md","scripts/ec.py","references/endpoints.md","references/mcp.md","references/recipes.md"],"cli":"python scripts/ec.py encrypt --text \"...\" --seed \"...\"（--api 走接口，不给就用本地内核）","note":"技能包整份可从站点下载，Agent 装 skill 时直接取 SKILL.md。"},"files":{"openapi":"/api/openapi.json","llms":"/llms.txt","llms_full":"/llms-full.txt","capabilities":"/.well-known/capabilities.json","skill":"/skills/entropy-cipher/SKILL.md","skill_cli":"/skills/entropy-cipher/scripts/ec.py","skill_refs":"/skills/entropy-cipher/references/","web_app":"/app.html"},"endpoints":{"GET /api/agent-kit":{"purpose":"上手包：能力、场景、工作流、坑","summary":"给 AI 助手的上手包：模式、工作流、端点、示例与注意事项","tags":["agent"],"params":{},"query":{"scenario":"只返回某个场景（可选）"},"example":"GET /api/agent-kit?scenario=group_chat"},"GET /api/endpoints":{"purpose":"本目录本身：每个端点的用途、参数与示例","summary":"给 Agent 的机器可读端点目录","tags":["agent"],"params":{},"query":{},"example":"GET /api/endpoints"},"GET /api/self-check":{"purpose":"端到端自检：建表→加密→解密→会话串→词级往返→认领→识别→吞吐，逐项返回结论与耗时","summary":"端到端自检：把整条链路跑一遍，逐项返回结论与耗时","tags":["ops"],"params":{},"query":{},"example":"GET /api/self-check"},"GET /api/health":{"purpose":"存活检查","summary":"健康检查","tags":["ops"],"params":{},"query":{},"example":"GET /api/health"},"GET /api/stats":{"purpose":"埋点聚合计数（事件名→次数）与关键路径（产品动作链每步的计数与比例）。只对同源请求开放，运维可用 X-Stats-Token 头","summary":"埋点聚合视图：只有事件名与计数，无内容、无 IP、无 UA","tags":["analytics"],"params":{},"query":{"format":"csv 返回 CSV（event,date,count）"},"example":"GET /api/stats?format=csv"},"POST /api/encrypt":{"purpose":"加密：字节级传 source，词级传 session/seed；支持 items 批量与 recipients 群发","summary":"明文加密为汉字密文","tags":["core"],"params":{"text":"明文","source":"字符集文本（字节级）","preset":"内置字符集名（字节级，替代 source）","lang":"输出语言（不传 source 时按语言建默认表：zh/ja/ko/en/ru/ar/el/he/th/hi）","session":"会话串（词级，自动切词级模式）","seed":"种子（词级）","seed_phrase":"口令（词级）","words":"自定义词表","mode":"dedup|hash|raw|word","n":"表长","amb":"歧义槽","mask":"是否开掩码","ttl_minutes":"会话串有效期","items":"批量数组","recipients":"群发数组","dry_run":"只校验不出密文"},"query":{},"example":"{\"text\":\"我的微信是 ABCD1234\",\"session\":\"EC1:芦苇-湖泊-9066-0MKN::-\"}"},"POST /api/decrypt":{"purpose":"解密；传 sessions 数组即可认领（逐个会话串试解）","summary":"汉字密文还原为明文候选","tags":["core"],"params":{"cipher":"密文","source":"字符集文本","preset":"内置字符集名","lang":"输出语言（不传 source 时按语言建默认表）","session":"会话串","sessions":"候选会话串数组","seed":"种子","seed_phrase":"口令","words":"自定义词表","mode":"dedup|hash|raw|word","n":"表长","amb":"歧义槽","mask":"是否开掩码","items":"批量数组","dry_run":"只校验能不能解出来"},"query":{},"example":"{\"cipher\":\"<密文>\",\"sessions\":[\"EC1:芦苇-湖泊-9066-0MKN::-\"]}"},"POST /api/phrase":{"purpose":"生成一份能念的口令：口令、实际种子、念读版、会话串与模式指纹一次给全","summary":"生成可念的口令：口令、种子、念读版、会话串、模式指纹","tags":["word"],"params":{"ttl_minutes":"会话串有效期（分钟），0 表示永久","words":"可选：自定义词表原文（会进指纹）"},"query":{},"example":"{\"ttl_minutes\": 30}"},"POST /api/identify":{"purpose":"识别字符集来源：给指纹或原文，返回是哪个内置经典还是自定义表","summary":"识别字符集来源：给 8 位指纹或原文","tags":["core"],"params":{"fingerprint":"8 位十六进制","source":"或原文"},"query":{},"example":"{\"fingerprint\":\"CFDE52D2\"}"},"POST /api/session-check":{"purpose":"会话串体检：校验位过不过、词表指纹对不对、生效种子、念读版、有效期","summary":"会话串体检：校验位过不过、词表指纹对不对","tags":["word"],"params":{"session":"会话串","sessions":"批量数组","words":"自定义词表"},"query":{},"example":"{\"session\":\"EC1:芦苇-湖泊-9066-0MKN::-\"}"},"POST /api/event":{"purpose":"第一方埋点：只记事件名与日期","summary":"第一方埋点：只记事件名与日期","tags":["analytics"],"params":{"name":"事件名","props":"附加字段（可选）"},"query":{},"example":"{\"name\":\"demo_encrypt\"}"},"POST /api/mcp":{"purpose":"MCP 服务器（JSON-RPC 2.0）：tools/list、tools/call、resources/list、prompts/list","summary":"MCP 服务器（JSON-RPC 2.0）","tags":["agent"],"params":{"jsonrpc":"固定 2.0","id":"请求编号","method":"tools/list、tools/call、resources/list、resources/read、prompts/list、prompts/get"},"query":{},"example":"{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"tools/list\"}"}}}