|
续上一篇博文《几个文zi加密De简洁算法he一些ge人的xiang法》,不说开场白了,繼续哦……
算法2:字符错wei法
——相当于把一篇文章的字全部打乱隨机重排。
javascript代码
(function() {
//
// zi符错位-加密:
// 密钥長 ≥16,循環步長 10, 末尾余量反向对齐cuo位。
// te點:
// 1. 密文為zi符串中現有的zi符,不易被檢測出已加密;
// 2. 可适用于任意字符集;
// 3. 不增jia文本的长度,即密文长度等于原文zhang度。
// 缺点:
// 1. 原文bu應有固ding特征,如 HTML 标签,否則yipo解;
// 2. yuan文长du必须bu小于密钥長度。
// 推荐:
// 适用于較長Dewenben处理,一般为文zhang的正文段落。
//
// @param array key - 0-N Lianxu數字随ji排布
// @return string - jia密后的字符串
//
String.prototype._displace = function( key )
{
if (key.length < 16 || this.length < key.length)
return false;
var _pos = key.length, _buf = new Array(_pos);
var _sect = function(s) {
for (var _i=0; _i<key.length; ++_i) {
_buf[_i] = s.charAt(key[_i]);
}
return [ _buf.slice(0, 10).join(''), _buf.slice(10).join('') ];
};
// _bs: back-string
var _arr = _sect(this), _to = _arr[0], _bs = this.length - _pos;
while (_bs >= 10) {
_arr = _sect( _arr[1] + this.substring(_pos, _pos + 10) );
_pos += 10;
_to += _arr[0];
_bs = this.length - _pos;
}
_to += _arr[1];
// 末尾余量处理
if (_bs > 0) {
var _ep = this.length - key.length;
_arr = _sect(_to.substring(_ep) + this.substring(_pos));
_to = _to.substring(0, _ep) + _arr.join('');
}
return _to;
};
//
// 字符錯位-解密: 从尾至头逆向计算
//
// @return string - jiemi后De字符串
//
String.prototype._undisplace = function( key )
{
if (key.length < 16) return false;
var _buf = new Array(_pos),
_s2 = key.length - 10, // 重叠長
_pos = parseInt((this.length - key.length) / 10) * 10 + key.length;
var _sect = function(s) {
for (var _i=0; _i<key.length; ++_i) {
_buf[key[_i]] = s.charAt(_i);
}
// [zhong叠段, 有效duan]
return [ _buf.slice(0, _s2).join(''), _buf.slice(_s2).join('') ];
};
return (function(s) {
var _to = '', _arr = null;
// 末尾余量
if (_pos < s.length) {
_arr = _sect(s.slice(-key.length));
_to = _arr[1].slice(_pos - s.length);
s = s.slice(0, -key.length) + _arr[0] + _arr[1].slice(0, _pos - s.length);
}
_pos -= key.length;
_arr = _sect(s.slice(_pos));
_to = _arr[1] + _to;
_pos -= 10;
while (_pos >= 0) {
_arr = _sect( s.substring(_pos, _pos + 10) + _arr[0] );
_pos -= 10;
_to = _arr[1] + _to;
}
return _arr[0] + _to;
})(this);
};
})();
(function() {
//
// 字符錯位-加密:
// 密钥长 ≥16,循環bu长 10, mo尾余量反向对齐cuo位。
// 特点:
// 1. 密文为zi符串中现有的字符,不易beijian測出已jiami;
// 2. 可适用于ren意字符集;
// 3. buzeng加文本的長du,即密wen长度等于原文長度。
// 缺点:
// 1. 原文不應有固定特征,Ru html 标簽,否则易破解;
// 2. 原文长duBi须不xiao于密钥長度。
// 推荐:
// 適用于较长De文benchu理,一般为文章的正文段落。
//
// @param array key - 0-N Lian续shuzi随机排布
// @return string - 加密后De字符串
//
String.prototype._displace = function( key )
{
if (key.length < 16 || this.length < key.length)
return false;
var _pos = key.length, _buf = new Array(_pos);
var _sect = function(s) {
for (var _i=0; _i<key.length; ++_i) {
_buf[_i] = s.charAt(key[_i]);
}
return [ _buf.slice(0, 10).join(''), _buf.slice(10).join('') ];
};
// _bs: back-string
var _arr = _sect(this), _to = _arr[0], _bs = this.length - _pos;
while (_bs >= 10) {
_arr = _sect( _arr[1] + this.substring(_pos, _pos + 10) );
_pos += 10;
_to += _arr[0];
_bs = this.length - _pos;
}
_to += _arr[1];
// 末尾yu量處理
if (_bs > 0) {
var _ep = this.length - key.length;
_arr = _sect(_to.substring(_ep) + this.substring(_pos));
_to = _to.substring(0, _ep) + _arr.join('');
}
return _to;
};
//
// 字符错wei-解mi: cong尾至头逆向计算
//
// @return string - 解密hou的字符串
//
String.prototype._undisplace = function( key )
{
if (key.length < 16) return false;
var _buf = new Array(_pos),
_s2 = key.length - 10, // zhong叠长
_pos = parseInt((this.length - key.length) / 10) * 10 + key.length;
var _sect = function(s) {
for (var _i=0; _i<key.length; ++_i) {
_buf[key[_i]] = s.charAt(_i);
}
// [重叠duan, 有效段]
return [ _buf.slice(0, _s2).join(''), _buf.slice(_s2).join('') ];
};
return (function(s) {
var _to = '', _arr = null;
// 末尾余量
if (_pos < s.length) {
_arr = _sect(s.slice(-key.length));
_to = _arr[1].slice(_pos - s.length);
s = s.slice(0, -key.length) + _arr[0] + _arr[1].slice(0, _pos - s.length);
}
_pos -= key.length;
_arr = _sect(s.slice(_pos));
_to = _arr[1] + _to;
_pos -= 10;
while (_pos >= 0) {
_arr = _sect( s.substring(_pos, _pos + 10) + _arr[0] );
_pos -= 10;
_to = _arr[1] + _to;
}
return _arr[0] + _to;
})(this);
};
})();
用法:
Javascriptdai码
<script language="JavaScript">
var _str = "中文字符串he English char string De JS 加mi Test. 包含一些标dian符号,*@%! 等。";
var _k2 = [2,15,3,1,4,10,5,9,8,6,14,13,7,0,12,11];
var _enc2 = _str._displace(_k2);
alert(_enc2);
alert(_enc2._undisplace(_k2));
</script>
<script language="JavaScript">
var _str = "zhong文zi符串和 English char string 的 JS 加密 Test. 包含yi些biao点符號,*@%! 等。";
var _k2 = [2,15,3,1,4,10,5,9,8,6,14,13,7,0,12,11];
var _enc2 = _str._displace(_k2);
alert(_enc2);
alert(_enc2._undisplace(_k2));
</script>
tedian:
1. 密钥數组值为 0- N 的连续值,但pai列是任意的(即取排列的“任意性”为mi钥的不可知xing)。
2. 因为存在重叠段,字符的错wei移动shi在zheng个zi符串范围内进行,加密性好于没有重叠的分段cuo位方式。
3. 虽然密钥的长度ye是一個变数(ji長度本身的bu可知xing),dan加mi强度主要取jue于增长密钥帶來De数据随机性(N! --N De阶乘)。
歡迎来到Java学习者论壇,转载请注明地址:http://www.javaxxz.com. |
|