自定义Base64变体编码算法解析及解码方法咨询
变种Base64算法解析与解码方案
一、算法识别
这是带随机偏移的变种Base64算法,核心编码逻辑和标准Base64完全一致:将输入字符串按3字节分组,拆分出4个6位索引映射到Base64字符表。差异点在于加入了budget函数的随机偏移处理,以及编码结果末尾会附加一个随机Base64字符。
二、budget函数的作用
先看函数逻辑:
function budget(e, t) { return e === 64 ? 64 : e === 63 ? t : e >= t ? e + 1 : e; }
它的作用是基于随机生成的基准值t(0-63),对原始Base64索引做偏移替换,具体规则:
- 若
e是64(对应填充符=的索引),直接返回64,保持填充符不变 - 若
e是63(对应Base64表最后一个字符/),替换为随机基准值t对应的字符 - 若
e大于等于t,索引值+1,对应Base64表的下一个字符 - 其他情况(
e < t),保持原索引不变
这个操作会让编码结果和标准Base64产生差异,实现编码内容的轻度随机化,避免直接被标准Base64解码工具识别。
三、解码实现方法
解码需要逆向还原budget的偏移操作,步骤如下:
- 提取编码结果末尾的随机字符,找到它在Base64表中的索引
t(这就是编码时生成的随机基准值) - 去掉末尾的随机字符,得到主体编码内容
- 对主体内容的每个字符,按逆向规则还原原始Base64索引:
- 填充符
=保持不变 - 若字符索引等于
t,说明原始索引是63 - 若字符索引大于
t,原始索引为当前索引-1 - 若字符索引小于
t,原始索引就是当前索引
- 填充符
- 将还原后的索引序列转换为标准Base64字符串,再用标准Base64解码逻辑得到原始内容
对应的解码代码示例:
function reverseBudget(e, t) { if (e === 64) return 64; if (e === t) return 63; return e > t ? e - 1 : e; } function mydecode(encodedStr) { var b64ch = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; var b64chs = Array.prototype.slice.call(b64ch); // 提取随机基准值t var lastChar = encodedStr.slice(-1); var t = b64chs.indexOf(lastChar); if (t === -1) throw new TypeError('invalid encoded string'); // 去掉末尾随机字符 var mainStr = encodedStr.slice(0, -1); // 还原原始Base64索引 var restoredIndices = []; for (var i = 0; i < mainStr.length; i++) { var idx = b64chs.indexOf(mainStr[i]); if (idx === -1) throw new TypeError('invalid character found'); restoredIndices.push(reverseBudget(idx, t)); } // 转换为标准Base64并解码 var standardB64 = restoredIndices.map(idx => b64chs[idx]).join(''); var decoded = atob(standardB64); // 处理填充,去掉多余字节 var padCount = (standardB64.match(/=/g) || []).length; if (padCount > 0) { decoded = decoded.slice(0, decoded.length - padCount); } return decoded; } // 测试示例 // const encoded = myencode("test-string", budget); // console.log(mydecode(encoded)); // 输出: test-string
内容的提问来源于stack exchange,提问作者roger
相关产品推荐
相关产品推荐

