You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义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的偏移操作,步骤如下:

  1. 提取编码结果末尾的随机字符,找到它在Base64表中的索引t(这就是编码时生成的随机基准值)
  2. 去掉末尾的随机字符,得到主体编码内容
  3. 对主体内容的每个字符,按逆向规则还原原始Base64索引:
    • 填充符=保持不变
    • 若字符索引等于t,说明原始索引是63
    • 若字符索引大于t,原始索引为当前索引-1
    • 若字符索引小于t,原始索引就是当前索引
  4. 将还原后的索引序列转换为标准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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 01:05:53