按位循环移位加密是将字符串中每个字符的8位二进制表示整体左或右循环移动指定数位,移出位补至另一端,再转回字符;它非标准加密算法,仅用于教学、混淆或轻量级obfuscation,需对每个unsigned char手动位运算实现,避免符号问题与数据丢失。

什么是按位循环移位加密
按位循环移位不是标准加密算法,它本质是把字符串每个字符的二进制表示(通常是8位)整体左或右循环移动若干位,再转回字符。它不提供实际安全强度,但常用于教学、混淆或轻量级 obfuscation 场景。关键点在于:必须对每个 char 单独做位移,且是「循环」——移出的位要补到另一端,不能丢弃。
用 std::rotate 处理字节太重,直接位运算更合适
std::rotate 作用于容器,不适合单个字节的位级循环;硬套会引入不必要的 vector 或 bitset 开销。正确做法是对每个 unsigned char 手动实现循环移位。注意:char 有符号,负值右移行为未定义,必须先转为 unsigned char。
- 左循环移位 n 位:
(c > (8 - n)),其中c是unsigned char - 右循环移位 n 位:
(c >> n) | (c - n 必须取模 8(
n %= 8),否则位移超界结果不可靠 - 移位前强制类型转换:
unsigned char uc = static_cast<unsigned char>(s[i])</unsigned>
如何避免常见错误:符号扩展和截断
直接对 char 做位移时,编译器可能将其提升为 int,若原值为负(如 \xFF 在有符号 char 下是 -1),高位会被符号扩展,导致 (c 得到 <code>0xFFFFFFFE 这类 32 位值,再取低 8 位就错乱了。
- 错误写法:
s[i] = (s[i] > 7) - 正确写法:
unsigned char uc = s[i]; s[i] = static_cast<char>((uc > 7))</char> - 务必用
static_cast<char></char>回填,否则赋值时可能触发编译警告或隐式截断 - 如果输入是
std::string,其内部存储是char,所以输出仍需保持char类型
完整可运行示例(含左右方向与位数控制)
下面函数对字符串原地做右循环移位(可改左),位数由 shift 控制,自动处理模 8 和符号问题:
立即学习“C++免费学习笔记(深入)”;
void circularShiftRight(std::string& s, int shift) {
if (s.empty()) return;
shift %= 8;
if (shift == 0) return;
for (char& c : s) {
unsigned char uc = static_cast<unsigned char>(c);
c = static_cast<char>((uc >> shift) | (uc << (8 - shift)));
}
}
调用示例:circularShiftRight(s, 3) 对 "AB" 中每个字符右移 3 位。注意:该操作可逆,反向移位即可解密 —— 但别指望它防得住任何真实攻击。
真正容易被忽略的是:位移方向和字符编码假设。这段代码默认按 8 位字节处理,对 UTF-8 多字节字符会破坏编码结构,只适用于 ASCII 或单字节编码文本。


















