我对于各种厂商提供的对接文档提过很多次,说大家的文档写的不好。直到昨天看了友商给的文档,跟研发的小姐姐调代码调到半夜十二点,才发现还是高估了这些人的水平。
文档内容不够详细,我忍了。实例代码不全,我也忍了。测试设备对于错误二维码没有反馈,我也忍了。你们 tmd 给的加密算法都是错的让我怎么忍?
咱们来还原下事情经过,昨天有个设备着急上线,根据之前厂商给的对接文档已经对接玩了,就剩下现场测试。等我带人带设备去测试的时候发现对应的项目没有给密钥。在群里问他们要密钥,结果直接扔了个文档过来,告知,他们的算法升级了!
艹,你他妈的说升级就升级,升级这么久了连个 p 都不放。我们要上线了,你跟我说升级了?我可去你妈的!
升级就升级吧,我忍了,看了下文档并不复杂。写后端的小姐姐对于加密这一块不是很熟练,于是作为一个全栈程序媛,只好带着小姐姐写二维码字符串的生成算法。
虽然不是很专业,但是拿到文档之后一个多小时也基本把算法集成完了。
又屁颠屁颠的跑到项目上测试,结果能改的参数配置都改了,设备就是不识别。在群里咨询,沙雕们也是爱答不理的,给他们老板打了个电话,让他们配合下,也没什么卵用,真 tm 垃圾。这尼玛就离谱了啊,在现场折腾了两个小时无果之后。准备回公司再研究一下,走之前给项目经理打了个电话,告知二维码不好使,他说他有能用的二维码。然后给我发了一个。
唉,你别说,还真 tm 是好使的。
既然有了能用的二维码,那么就可以对比下看看到底是哪里的问题了。
想着算法既然基本都是异或加密,那么两次异或之后就得到原来的字符串了,直接把二维码加密后的字符串扔进去,果然拿到了明文信息。对比了一下给的各种参数没有发现错误。
但是自己想要把字符串加密回去却怎么也做不到,数组开始第一个加密之后就是错的。为了对比是哪里的问题,连计算器都用上了,算到底是不是自己简单的数值运算都有问题。尝试多次之后怎么也得不到他们二维码上的字符串,让我一度怀疑数学不存在了。同样的东西加密之后竟然结果不一样,但是竟然还能解密回去,怎么有这种事情?
当然,这个世界上在计算机领域出现玄学事件的概率不大,尤其是多次出现。开发小姐姐给拿了个本子说,你画一下加密和解密流程。是不是哪里取得数值不对?
拿到本子之后,简单的画了一下,理清楚了:这个解密过程,除了第 25 个,其他的都是直接用原来的 25 个数值参与了异或运算。第二十五个直接跟 0xaa 异或了。
那么要加密数据,应该先对地 25 个进行异或,然后对其他的数据在进行处理(这个在解密字符串的时候就该想到了,不过折腾了一晚上脑子有点迷糊了),到这里基本就理清楚逻辑了。也就是说,他们文档里给的加密代码实际是设备上的解密代码,而加密代码根本就 tm 的没给!!!
这真是高级啊,第一次见文档还能这么写的。真是小刀拉屁股了。如果没有项目经理给的那个二维码,就用他们这个加密算法去生成控制二维码,哪怕宇宙爆炸了也算不对!
艹,会写文档就好好写,不会写就 tm 别瞎写好吗?真 tm 傻吊!艹!让自己白白多浪费了四五个小时!
15:50后续,哼唧唧,不开心呢。跟老板反馈了人家也不承认啊,说代码没问题。哦吼,这就很棒呢,就喜欢嘴硬的。
哎,多年不写 C 语言的代码了,这逼着我又跑了一遍 C 语言的代码:
/****************************************************************************** Online C Compiler. Code, Compile, Run and Debug C program online. Write your code in this editor and press "Run" button to compile and execute it. *******************************************************************************/ #include <stdio.h> void encryptData(int *encryptBuff,int *sourceBuff) { int i; for(i = 0;i<28; i++) { if(i == 24) { *(encryptBuff + 24) = *(sourceBuff + 24) ^ 0xbb; } else { *(encryptBuff + i) = *(sourceBuff+ i) ^ *(sourceBuff + 24) ^ 0x44 ^ i ^ 0Xbb; } } } int main() { int source[28] ={0XAA,0xbb,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x55,0x55,0x55,0x55, 0xab,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e}; int enc[28]; encryptData(enc,source); int i; printf("原始数组 = "); for (i = 0; i<28; i++) printf("%x ", source[i]); printf("\r\n第一次加密 = "); for (i = 0; i<28; i++) printf("%x ", enc[i]); int reenc[28]; encryptData(reenc,enc); printf("\r\n第二次加密 = "); for (i = 0; i<28; i++) printf("%x ", reenc[i]); return 0; }
为什么要酱紫呢? 上面代码没有本地编译器可以通过这个地址在线运行:https://www.onlinegdb.com/online_c_compiler
以我浅薄的计算机常识理解,加密循环 100 次也还原不了。谁要是能实现了,姐姐我奖励 100 快钱~~
70 comments