- 浏览: 138852 次
- 性别:
- 来自: 西南边陲
最新评论
-
leafxf:
这个和直接引用js有多大不同和优点?
近乎完美的简单 JS 跨域解决方式 --window.name -
zhangyg:
我怎么不行,我在执行到 var _getData = func ...
近乎完美的简单 JS 跨域解决方式 --window.name -
ray_linn:
akane 写道以后都走网上电子书城 楼主的问题就解决了
又 ...
试说知识传播与版权限制的两难 ---牢骚、希望或灵感 -
asd:
知识库还是很好的,我不知道这里面的商业模式是什么,但是百度文库 ...
试说知识传播与版权限制的两难 ---牢骚、希望或灵感 -
lkj107:
支持知识产权保护,BS百毒好好看看google是如何达到共赢的 ...
试说知识传播与版权限制的两难 ---牢骚、希望或灵感
续前一篇博文《几个文字加密的简洁算法和一些个人的想法》——字符平移法
以及上一篇博文《几个文字加密的简洁算法(续)》——字符错位法
这里提供第三种加密方法——对字符 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:进制乱序法
优化单字节字符串加密
——采用 2 个进制表字符,用 16 进制表达,降低密文的增长长度,仅适用于码值在 0xff 以内的字符(码值超出的字符——如中文会 原样保留)。
用法:
特点:
1. 密文会增长,是原始字符串长度的 3 倍(或 2 倍),但适用于各种字符集;
2. 密文是英文大小写字母,便于各类环境下的数据传输,保留空格和换行不做转换,节约编码长度;
3. 因对密文进行了平移操作,所以即便只是统计 41 进制表中包含了哪些字符也不可能(破解需要知道进制表中有哪些字符和如何排列)。
扯了好多哦…………快过节了,没事多唠唠哈哈,俺的时间不值钱……呵呵
试试怎么把十进制转换成十六进制——用简单的进位法
就这一行,可以假设 _n 不会超过 255
以及上一篇博文《几个文字加密的简洁算法(续)》——字符错位法
这里提供第三种加密方法——对字符 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:进制乱序法
(function() { // // 进制转换-加密: // 采用 [a-zA-Z] 52 个字符随机排列成进制表,对字符的值进行转换。 // 固定 3 位字符,41 进制,字符值最大可为 68920(> 65535)。 // 特点: // 1. 密文为纯大小写英文字母,及原有的 [\s\n\r]; // 2. 增加了平移操作,双重加密; // 3. key[0-40] 为进制表,逆向 16-25 位作为平移密钥; // 4. 进制表段字符不可重复。 // 5. 空白、换行和回车 [\s\n\r] 不加密。 // 缺点: // 密文会比原文长,单字节字符会增长得较多。 // 推荐: // 适用于任意类型的文本加密,网络环境可采用压缩传输; // 注意: // key 字符串不能含非 [a-zA-Z] 字符(关联数组)。 // // @param string key - 进制表串(length >= 41) // @return string - 转换后的字符串 // String.prototype._41hex = (function() { var _k, _k2, _sz; return function( key ) { if (key.length < 41) return null; if (_k != key) { _sz = key.charCodeAt(40) % 10 + 16, _k2 = key.slice(-_sz).split(''); for (var _i=0; _i<_sz; ++_i) { _k2[_i] = _k2[_i].charCodeAt(0); } _k = key; } var _cnt = 0; return this.replace(/[^\s\n\r]/g, function(s) { var _n = s.charCodeAt(0); return key.charAt(parseInt(_n/1681)) + key.charAt(parseInt(_n%1681/41)) + key.charAt(_n%41); }).replace(/[a-zA-Z]/g, function(s) { var _n = s.charCodeAt(0), _beg = (_n < 0x61) ? 0x41 : 0x61, _c = _n - _beg; return String.fromCharCode((_c+_k2[_cnt++%_sz])%26 + _beg); }); }; })(); // // 进制转换-解密 // @return string - 恢复后的字符串 // String.prototype._un41hex = (function() { var _k, _k2 = [], _sz, _tbl = {}; return function( key ) { if (key.length < 41) return null; if (_k != key) { // 逆向,防止属性值覆盖 for (var _i=key.length-1; _i>=0; --_i) { _tbl[key.charAt(_i)] = _i; _k2[_i] = key.charCodeAt(_i); } _sz = _k2[40] % 10 + 16; _k2 = _k2.slice(-_sz); _k = key; } var _cnt = 0; return this.replace(/[a-zA-Z]/g, function(s) { var _n = s.charCodeAt(0), _beg = (_n < 0x61) ? 0x41 : 0x61, _c = _n - _beg; return String.fromCharCode((_c-_k2[_cnt++%_sz]%26+26)%26 + _beg); }).replace(/[a-zA-Z]{3}/g, function(s) { var _n = _tbl[s.charAt(0)]*1681 + _tbl[s.charAt(1)]*41 + _tbl[s.charAt(2)]; return String.fromCharCode(_n); }); }; })(); })();
优化单字节字符串加密
——采用 2 个进制表字符,用 16 进制表达,降低密文的增长长度,仅适用于码值在 0xff 以内的字符(码值超出的字符——如中文会 原样保留)。
(function() { // // 进制转换:单字节字符版本-加密。 // 采用 16 进制,固定 2 个字符。 // 特点: // 值大于 0xff 的字符会原样保留,即不加密非拉丁字符。 // // @param string key - 进制表串(length >= 16) // @return string - 转换后的字符串 // String.prototype._16hex = (function() { var _k, _k2, _sz; return function( key ) { if (key.length < 16) return null; if (_k != key) { // 加强平移密钥 _sz = key.charCodeAt(15) % (key.length-6) + 6, _k2 = key.slice(-_sz).split(''); for (var _i=0; _i<_sz; ++_i) { _k2[_i] = _k2[_i].charCodeAt(0); } _k = key; } var _cnt = 0; return this.replace(/[\x21-\xff]/g, function(s) { var _n = s.charCodeAt(0); return key.charAt(parseInt(_n/16)) + key.charAt(_n%16); }).replace(/[a-zA-Z]/g, function(s) { var _n = s.charCodeAt(0), _beg = (_n < 0x61) ? 0x41 : 0x61, _c = _n - _beg; return String.fromCharCode((_c+_k2[_cnt++%_sz])%26 + _beg); }); }; })(); // // 进制转换:单字节字符版本-解密 // @return string - 恢复后的字符串 // String.prototype._un16hex = (function() { var _k, _k2 = [], _sz, _tbl = {}; return function( key ) { if (key.length < 16) return null; if (_k != key) { // 逆向,防止属性值覆盖 for (var _i=key.length-1; _i>=0; --_i) { _tbl[key.charAt(_i)] = _i; _k2[_i] = key.charCodeAt(_i); } _sz = _k2[15] % (key.length-6) + 6; _k2 = _k2.slice(-_sz); _k = key; } var _cnt = 0; return this.replace(/[a-zA-Z]/g, function(s) { var _n = s.charCodeAt(0), _beg = (_n < 0x61) ? 0x41 : 0x61, _c = _n - _beg; return String.fromCharCode((_c-_k2[_cnt++%_sz]%26+26)%26 + _beg); }).replace(/[a-zA-Z]{2}/g, function(s) { var _n = _tbl[s.charAt(0)]*16 + _tbl[s.charAt(1)]; return String.fromCharCode(_n); }); }; })(); })();
用法:
<script language="JavaScript"> var _str = "中文字符串和 English char string 的 JS 加密 Test. 包含一些标点符号,*@%! 等。"; // [a-zA-Z] 的随机排列 var _t = 'DsCqrtEcbFLOuijMklNmUVnwGvHopIJKxyzABaSTWPQRXdeYfhZg'; var _enc3 = _str._41hex(_t); alert(_enc3); alert(_enc3._un41hex(_t)); </script>
特点:
1. 密文会增长,是原始字符串长度的 3 倍(或 2 倍),但适用于各种字符集;
2. 密文是英文大小写字母,便于各类环境下的数据传输,保留空格和换行不做转换,节约编码长度;
3. 因对密文进行了平移操作,所以即便只是统计 41 进制表中包含了哪些字符也不可能(破解需要知道进制表中有哪些字符和如何排列)。
扯了好多哦…………快过节了,没事多唠唠哈哈,俺的时间不值钱……呵呵
评论
2 楼
Liner
2011-02-10
zyengogo 写道
这个加密没大看明白呢?
试试怎么把十进制转换成十六进制——用简单的进位法
return key.charAt(parseInt(_n/16)) + key.charAt(_n%16);
就这一行,可以假设 _n 不会超过 255
1 楼
zyengogo
2011-02-10
这个加密没大看明白呢?
发表评论
-
一个类似 Base64 但真正实现了加密的 JS 文字加密算法
2011-02-16 15:11 2929算法的基本原理和 Base64 ... -
针对文字加密的简单 JS 加密算法 --进制乱序法改良版
2011-02-12 12:08 5588在上一篇文章《普通 http 网络下数据的安全传输(设计原理) ... -
普通 http 网络下数据的安全传输(设计原理)
2011-02-10 16:32 7822曾几何时,https 安全但 ... -
近乎完美的简单 JS 跨域解决方式 --window.name
2011-02-04 22:47 25995当然,“近乎完美”仅仅是个人观点,但如下所述,它确实简单而颇有 ... -
几个文字加密的 JS 简洁算法(续)-- 字符错位法
2011-01-26 12:28 3757续上一篇博文《几个文字加密的简洁算法和一些个人的想法》,不说开 ... -
几个文字加密的 JS 简洁算法(字符平移法)和一些个人的想法
2011-01-22 21:43 7812未深入了解过数据加密 ... -
几个文字加密的简洁算法和一些个人的想法
2011-01-22 21:34 0未深入了解过数据加密 ... -
优化PHP执行效率的40条技巧
2009-11-08 21:37 24291.如果一个方法能被静 ... -
姓氏排序程序 Js 版(小程序共享)
2009-10-19 10:02 1788一朋友给客户做类似黄 ... -
最简单的判断 Javascript 和 Cookie 是否禁用的代码
2009-10-09 12:10 948在服务器端 include 即可,如 PHP: include ... -
对 XSS 跨站攻击之所以存在的一些思考
2009-09-21 23:07 1279一直对漏洞、骇客、攻击之类的东西没敢深入,甚至肤浅的了解都算不 ... -
标准的字根输入法设想
2009-04-30 20:44 1429国家新版《汉字部首表》即将于5月1日发布,其中:主部首 2 ... -
普通 http 下可靠的网路认证方式
2009-04-01 21:41 1282认证过程: 服务器:对客户端的每次请求,每一次都生成 ... -
在IIS中用ISAPI_Rewrite Lite版配置虚拟主机支持二级域名
2007-10-23 11:49 3166为二级域名的问题搞了2天,狂郁闷。。。。先是用程序,感觉太累赘 ... -
在Apache中配置使用Asp.net(记录备忘共享)
2007-10-17 14:38 4803本来是出于好奇,Apache中居然也能支持Asp一把了。。。呵 ... -
学写一个程序开发框架(PHP),灵感来源于ROR
2007-08-30 12:20 2500先向各位高手们请个安。 我对ROR的了解很浅,仅仅是看了一遍它 ... -
盗站与采集,分析及反制之术PHP实现
2007-08-10 23:53 3506一般的说,只要做过站 ... -
具有xhr对象管理功能的Ajax简易封装(Majax)
2007-07-20 21:57 3299内部由一个数组缓存工作中的xhr对象,类似于“池”,当一个请求 ... -
一个极简化的Ajax封装,回调接口和浏览器兼容性较好
2007-06-23 22:58 9480>>注意:请下载后面(9楼)的v1.1正式版。如果 ... -
我的汉字输入法编码方案
2007-05-28 22:24 2610很早就有了这个东西,因为一直没学会编写输入法程序,所以就没有拿 ...
相关推荐
des加密算法-显示16进制,是信息安全实验时做的,比较简单 G__des.h和des.h 都是老师给的源文件 des.cpp是自己写的,谢谢大家的关注
加密算法模块(VC++)-算法源码吧-加密解密算法- C_C++ 加密算法必备,开拓视野和了解相关算法
RAS加密算法的----——————-C语言实现
自己写的 呵呵 希望支持 信息安全 古典加密算法------置换密码 古典加密算法------代换密码------乘数密码
DES_加密解密算法的C++实现--实验报告.doc
该算法加密后24位字符和符号的组合,相比较与RSA存储文本较少,相比于MD5该算法可逆,不会较多的占用数据库资源。加密和解密都在代码中,有需要的朋友可以看下
IDEA是一个著名的加密算法,被广泛应用于各种领域,最著名的有PGP。基于IDEA算法,提出了一种新颖的十进制短分组加密技术。针对十进制数运算的特点,在加密算法中定义了三种新的运算,并从理论上证明新的运算能保证...
同态加密部分算法实现Homomorphic-Encryption-main.zip
微信小程序加密数据解密算法wechat-aes-sample-master.zip
网络-计算机-安全相关
Java中3DES加密解密示例(封装byte数组16进制互转)
VB 实现MD5 16位和32位加密算法(结果转成二进制)
PTA_python3_jmu-python-凯撒密码加密算法(csdn)————程序
自己写的 呵呵 希望支持 信息安全 古典加密算法------置换密码 古典加密算法------代换密码------乘数密码
DES_加密解密算法的C 实现--实验报告.doc
前端纯js加密、以及后端java解密代码。国密即国家密码局认定的国产密码算法。常用的主要有SM2,SM3,SM4。 SM2:椭圆曲线公钥密码算法是我国自主设计的公钥密码算法,为非对称加密,基于ECC。该算法已公开。由于该...
简单入门,同学传给我的学习资料。不知道对大家有没有用