2012年7月31日星期二

浅谈Oii通讯的加密算法

 
 

satan 通过 Google 阅读器发送给您的内容:

 
 

于 12-7-30 通过 SNEEZRY 作者:sneezry

昨天再次听说有人因为在QQ上散播不和谐信息而被拘留,在对政府滥用权力窥视用户隐私表示愤慨之外,我觉得应该保证用户的通讯安全,所以我对Oii的数据进行了加密。起初想使用RSA 1024bit进行加密,但是怎奈Javascript可以查看源码,私钥也就无从谈起了。后来想来想去,想出了个野路子,感觉还不错,所以拿出来和大家分享。

要解决开源应用私钥的问题,就只能动态生成私钥。由于Oii是基于频道的通讯应用,所以利用频道名动态生成私钥的方法可行。

首先Oii进行通讯的频道名并不是用户所设置的频道名,而是通过加密后得到的,加密算法为md5(md5(channel)+channel)循环加密10次得到的,这样当进行通讯时,监听路由是无法得知用户设定的频道名的。

之后计算私钥。首先对频道名通过另一算法加密,加密算法为md5(base64(channel))+base64(channel))循环加密10次得到的,加密后得到32位包含数字和字母的字符串,将每一位进行拆分,生成一个含有32个元素的数组,之后按照36进制将每一个元素转换成10进制,然后将所有元素相加得到和sum,并将每一个元素与sum相乘后加1503,再将数组接到数组本身后面形成一个包含64个元素的数组p。

令pubkey='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=',并将字符串每一位作为一个元素得到一个数组q,再声明一个新数组pkey,并计算rnd=p[i]%q.length,令pkey[i]=q[rnd],并将q[rnd]从q中删除,i从0循环到63,每循环一次q.length减一,直到最后q数组被清空,新的排列被保存到pkey中,最后将pkey转换为字符串,代替传统base64编码的私钥编码消息。

由于政府监视路由只能得到频道名的暗码,所以无法计算出私钥pkey,从而无法解码消息。对于频道名,Oii自带的随机生成频道名功能能生成14到18位的包含大小写字母及数字的频道名,几乎无法凭借猜测破解。

p.s. 这篇博文是我用iPad写的,很辛苦,这点一定要说明下~


 
 

可从此处完成的操作:

 
 

没有评论:

发表评论