Rot47 简介
Rot47 是一种基于 ASCII 码的字符替换算法,属于 Rot13 的扩展版本。它将可打印的 ASCII 字符(从 33 '!' 到 126 '~')通过移位 47 位进行替换。与 Rot13 仅处理字母不同,Rot47 支持数字、符号和字母的转换。
Rot47 算法原理
- 字符范围:仅处理 ASCII 值在 33('!')到 126('~')之间的字符。
- 移位规则:
- 对字符的 ASCII 码值加 47。
- 若结果超过 126,则取模后重新映射到 33 开始。
- 公式表示为:
[ \text{rot47}(c) = (c - 33 + 47) \mod 94 + 33 ]
- 自反性:与 Rot13 类似,Rot47 也是自反的,即两次应用会恢复原始文本。
应用场景
- 简单数据混淆:用于临时隐藏文本内容(如配置文件中的敏感信息)。
- 编程挑战:常见于 CTF 比赛或编码练习。
- 避免直接扫描:防止自动化工具直接识别明文关键字。
注意事项
- 安全性低:Rot47 不提供加密,仅作为简单混淆手段。
- 字符支持:不支持非 ASCII 字符(如中文、emoji)。
如需更高安全性,建议使用 AES 等标准加密算法。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/**
* ROT47编码/解码函数
* ROT47对所有可打印ASCII字符(33-126)进行47位旋转:
* ! → P, " → Q, # → R, ..., ~ → }
* 旋转后仍在33-126范围内
*
* 注意:ROT47是对称密码,编码和解码使用相同的算法
*
* @param input 输入字符串
* @return 转换后的新字符串(需调用者释放内存)
*/
char* rot47_transform(const char* input) {
if (!input) return NULL;
size_t len = strlen(input);
char* output = malloc(len + 1); // +1 for null terminator
if (!output) return NULL;
for (size_t i = 0; i < len; i++) {
unsigned char c = input[i];
// 仅处理33-126范围内的可打印ASCII字符
if (c >= 33 && c <= 126) {
// 应用ROT47转换
output[i] = 33 + ((c - 33 + 47) % 94);
} else {
// 非可打印字符保持不变
output[i] = c;
}
}
output[len] = '\0';
return output;
}