本帖最后由 与龙共舞 于 2018-8-15 11:38 编辑
以前小公司嵌入式终端和平台收发数据都是明文,现在我司也加密了。网络数据加密,蓝牙数据加密,昨天看到刷卡RFID的数据也是加密了。
函数:
- void DecryStr(unsigned char* str,unsigned char* key,unsigned char* presult)//解密函数8个字节
- {
- unsigned char subkey[8][8];
- makeKey(key, subkey);
- desData(1,str,presult,subkey);
- conversePermutation(presult);
- }
复制代码 对一个str的解密,第一步是做钥匙(能看懂)第二步是解密(能看懂)主要是利用C=A^B加密 然后C^B就回到A吧。所以A是明文,B是秘钥,C是密文(我自己理解的ASE算法)
第三步就看不懂了,这个是干啥呀,拿出来问问:
- void conversePermutation(unsigned char* inData)
- {
- unsigned char newData[8]={0,0,0,0,0,0,0,0};
- int i;
- for(i=0;i<64;i++)
- {
- if( ( inData[BitCP[i]>>3] & (1<<(7-(BitCP[i]&7))) )!=0 )
- newData[i>>3]=newData[i>>3]|(1<<(7-(i&7)));
- }
- for(i=0;i<8;i++)
- {
- inData[i]=newData[i];
- }
- }
复制代码 看上去就是对一个string倒腾。然后用到了一个常量的数组。
- const unsigned char BitCP[64] =
- { 36, 7, 40, 60, 43, 19, 47, 23,
- 34, 4, 39, 8, 42, 26, 46, 29,
- 33, 1, 38, 16, 57, 18, 51, 28,
- 32, 0, 37, 12, 56, 10, 45, 21,
- 53, 3, 6, 61, 44, 54, 5, 35,
- 15, 48, 55, 58, 20, 22, 31, 25,
- 9, 41, 13, 14, 59, 30, 2, 63,
- 11, 27, 17, 49, 62, 24, 52, 50 };
复制代码 这个数组我看了是0--63的乱序排列。
问题1:这个函数啥意思--------------------具体做啥暂时不知道 是解密的吧 还有多学点english
问题2:string经过这个函数以后就变化了,用什么办法可以还原呢----------有的 看配套的函数
++++++++++++++++++++20180815解答+++++++++++++
昨天看微信文章DES 和3DES 看到图片列在一起 初始转置表--终止转职表 我有突然想起我的这个问题,
解铃还需系的人呀 工程里面果然我也找到了它的配偶,下面是我自己的加密解密,还是不知道叫什么名字。。。。DES吧
- #include<stdio.h>
- #include<string.h>
- typedef unsigned char uint8_t;
- typedef unsigned short uint16_t;
- const unsigned char BitIP[64] =
- { 25, 17, 54, 33, 9, 38, 34, 1,
- 11, 48, 29, 56, 27, 50, 51, 40,
- 19, 58, 21, 5, 44, 31, 45, 7,
- 61, 47, 13, 57, 23, 15, 53, 46,
- 24, 16, 8, 39, 0, 26, 18, 10,
- 2, 49, 12, 4, 36, 30, 14, 6,
- 41, 59, 63, 22, 62, 32, 37, 42,
- 28, 20, 43, 52, 3, 35, 60, 55 };
- const unsigned char BitCP[64] =
- { 36, 7, 40, 60, 43, 19, 47, 23,
- 34, 4, 39, 8, 42, 26, 46, 29,
- 33, 1, 38, 16, 57, 18, 51, 28,
- 32, 0, 37, 12, 56, 10, 45, 21,
- 53, 3, 6, 61, 44, 54, 5, 35,
- 15, 48, 55, 58, 20, 22, 31, 25,
- 9, 41, 13, 14, 59, 30, 2, 63,
- 11, 27, 17, 49, 62, 24, 52, 50 };
- void initPermutation(unsigned char* inData)
- {
- unsigned char newData[8]={0,0,0,0,0,0,0,0};
- int i;
- for(i=0;i<64;i++)
- {
- if((inData[BitIP[i]>>3]&(1<<(7-(BitIP[i]&7))))!=0)
- newData[i>>3]=newData[i>>3]|(1<<(7-(i&7)));
- }
- for(i=0;i<8;i++)
- {
- inData[i]=newData[i];
- }
-
- }
- void conversePermutation(unsigned char* inData)
- {
- unsigned char newData[8]={0,0,0,0,0,0,0,0};
- int i;
- for(i=0;i<64;i++)
- {
- if( ( inData[BitCP[i]>>3] & (1<<(7-(BitCP[i]&7))) )!=0 )
- newData[i>>3]=newData[i>>3]|(1<<(7-(i&7)));
- }
- for(i=0;i<8;i++)
- {
- inData[i]=newData[i];
- }
- }
- unsigned char str[8]={0xF6,0x56,0x21,0x33,0x9E,0x25,0x29,0xD3};
- int main(void)
- {
- int i;
- for(i=0;i<8;i++) printf("%02X ",str[i]); printf("\n");
- initPermutation(str);
- for(i=0;i<8;i++) printf("%02X ",str[i]); printf("\n");
- conversePermutation(str);
- for(i=0;i<8;i++) printf("%02X ",str[i]); printf("\n");
- return 0;
- }
复制代码 F6 56 21 33 9E 25 29 D3
0D 9C 16 78 0E 8F 6F 1D
F6 56 21 33 9E 25 29 D3
[Finished in 4.5s]
|
这个函数简单来说就是把字符串给你打乱了,做简单的加密,既然加密算法你都知道了,直接还原肯定不是难事。
简单的分析认为,这个InData应该是一个8字节的数据,经过处理后,就变成了另外的一个8字节数据了。
通常有两种方法:
一种是暴力枚举,这个加密算法比较友好,原字节和新字节都是一一对应的,所以找到0x00-0xff与之对应的每一个新字符,然后反向查找即可,不过建立这个的前提是,原字节和新字节应该是一一对应的关系,不允许存在类似 0x12和0x33都对应0x78这种问题。
另一种方法就是深入的算法攻击,相当于是求解这个加密函数的逆函数,同样需要存在一一映射关系。先拿第一种方法做测试:
这段代码的目的是计算0x00-0xff之间对应的所有新字符,结果如下:
评分
查看全部评分
这个循环挺高级的 0--0xff的双循环
所以现在是成功做了一个对应关系表吗 0--0xff和右边对应起来 但是多对一的情况出现了
评分
查看全部评分