原理:
XOR加密利用了两次异或操作仍为原值的特性。通过一个密钥,将明文与密钥进行异或操作,从而对明文加密,解密时再将密文与密钥进行一次异或操作就能恢复出明文。
原字符串src_str,长度src_len
Base字符串base_str,长度base_len
Key字符串key_str,长度key_len
加密后字符串dst_str
基于base字符串生成key字符串,如果base_len小于等于src_len,则从base_str截取src_len的长度作为key字符串;如果base_len大于src_len,则将base_str循环生成src_len长度的key字符串。将原字符串与key字符串的对应字符异或处理,得到字符串dst_str,长度与原字符串相同。
例如:
Base字符串:abcdef
原字符串:dddd
则key字符串:abcd
Base字符串:abcdef
原字符串:啊啊啊啊
则key字符串:abcdefab
C++实现
std::string xorString(std::string baseStr, std::string keyStr) {int len = baseStr.length();std::string result;for (int i = 0; i < len; i++) {result += (baseStr[i] ^ keyStr[i]);}return result;
}std::string string_splice(std::string baseStr, int srcLen) {std::string result;int len = baseStr.length();for (int i = 0; i < srcLen; i++) {result += baseStr[i % len];}return result;
}int main()
{std::string baseStr = "abcdefg";std::string srcStr = "衙优涨桌";int srcLen = srcStr.length();std::string keyStr = string_splice(baseStr, srcLen);std::cout << xorString(srcStr, keyStr); // 输出 啊啊啊啊
}
Oracle Sql实现
原字符串中含有中文,Oracle获取原字符串长度使用lengthb
UPDATE test_table SET test_field = utl_raw.cast_to_varchar2((UTL_RAW.BIT_XOR(RAWTOHEX(test_field), RAWTOHEX((SELECT RPAD('abcdef', lengthb(test_field), 'abcdef') FROM DUAL)))));