首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > JavaScript >

几个文字加密的 JS 精简算法(续2)-进制乱序法

2012-10-06 
几个文字加密的 JS 简洁算法(续2)--进制乱序法续前一篇博文《几个文字加密的简洁算法和一些个人的想法》——字

几个文字加密的 JS 简洁算法(续2)--进制乱序法
续前一篇博文《几个文字加密的简洁算法和一些个人的想法》——字符平移法
以及上一篇博文《几个文字加密的简洁算法(续)》——字符错位法
这里提供第三种加密方法——对字符 Unicode 值 的 “进制转换” 法

先说点废话……

0x7a 是英文小写字母‘z’的编码值,这是编码规范规定的,机器知道,程序员也知道。
0x7a 是十进制 122——这,为什么呢? ……因为

十六进制是由 0123456789abcdef 十六个字符来表达的,并且,a 代表 10、b 代表 11,以此类推。122 用十六进制转换下来就是 7a。so…… 单纯的进制转换其实是不能实现加密的

但是,如果 a 不代表 10,b 不代表 11,9 代表的是 0 或其它呢——也就是说,进制表中各字符所代表的值是 随机 的,不符合常规约定,那…… 7a 代表什么呢?  你无法知道,机器也不可能明白!

所以,如果指定一个字符 随机排列 的进制表,依此转换字符编码值,那除非你有那个原始的进制表,否则你是无法知道 7a 是哪个字符的值(即:0x7a != 122)。

“进制乱序法”——这里,随机排布的进制表就是密钥

根据 Unicode-16 的编码规范,CJK 字符集中 20902 个汉字的编码值在 65535 以内(即 2 的 16 次方),如果用十六进制表示,每个字需要4个进制字符表达,1 变 4! 密文增加得太多了,不划算! 折中,取 3 个进制字符表达,需要 41 进制 才能涵盖 65535 的码值(41*41*41 = 68921 > 65535)。

原则上,进制表字符可以采用任意 8 bit 字符,但考虑通用性,以及字符在各种网络上的正常传输,这里仅采用英文字符 a-z,和 A-Z,区分大小写共 52 个字符 作为进制表字符候选。

注意:算法中对转换后的字符串(进制表字符)增加了“平移加密”(见 算法1 ) 操作,使得加密强度更高了。

算法3:进制乱序法

return  key.charAt(parseInt(_n/16)) + key.charAt(_n%16); 

就这一行,可以假设 _n 不会超过 255

热点排行