javascript 使用数据加密跟base64 编码

摘要:
下面的js代码首先对给定的数据字符串和指定的键字符串执行XOR运算,然后对结果序列执行base64编码。同时,下面提供了解密算法和base64恢复函数代码:functioncode(opArray){var_local2=opArray;varstrEnd=“=”;var_local3=“ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvxy

下面的js代码首先将给定的数据字符串,跟指定的密匙字符串做异或运算,接着将结果序列进行base64编码,
下面同时给出了解密算法跟,base64还原函数

代码如下:

function secode(opArray) {
var _local2 = opArray;
var strEnd="=";
var _local3 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
var bits;
var decOut = new Array ();
var _local1 = 0;
var j = 0;
_local1 = 0;
while (_local1 < _local2.length) {

//第一个元素(这里前提是单字节)向前移动2个字节,
//第二个移动1字节,第三个不移动
//那么 | 后的结果是,形成一个3字节的数据如下
//xxxxxxxx0000000000000000
//00000000xxxxxxxx00000000
//0000000000000000xxxxxxxx
//注意bits是一个正整数,其值等与上面3组数 |(异) 后的数值
//16515072的二进制表示为:1111 1100, 0000 0000 ,0000 0000
//那么 bits & 16515072 后,就是取bits的前6位
//>>18 表示右移动 18为注意 bits & 16515072 后是正数,那么>>18时高位补的是00,
// 正数高位第一位为0,负数为1

//这样((bits & 16515072)>>18)的值就是其在_local3中对应字的符位置.

bits = ((_local2[_local1]<<16) | (_local2[_local1+1]<<8) | (_local2[_local1+2]));
decOut[j++] = _local3.charAt((bits & 16515072) >> 18);
decOut[j++] = _local3.charAt((bits & 258048) >> 12);
decOut[j++] = _local3.charAt((bits & 4032) >> 6);
decOut[j++] = _local3.charAt(bits & 63);
_local1 = _local1 + 3;
}

//另外258048其二进制表示为 11 ,1111 0000 ,0000 0000
//
等价于0000 0011 ,1111 0000 ,0000 0000(正数高位为0)
//当字节数不是3的整数倍时,_local2[_local1+1],或_local2[_local1+2] 其值(下标已经超标)是0,
//也正好符合base64不足补零的定义

switch(_local2.length%3){
//多一个字节时映射成的4字接有2个字节里无数据(纯零)应此丢弃
//多2个字节时,丢弃一个,而正好是,末尾不加"=",故将strEnd="" 设置为空.

case 1:decOut.pop();decOut.pop();break;
case 2:decOut.pop();break;
case 0:strEnd="";break;
}
decOut.push(strEnd);
return (decOut.join(""));
}
function encode(var1, key) {
var _local3 = var1;
var2 = new Array();
var _local2 = 0;
var _local1 = 0;
while (_local1 < _local3.length) {
var2.push(_local3.charCodeAt(_local1) ^ key.charCodeAt(_local2++));

//当key序列不够长时循环使用
if (_local2 >= key.length) {
_local2 = 0;
}
_local1++;
}
var2=secode(var2);
return (var2);
}
function decode(var1, key) {
var _local3 = var1;
_local3 = becode(_local3);
var2 = "";
var _local2 = 0;
var _local1 = 0;
while (_local1 < _local3.length) {
var2 = var2.concat(String.fromCharCode(_local3[_local1] ^ key.charCodeAt(_local2++)));
if (_local2 >= key.length) {
_local2 = 0;
}
_local1++;
}
return (var2);
}
function becode(opString) {
var _local2 = opString;
var _local3 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
var bits;
var decOut = new Array ();
var _local1 = 0;
var j = 0;
_local1 = 0;
while (_local1 < _local2.length) {
bits = ((((_local3.indexOf(_local2.charAt(_local1)) & 255) << 18) | ((_local3.indexOf(_local2.charAt(_local1 + 1)) & 255) << 12)) | ((_local3.indexOf(_local2.charAt(_local1 + 2)) & 255) << 6)) | (_local3.indexOf(_local2.charAt(_local1 + 3)) & 255);
decOut[j++] = (bits & 16711680) >> 16;
decOut[j++] = (bits & 65280) >> 8;
decOut[j++] = bits & 255;
_local1 = _local1 + 4;
}
if (_local2.charCodeAt(_local1 - 2) == 61) {
decOut.pop();
decOut.pop();
} else if (_local2.charCodeAt(_local1 - 1) == 61) {
decOut.pop();
//
}
return (decOut);
}
function base64(str){
var d=new Array();
for(var i=0;i<str.length;i++){
d.push(str.charCodeAt(i));
}alert(d);
return secode(d);
}

//说明,首先获取字符串的字节序列(Array) 使用 str.charCodeAt(i), 这里需要注意的是, charCodeAt(i)获取的值应该<=255 (单字节) 如果str中含有中文等双字节码,那么请先使用str=escape(str)对其进行编码(还原时使用unescape).

encode函数, encode里将待处理字符序列(假设已经为单字节序列),与给顶的key序列,将每个字符的Unicode值做^操作,获得一个待base64编码数组.

secode函数, 根据base64编码,将每3个字节映射成4个字节,当字节数不是3的倍数时尾部补0(bit),形成的base64字符串最后加"="

后面的两个是相应的还原函数

免责声明:文章转载自《javascript 使用数据加密跟base64 编码》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇php SWFUpload多文件上传简单Web UI 自动化测试框架 seldom下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Cobbler自动化部署

一、Cobbler服务的介绍 Cobbler是一个免费开源系统安装部署软件,用于自动化网络安装操作系统 Cobbler集成了DNS DHCP软件包更新,以及配置管理,方便操作系统安装自动化 Cobbler支持命令行管理,WEB界面管理,同时提供API接口便于二次开发 Cobbler客户端token支持虚拟机安装和操作系统重新安装,使重装系统更便捷 1.1 ...

WEB前端组件思想【日历】

DEMO2: 思路:首先获取元素节点元素--->根据点击事件隐藏显示元素--->建立showdate方法(判断12月则右边年份+1,月份1)--->还要设置btn开关防止多次重建--->根据元素清空for循环列行、把thtrthead加入table--->根据判断每一次点击进入月份必须先清空一次td 判断月份大小及闰年---&...

JS Guid生成

function numToGuid(uid) { var str = "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"; var l =uid.toString(); return str.substr(0, str.length - l.length) +uid; }); 这是就简单模拟 gu...

在react项目中使用回车键(Enter)实现tab切换输入框的功能(以及Don't make functions within a loop no-loop-func的问题)

在这碰到的一个问题就是代码在正常的HTML文件中是没有什么问题的,但是当代码放到react项目中就会报警告Don't make functions within a loop no-loop-func(其实大致的意思就是说不要在循环中生成或嵌套函数),可能是严格模式的原因。实现方式只需要需要添加这个效果的输入框加上一个class名‘input‘,这边使用过...

三种比较好玩的黑客效果JS代码(摘取)

<html> <head> <title>The Matrix</title> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js" type="text/ja...

自动化部署 jenkins 插件简介

一、什么是持续集成? (1)Continuous integration(CI) 持续集成是一种软件开发实践,即团队开发成员经常集成他们的工作,通常每个成员至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽快地发现集成错误。许多团队发现这个过程可以大大减少集成的问题,让团队能够更快的开发...