鱼C论坛

 找回密码
 立即注册
查看: 3492|回复: 7

几个文字加密的 JS 简洁算法(字符平移法)

[复制链接]
发表于 2011-2-8 12:49:28 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
注:原帖来自Java eye : Liner

未深入了解过数据加密——我想那应该是科学家们的事。

俺小程序员一个,但喜欢思考,琢磨过“加密的问题”良久良久……(没有最终结果)  这里说说自己琢磨之后的一些想法,仅供茶余饭后  没事瞎想时的一些零星素材。

“加密”嘛,顾名思义,基本就是要别人看不明白本来可以明白的xx,所以,对于我们日常看见的文字,只要让别人看不明白就算加密了。

不同于对其他信息的加密(比如音视频),我觉得对“文字”的加密可以有一个很简单的逻辑: 中文字符就那么几千万把个,但却可以组合成无限量的任意文章,字还是那些字,文章的意思却可以相差天远地别! 回想“活字印刷”时的场景,在排字之前,你能知道排出来的是一篇什么文章么???

所以,文字的加密很简单——把字“打乱”就可以了。——字还是那些字,打乱之后说不定还是另一篇文章哩! 你知道原文是什么吗??——它可能是另一篇不太读得通顺的文章,也可能是那篇本来就不怎么读得通顺的原文。——这样的加密,你如何破解? 怎么算是已经破解了??  呵呵, 好玩吧?

现在的问题是,怎么把字打乱? 算法是什么——必须要能根据密钥恢复回来(废话)。

时间就是效率,不罗嗦了(感觉像在浪费生命), 这里贴出几个小算法,仅供参考,或提出质疑——是否可靠? 提前谢谢提出质疑者(当然有解决办法就更好了)!


JS 实现:(JS 的底层 Unicode 支持是效率的根本——废话真多!)

算法1: 字符平移法

Javascript代码
  1. (function() {
  2.     var _Charset = {
  3.             'cjk': [ 'u4e00', 'u9fa5' ],    // 汉字 [一-龥]
  4.             'num': [ 'u0030', 'u0039' ],    // 数字 [0-9]
  5.             'lal': [ 'u0061', 'u007a' ],    // 小写字母 [a-z]
  6.             'ual': [ 'u0041', 'u005a' ],    // 大写字母 [A-Z]
  7.             'asc': [ 'u0020', 'u007e' ]     // ASCII 可视字符
  8.         };

  9.     //
  10.     // 加密:字符码在字符集内平移。
  11.     // 特点:
  12.     // 1. 字串越短加密效果越好,若短文不大于密钥长度,则不可破解。
  13.     // 2. 不增加文本的长度,即密文长度等于原文长度。
  14.     // 缺点:
  15.     // 1. 一次只能对“一个”连续值的字符集进行处理,而一般字符串中会
  16.     //    同时包含多个字符集中的字符。
  17.     // 2. 汉字平移后的字较生僻,明显体现出已被平移处理;
  18.     // 推荐:
  19.     // 适于特定类型的短字符串的处理,如:时间串、名称、标题等。
  20.     //
  21.     // 参数 cset:
  22.     // 用 Unicode 表示 -- 4 位十六进制,前置‘u’,
  23.     // 可用预定义的 _Charset 属性名标识,默认为 cjk。
  24.     //
  25.     // @param array na  - 平移量数组
  26.     // @param array cset  - 字符集名/范围 [ 起点, 终点 ])
  27.     // @return string  - 平移后的字符串
  28.     //
  29.     String.prototype._shift = (function()
  30.     {
  31.         var _cset, _id, _beg, _len, _exp;

  32.         return  function( na, cset ) {
  33.             switch (typeof cset) {
  34.                 case 'undefined':
  35.                     cset = 'cjk';
  36.                 case 'string':
  37.                     _cset = (cset == _id) ? null : _Charset[cset];
  38.                     break;
  39.                 default: _cset = cset;
  40.             }
  41.             if ( _cset ) {
  42.                 _beg = parseInt(_cset[0].substring(1), 16);
  43.                 _len = parseInt(_cset[1].substring(1), 16) - _beg + 1;
  44.                 _exp = RegExp('[\\' + _cset[0] + '-\\' + _cset[1] + ']', 'g');
  45.                 _id  = cset;
  46.             }
  47.             var _sz = na.length,
  48.                 _cnt = 0;
  49.             return  this.replace(_exp, function(s) {
  50.                 var _c = s.charCodeAt(0) - _beg;
  51.                 return  String.fromCharCode((_c+na[_cnt++%_sz])%_len + _beg);
  52.             });
  53.         };
  54.     })();


  55.     //
  56.     // 解密:字符码在字符集内平移-恢复。
  57.     //
  58.     String.prototype._unshift = (function()
  59.     {
  60.         var _cset, _id, _beg, _len, _exp;

  61.         return  function( na, cset ) {
  62.             switch (typeof cset) {
  63.                 case 'undefined':
  64.                     cset = 'cjk';
  65.                 case 'string':
  66.                     _cset = (cset == _id) ? null : _Charset[cset];
  67.                     break;
  68.                 default: _cset = cset;
  69.             }
  70.             if ( _cset ) {
  71.                 _beg = parseInt(_cset[0].substring(1), 16);
  72.                 _len = parseInt(_cset[1].substring(1), 16) - _beg + 1;
  73.                 _exp = RegExp('[\\' + _cset[0] + '-\\' + _cset[1] + ']', 'g');
  74.                 _id  = cset;
  75.             }
  76.             var _sz = na.length,
  77.                 _cnt = 0;
  78.             return  this.replace(_exp, function(s) {
  79.                 var _c = s.charCodeAt(0) - _beg;
  80.                 return  String.fromCharCode((_c-na[_cnt++%_sz]%_len+_len)%_len + _beg);
  81.             });
  82.         };
  83.     })();

  84. })();
复制代码
用法:

Javascript代码
  1. <script language="JavaScript">
  2.     var _str = "中文字符串和 English char string 的 JS 加密 Test. 包含一些标点符号,*@%! 等。";
  3.     var _k1 = [2034,85,45,22,65,213,65,398,356,1709,354];
  4.     var _enc = _str._shift(_k1);
  5.     alert(_enc);
  6.     alert(_enc._unshift(_k1));
  7. </script>
复制代码
密钥是个数组,如果觉得不方便,当然可以用一句话,取每个字符的码值分解成数组了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-9-10 14:23:42 | 显示全部楼层
呵呵一起学习 共同进步!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-9-10 20:48:42 | 显示全部楼层
好深奥啊   根本看不懂 不过能知道是什么意思了    一句同样意思话放在不同人的口中出来的就不一样了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-9-13 23:54:54 | 显示全部楼层
从密码学的角度来说,密码分两种一种是古典密码,楼主的例子里的属于移位密码(凯撒是特例),还有分组密码,一次一密密码本等,用的比较多的算法是MD5,还有一种是现代密码,主要算法RSA
两者区别在于,古典密码算法需保密,而现代密码是密钥保密,算法公开。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-10-8 19:50:23 | 显示全部楼层

楼上懂的真多,密匙,算法公开了,人家不是能破解?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-10-8 20:45:34 | 显示全部楼层
学习了!~写给情人很好用哈哈!~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-7-14 03:02:28 | 显示全部楼层
谢谢楼主分享!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-9-19 10:59:22 | 显示全部楼层
随便看看,收藏丶东西,这是很好的习惯。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-26 14:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表