【加解密与C】Rot系列(四)Rot47

Rot47 简介

Rot47 是一种基于 ASCII 码的字符替换算法,属于 Rot13 的扩展版本。它将可打印的 ASCII 字符(从 33 '!' 到 126 '~')通过移位 47 位进行替换。与 Rot13 仅处理字母不同,Rot47 支持数字、符号和字母的转换。

Rot47 算法原理

  1. 字符范围:仅处理 ASCII 值在 33('!')到 126('~')之间的字符。
  2. 移位规则
    • 对字符的 ASCII 码值加 47。
    • 若结果超过 126,则取模后重新映射到 33 开始。
    • 公式表示为:

      \\text{rot47}(c) = (c - 33 + 47) \\mod 94 + 33

  3. 自反性:与 Rot13 类似,Rot47 也是自反的,即两次应用会恢复原始文本。

应用场景

  • 简单数据混淆:用于临时隐藏文本内容(如配置文件中的敏感信息)。
  • 编程挑战:常见于 CTF 比赛或编码练习。
  • 避免直接扫描:防止自动化工具直接识别明文关键字。

注意事项

  • 安全性低:Rot47 不提供加密,仅作为简单混淆手段。
  • 字符支持:不支持非 ASCII 字符(如中文、emoji)。

如需更高安全性,建议使用 AES 等标准加密算法。

cpp 复制代码
#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;
}
相关推荐
yashuk20 分钟前
C语言 vs. C++ ,哪个更适合初学者?
c语言·c++·面向对象编程·初学者·学习路径
泛凡(Linyongui)1 小时前
PY32F002B实践之四--宠物腹背理疗仪项目踩坑及项目总结复盘
c语言·keil·32位单片机·腹背理疗仪项目实践·普苒py32
Hello小赵1 小时前
C语言如何自定义链接库——编译与调用
android·java·c语言
JaneHan_1 小时前
STM32CubeMX+HAL+Keil5 PWM呼吸灯
c语言·stm32·单片机
爱编码的小八嘎2 小时前
C语言完美演绎7-7
c语言
来日可期13142 小时前
C/C++ 反常识记录(1)—— 那些容易踩坑的语法细节
c语言·开发语言·c++
计算机安禾2 小时前
【数据结构与算法】第41篇:图论(五):拓扑排序与关键路径
c语言·数据结构·c++·算法·图论·visual studio
itman3012 小时前
Windows环境下编译运行C语言程序的方法及工具选择
c语言·visualstudio·mingw·编译器·windows环境
yong15858553433 小时前
Linux C++ 中的 volatile变量在多线程环境下进行运算的问题
c语言·c++
♛识尔如昼♛3 小时前
C 基础(7) - 字符输入/输出和输入验证
c语言·开发语言