网站建设平台招商,百度多长时间收录网站,网站策划书模板范文,免费注册的网站博主在刷题过程中遇上这样一个有意思的加密#xff08;如下图#xff09;#xff0c;苦苦思索其逆向运算#xff0c;被硬控了很久#xff0c;也没搜到什么资料来解释这个问题#xff08;也许是太简单#xff1f;#xff1f;蒟蒻博主怀疑人生……#xff09; 经过博主不… 博主在刷题过程中遇上这样一个有意思的加密如下图苦苦思索其逆向运算被硬控了很久也没搜到什么资料来解释这个问题也许是太简单蒟蒻博主怀疑人生…… 经过博主不断猜想、写代码验证再配合已有的位运算知识也算是总结出一些规律 直接先上结论这个加密是伪对称加密其解密就是加密本身 此处的伪对称加密指的是使用该函数加密、再解密的结果只有映射到ASCII表中才是对称的即仅对字符数组满足对称加密 一加密特征
本文标题其实已经揭露了该加密的特征就是(x4) | (x 4)
注意这里的4很有可能被题目以其它等价运算的形式表现出来例如4改成*164改成/16等等
博主目前只遇到过左右移4的情况但经过测试发现位移操作数若是(4,8,12,16,24)这里面的数也满足对称加密但要注意的是左右移的操作数应为同一个数即不能是(x4) | (x8)这样的情况左右移争对的是两个不同的数
注32也满足但按照位移运算的定义左右移32位对于32位整数来说相当于未操作因此不列入 结论若f(x)(xshift) | (xshift)且shift属于集合(4,8,12,16,24)则f(x)的结果映射到ASCII表(0,127)中是对称加密。 二伪对称验证
#include bits/stdc.h
using namespace std;
int func(int x) {int shift 4;return (x 8) | (x 8);//4,8,12,16,24
}
int main() {int x 99;cout 明文: x (char)x endl;x func(x); //加密cout 密文: x endl;x func(x); //解密cout 二次加密(伪明文): x endl;cout 伪明文%128: x % 128 (char)(x % 128) endl; //将解密得到的伪明文%128映射到ASCII码表return 0;
} 因此在逆向分析过程中遇到满足此特征的加密即可认为是伪对称加密可直接使用原函数进行解密但要牢记的是解密得到的结果应该%128映射到ASCII码表才是正确明文 三证明过程
博主不是什么专业的密码学或数学学者只能从位运算的本质出发通过对比加解密后的结果与明文的差异来得出结论
或运算的规则同位有1则1同位都0则0 函数f(x)(x4) | (x4) 明文 0000 0000 0000 0000 0000 0000 0001 0000 ①明文4: 0000 0000 0000 0000 0000 0001 0000 0000 ②明文4: 0000 0000 0000 0000 0000 0000 0000 0001 ①|② 0000 0000 0000 0000 0000 0001 0000 0001 -此时完成加密得到密文 c密文40000 0000 0000 0000 0001 0000 0001 0000 d密文40000 0000 0000 0000 0000 0000 0001 0000 c|d 0000 0000 0000 0000 0001 0000 0001 0000 -此时完成解密得到伪明文 此时我们重点关注被f(x)加密再解密的结果与明文的差异 明文 0000 0000 0000 0000 0000 0000 0001 0000 c|d 0000 0000 0000 0000 0001 0000 0001 0000伪明文 明文的十进制值为16伪明文的十进制值为4112满足4112%12816 从它们的二进制值也能直观看出伪明文与明文仅差在第13位红色部分而128等于2的8次方因此模128的结果只会剩下最后8位绿色部分也就和明文一致了 根据该思路不难证明当shift属于集合(4,8,12,16,24)中的数时均满足此规律此处便不再赘述