一个类似 Base64 但真正实现了加密的 JS 文字加密算法

[size=medium]算法的基本原理和 Base64 类似。Base64 算法请参见维基百科 [url]http://zh.wikipedia.org/zh-cn/Base64[/url]。

这里把 Base64 中使用的基本字符表进行了随机化——即用基本字符表排列的随机性作为密钥的变化性。同时,考虑编码方法的应用环境多为 Javascript,故将 Base64 规范字符表中的 “+/=” 改成了 “$_~”,便于网络传输和变量命名等。

对 “纯单字节” 字符串或 “纯双字节” 字符串,密文的长度增长 0.35 倍左右;在单/双字节混合的字符串中,因为需要在 “单/双字节序列” 间插入标识码(状态指示),故密文的长度会有所加长,但也不会增加太多。

该加密法的密文长度增加量略低于 [url=http://rubel.iteye.com/blog/904426]“进制乱序法”[/url],加密强度约为 296 位(64 的阶乘),算法中没有加入 “平移” 的二次操作,如果嫌加密强度不够,可以简单的对密文进行平移操作(详见 [url]http://rubel.iteye.com/blog/891657[/url])。

算法的编写参考了 [url=http://tuhaitao.iteye.com/blog/653244]《base64的js实现》[/url],在此致谢!(注:该算法中未对编码串作 76 字符分段)

[b]算法 4: Base64 变形加密法[/b]
[/size]

(function() {
//
// 密文字符集(size:65)。
// [0-9A-Za-z$_~]
//
var _hexCHS = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz$_~';

//
// Base64 变形加密法
// 算法与 Base64 类似,即将 8 位字节用 6 位表示。
// 规则:
// 1. 码值 <= 0xff 的用 1 个字节表示;
// 2. 码值 > 0xff 的用 2 字节表示;
// 3. 单/双字节序列间用 0x1d 进行分隔;
// 4. 首字为双字节时即前置 0x1d 分隔符。
//
// @param array key - [0-63] 互斥值数组,length == 64
//
Hex64 = function( key )
{
this._key = [], this._tbl = {};

for (var _i=0; _i<64; ++_i) {
this._key[_i] = _hexCHS.charAt(key[_i]);
this._tbl[this._key[_i]] = _i;
}

this._pad = _hexCHS.charAt(64);
};

// 加密
Hex64.prototype.enc = function( s )
{
var _rs = '';
var _c1, _c2, _c3, _n1, _n2, _n3, _n4;
var _i = 0;
var _a = Hex64._2to1(s);
var _en = _a.length % 3, _sz = _a.length - _en;
while (_i < _sz) {
_c1 = _a[_i++];
_c2 = _a[_i++];
_c3 = _a[_i++];
_n1 = _c1 >> 2;
_n2 = ((_c1 & 3) << 4) | (_c2 >> 4);
_n3 = ((_c2 & 15) << 2) | (_c3 >> 6);
_n4 = _c3 & 63;
_rs += this._key[_n1]
+ this._key[_n2]
+ this._key[_n3]
+ this._key[_n4];
}
if (_en > 0) {
_c1 = _a[_i++];
_c2 = _en > 1 ? _a[_i] : 0;
_n1 = _c1 >> 2;
_n2 = ((_c1 & 3) << 4) | (_c2 >> 4);
_n3 = (_c2 & 15) << 2;
_rs += this._key[_n1] + this._key[_n2]
+ (_n3 ? this._key[_n3] : this._pad)
+ this._pad;
}
return _rs.replace(/.{76}/g, function(s) {
return s + '\n';
});
};

// 解密
Hex64.prototype.dec = function( s )
{
var _sa = [],
_n1, _n2, _n3, _n4,
_i = 0, _c = 0;
s = s.replace(/[^0-9A-Za-z$_~]/g, '');
while (_i < s.length) {
_n1 = this._tbl[s.charAt(_i++)];
_n2 = this._tbl[s.charAt(_i++)];
_n3 = this._tbl[s.charAt(_i++)];
_n4 = this._tbl[s.charAt(_i++)];
_sa[_c++] = (_n1 << 2) | (_n2 >> 4);
_sa[_c++] = ((_n2 & 15) << 4) | (_n3 >> 2);
_sa[_c++] = ((_n3 & 3) << 6) | _n4;
}
var _e2 = s.slice(-2);
if (_e2.charAt(0) == this._pad) {
_sa.length = _sa.length - 2;
} else if (_e2.charAt(1) == this._pad) {
_sa.length = _sa.length - 1;
}
return Hex64._1to2(_sa);
};

//
// 辅助:
// Unicode 字符串 -> 单字节码值数组
// 注意:
// 原串中值为 0x1d 的字节(非字符)会被删除。
//
// @param string s - 字符串(UCS-16)
// @return array - 单字节码值数组
//
Hex64._2to1 = function( s )
{
var _2b = false, _n = 0, _sa = [];

if (s.charCodeAt(0) > 0xff) {
_2b = true;
_sa[_n++] = 0x1d;
}
for (var _i=0; _i<s.length; ++_i) {
var _c = s.charCodeAt(_i);
if (_c == 0x1d) continue;
if (_c <= 0xff) {
if (_2b) {
_sa[_n++] = 0x1d;
_2b = false;
}
_sa[_n++] = _c;
} else {
if (! _2b) {
_sa[_n++] = 0x1d;
_2b = true;
}
_sa[_n++] = _c >> 8;
_sa[_n++] = _c & 0xff;
}
}
return _sa;
};

//
// 辅助:
// 单字节码值数组 -> Unicode 字符串
//
// @param array a - 单字节码值数组
// @return string - 还原后的字符串(UCS-16)
//
Hex64._1to2 = function( a )
{
var _2b = false, _rs = '';

for (var _i=0; _i<a.length; ++_i) {
var _c = a[_i];
if (_c == 0x1d) {
_2b = !_2b;
continue;
}
if (_2b) {
_rs += String.fromCharCode(_c * 256 + a[++_i]);
} else {
_rs += String.fromCharCode(_c);
}
}
return _rs;
};

})();


[size=medium][b]用法:[/b][/size]

<script language="JavaScript">
var _str = "中文字符串和 English char string 的 JS 加密 1234. 包含一些标点符号,*@%! 等。";
//php -r "$a=range(0,63); shuffle($a); echo join(',', $a);"
var _k3 = [38,48,18,11,26,19,55,58,10,33,34,49,14,25,44,52,61,16,2,56,23,29,45,9,3,12,39,30,42,47,22,21,60,1,54,28,57,17,27,15,40,46,43,13,0,51,35,63,36,50,6,32,4,31,62,5,24,8,53,59,41,20,7,37];
var _o = new Hex64(_k3);
var _enc3 = _o.enc(_str);
alert(_enc3)
alert(_o.dec(_enc3));
//wNOpC3lUT50RuSXNSm4yGj8FUtHWdImSdtJ6AwP4gRHZC6cllezlAQkuAmV2eJ_tw2coESE4nscl
//NaTNY4Ocukpem5I8M6CuKbfEw2kcX2Qyw9pXEcA~


[size=medium]附件中:
xtools.js 里包含前面几篇文章中提及的几个文字加密算法(JS 版,稍有调整),以及 Window.name 跨域实现的代码;
其它几个文件为测试用的 html 文件。[/size]
真正的JavaScript加密和网页资源加密系统,从原理到实现 网站作为网民获取信息的主要来源之一,基于Html5的建站服务和应用越来越多,而Html5存在一个关键问题: 网页内的资源(包括了javascript、文字、图像等)可以通过非常简单的方式获取! 目前网络上提供了各种针对javascript(简称js)的加密手段,主要还是以混淆,Base64,去逻辑化等手段进行保护。先不说此类的加密是否安全,但是针对内部链接、文字、图像相关的数据并没有合理的加密手段。这个一方面的原因是js需要浏览器的javascript引擎完成执行,直接密码后的js是无法运行的,于是就出 阅读详情

相关推荐

15、js加密解密

一.概念和作用 概念 加密解密:一个信息干扰的过程,保证固定的人才可以看到你的信息 把重要的数据变为乱码(加密)传送, 到达目的地后再用相同或不同的手段还原(解密) 作用 网络信息传输安全涉及到很多个方面,其中主要有三个要解决的问题: 保密性(Confidentiality):信息在传输时不被泄露 完整性(Integrity):信息在传输时不被篡改 有效性(Availability):信息的使用者是合法的 常用加密方式 数据加密方式 描述 主要解决的问题 常用算法 对称加密 指数据加密

剑指苍天 784

前端如何加密数据--五种方式(base64加密、md5加密、sha1加密、字符串方法加密、AES加密)

4.字符串的编码和解码(JS函数的escape()和unescape())--对于汉字,数字不适用。字符串转换为base64:str64 = window.btoa(str)base64转换为字符串:str=window.atob(str64)1.base64加密。

weixin_45096939的博客 6006

逆向360磐云盾文字点选验证码:从图像识别到轨迹加密的完整实战

验证码作为网络安全的基础防线,其核心原理是通过人机交互差异来区分真实用户与自动化脚本。文字点选验证码是其中一种常见形式,它要求用户在干扰图中按顺序点击特定文字,结合了图像识别与行为验证技术。在工程实践中,破解此类验证码涉及前端加密逻辑逆向、图像处理与轨迹模拟等关键技术,对于自动化测试、数据采集等场景具有重要价值。本文以360磐云盾为例,深入剖析其“一次一密”和“行为验证”机制,详细讲解如何通过抓包分析、JavaScript逆向及模板匹配技术,完整复现其token生成与轨迹加密流程,为处理类似安全防护提供系统

weixin_34184561的博客 747

加密算法笔记(哈希算法、base64,md5,aes,rsa等)、签名校验、bcrypt、数字信封

加密算法笔记(哈希算法、base64,md5,aes,rsa等)、签名校验、bcrypt

enthan809882的博客 3046

JavaScript中的编码解码与密码加密技术

哈希算法有很多,但并非所有的哈希算法都适合用于密码学。以下是一些常见的密码学哈希算法:MD5:曾经广泛使用,现在已不推荐,因为存在大量已知的碰撞。SHA-1:比MD5更安全,但仍然由于存在理论上的碰撞攻击而逐渐被弃用。SHA-256:属于SHA-2系列,是目前广泛使用的哈希算法之一,被认为是安全的。SHA-3:最新的NIST推荐的哈希标准,提供了良好的抗碰撞性和灵活的输出长度。非对称加密的基本原理是基于数学上的困难问题,如大整数分解、椭圆曲线等。

weixin_28721743的博客 1274

OpenWrt国内镜像源一键切换脚本:清华/阿里/中科大源全搞定

本文介绍了OpenWrt国内镜像源一键切换脚本,支持清华、阿里和中科大三大源,自动识别设备架构和系统版本,显著提升软件包安装速度和成功率。脚本包含架构自动识别、版本适配、多源选择和配置备份等功能,适用于x86_64、ramips/mt7621等常见架构,帮助用户解决海外源访问缓慢的问题。

g5h6i的博客 1175

几种常用加密算法比较

由于计算机软件的非法复制,通信的泄密、数据安全受到威胁,解密及盗版问题日益严重,甚至引发国际争端,所以在信息安全技术中,加密技术占有不可替代的位置,因此对信息加密技术和加密手段的研究与开发,受到各国计算机界的重视,发展日新月异。现在我们就几种常用的加密算法给大家比较一下。几种常用加密算法比较DES加密算法DES加密算法是一种分组密码,以64位为分组对数据加密,它的密钥长度是56位,加密解密用同一算法

Suk的专栏 1万+

PCIe中ACS知识小记

虚拟机内部的访问数据显而易见是带的GPA地址。而目前几乎所有的PCIe 设备都带ACS control,所以它们可以单独assign给不同的VM,但是随之而来的就是即使两个GPU同时assign给同一个VM,由于ACS的存在,他们之间也不会有真正的物理层面的P2P访问。每一个TLP都自带一个address(寻址类TLP),同时每一个endpoint,PCIe switch都自带一段BIOS配置的地址空间范围,一旦这个TLP的address落入某个设备的地址范围,那么这个TLP就属于这个设备并消费。

Summer的博客 5077

JS逆向之 Base64 加密算法特征全方位解析

逆向过程中,`Base64` 加密特征是常见的特征,但是你知道: - `Base64` 加密算法的特征是什么? - 如何多场景快速使用 `Base64` 加密算法? - 如何手写 `Base64` 加密算法,了解其实现原理? - 如何魔改 `Base64` 加密算法,实现自定义加密规则?

小鱼神1024的博客 3084

【Ablation Studies 理解】深度学习模型组件的对比实验/性能分析

Ablation Study 用于检测深度学习/机器学习模型中各部分构件对于整体的重要性。 可以理解为为:组件\tricks重要性测试、组件性能系统性分析、控制变量法、组件去除对比实验、性能敏感性测试、性能因子分析等 Ablation Studies 一些新颖的深度学习模型在论文中都会进行AblationStudy,这部分的主要意义在于系统性的移除模型中的各种组件/trick等因子或者是创新的...

TomRen 4588

ST-LINK调试STM32H743必看:CubeMX工程中缺失的这行代码导致程序跑飞

本文深入剖析了使用ST-LINK调试STM32H743时,因CubeMX工程中缺失电源电压档位配置代码而导致程序跑飞或出现“Can not access memory”错误的问题。文章解释了H7系列电源与时钟耦合的核心原理,提供了具体的代码修复方案和系统化的调试排查思路,帮助开发者从根本上解决这一常见调试困境。

weixin_29191669的博客 281

JavaScript的Base64加解密

Base64是一种基于64个可打印字符来表示二进制数据的编码方式。这64个字符包括大小写英文字母、数字和两个符号(通常是"+“和”/“),以及用于填充的”="符号。Base64编码的主要目的是将二进制数据转换为可打印的ASCII字符,使其能够在只支持文本数据的环境中安全传输。需要注意的是,Base64不是加密算法,它只是一种编码方式,不提供任何安全性保障。Base64编码后的数据通常比原始数据大约增加33%的体积,因为每3个字节的二进制数据会被编码为4个Base64字符。

exlink2012的专栏 4828

【maven】maven 3.8.1 版本编译java 17的项目报错 java.lang.ExceptionInitializerError to make field private com.s

排查发现一切正常,但是内网就是不行,然后我就想把我的程序从java 11 改成java 17,然后执行编译的时候报错。这个问题是我们内网java代码升级,项目比较复杂,是从java 8 升级到java 17,然后报错。maven-compiler-plugin 3.8.1 版本编译java 17的项目,报错。然后查看一下这个项目的lombok,结果发现还是老的版本。怀疑是不是这个问题呢?使用最新的版本就可以了。

九师兄 780

AES加密算法概述(前端登录加密)

AES简介 高级加密标准(AES,Advanced Encryption Standard)为最常见的对称加密算法(微信小程序加密传输就是用这个加密算法的)。对称加密算法也就是加密和解密用相同的密钥,具体的加密流程如下图: 下面简单介绍下各个部分的作用与意义: 明文P 没有经过加密的数据。 密钥K 用来加密明文的密码,在对称加密算法中,加密与解密的密钥是相同的。密钥为接收方与发送方协商产生,但不可以直接在网络上传输, 否则会导致密钥泄漏,通常是通过非对称加密算法加密密钥,然后再通过网络传输

zuo_zuo_blog的博客 2434

从零构建法律案例数据库:Python爬虫实战与法律文本挖掘全攻略

在当今数字化浪潮席卷全球的背景下,法律行业正经历着前所未有的变革。法律案例数据库作为法律大数据的重要组成部分,已经成为法律从业者、研究人员、法学院学生乃至企业法务部门的必备工具。然而,商业法律数据库如北大法宝、威科先行、LexisNexis等往往价格不菲,且数据访问受限。对于个人研究者或小型机构而言,构建一个定制化的法律案例数据库不仅能节省成本,更能根据特定研究需求灵活调整数据结构。

2201_76125261的博客 538

52-Halcon-- smooth_object_model_3d函数功能(滑处理3D对象模型)

Halcon中smooth_object_model_3d算子详解 该算子用于3D模型平滑处理,提供三种算法:'laplacian'(快速去噪)、'taubin'(高质量防收缩)和'low_pass'(频域滤波)。核心参数包括迭代次数(默认5)、平滑强度(0-1)和边缘保护选项。典型应用包括扫描数据去噪、CAD模型光顺和逆向工程优化。支持自适应平滑、结合模型简化等高级技巧,并可通过分块处理优化大型模型性能。参数组合需根据具体场景选择,如快速去噪推荐拉普拉斯方法(5次迭代,强度0.3),特征保持推荐低通滤波(

weixin_45590420的博客 872

JavaScript逆向爬虫教程-------基础篇之常用的编码与加密介绍(python和js实现)

JavaScript逆向爬虫教程-------基础篇之常用的编码与加密介绍(python和js实现)

abments的博客 1050

2023,程序员的出路在哪里?

可是似乎从30岁开始这工资就没涨过,前面跳槽几次涨的薪水在30岁以后跳槽已经不管用了、定格了,这几年由于市场环境不景气,程序员竞争越来越激烈,36岁跟30拿的工资一模一样,不仅工资拿的一样,反而事情还越来越多了,这些都意味着什么?处理故障需要的通常不仅仅是写代码的能力,还需要对一个系统的全貌要有一定的掌握。虽然目前不少大型互联网企业都在进行结构性调整,但是从互联网行业发展的基本面来看,未来在产业互联网发展的过程中,IT行业和传统行业将会释放出大量的就业岗位,所以未来程序员的发展空间还是非常值得期待的。

AI天才研究院 20万+

commons-codec中[md5,sha,base64加密算法]的实现demo

项目用到给用户密码加密,下载了apache的commons-codec jar包,贴出对几种加密算法实现的demo。记之。 commons-codec-1.10下载链接: http://commons.apache.org/proper/commons-codec/download_codec.cgi package demo; import org.apache.commons.co

小黄蓉的优快云博客专栏 3785

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

c++ 中文 base64加密_APP 中的 JS 加密逆向解析

抓取登录包解决安全检测使用木木模拟器,安装好app刚准备愉快的抓个包。竟然检测到root,不能进入。那就先把这个给他hook掉。用jadx打开apk,全局搜索一下,提示的文字。可以看到这里进行了几种检测,编写frida hook代码,直接把 initCheckSafe 方法置空Java.perform( function () { var SecurityBuilder =...

weixin_39791349的博客 275

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

JS前端渗透及加密基本知识

一般的前后端分离网站的架构基本是 Nginx + Vue.js + Java(Tomcat/SpringBoot) 且编写后的 Vue 代码通过 WebPack 打包发布,浏览器引擎通过动态解析并渲染页面就可以形成最终形成大家可以看到的系统界面,且 js 和 css 都是打包压缩后的,难以正常阅读。

actistsec的博客 726

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

js逆向——返回加密数据的处理

这样数据解密的步骤我们已经分析完了,现在还有一个问题就是我怎么知道返回的7个XHR数据包哪一个是列表页展示的、我们希望得到的目标数据呢?这说明我们收到的响应数据是加密后的结果,返回客户端之后由客户端解密拿到明文字符串展示在前端当中,所以我们才能在网页看到有效的信息。现在我们还需要确认一件事,就是这个网站使用的AES-CBC是不是标准的AES算法,这将决定我们需不需要扣代码。而且通过观察,js代码没有特别需要扣的地方,都是使用的库当中自带函数。ok,今天的你就到此为止吧,我们下期再见~

Tandy12356_的博客 2789

揭秘微信小程序登录:如何利用Base64实现用户名和密码加密传输

Base64是一种基于64个可打印字符来表示二进制数据的表示方法。它常用于在HTTP环境下传输少量二进制数据。Base64编码后的数据具有以下特点:编码后的数据只包含英文字母、数字、加号(+)和斜杠(/),易于在网络上传输;编码后的数据长度会增加约1/3,但不会增加太多;Base64编码是一种可逆的编码方式,可以通过解码还原原始数据。通过在微信小程序登录环节使用Base64加密传输用户名和密码,可以有效提高数据安全性。

Jiaberrr的博客 2071

30余种加密编码&杂项CTF

知识点: 存储密码加密-Web&数据库&系统 传输数据编码-各类组合传输参数值 代码特性加密-JS&PHP&NET&JAVA 数据显示编码-字符串数据显示编码 必须知道【你要懂噢】 加密编码进制在安全测试中有哪些存在 在我们数据库存储用户的信息中密码他有一个MD5加密 在我们电脑ip中有这2进制10进制16进制等的转换 在我们CTF中有这更为广泛的应用加密编码进行 必须知道其中百分之60以上 1. 有哪些常见的进制编码加密方式 凯撒加密,摩斯密码,猪

weixin_54882883的博客 4770

Base64编码详解(含JS_Python实现+实战逆向案例)

本文详细介绍了Base64编码的核心概念、格式特点和应用场景。Base64是一种将二进制数据转换为可打印ASCII字符的编码方式,而非加密算法。其编码结果仅包含64个特定字符和填充符"=",具有长度固定为4的倍数、大小写敏感等特点。文章提供了JS和Python的Base64编码实现代码,并列举了在接口参数、图片传输、数据存储等场景的应用。通过正则表达式验证和实际案例,帮助读者快速识别和操作Base64编码,适合逆向工程、CTF竞赛和Web开发等场景使用。

2603_95532426的博客 1764
上一篇: 针对文字加密的简单 JS 加密算法 --进制乱序法改良版
下一篇: 试说知识传播与版权限制的两难 ---牢骚、希望或灵感
testdownabc
博客等级 码龄18年 4粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值