如何构造字符串使Base64编码生成斜杠以测试Base64URL函数
解决方法
要让输入字符串的标准Base64编码包含/,你需要构造字节序列,使得某个3字节分组编码后生成Base64的/(对应6位全1的二进制值111111,索引63)。具体可以通过以下方式修改输入字符串:
方案1:调整现有字符,保留Base64结尾的
=
原输入字符串长度为128字节(3×42+2),标准Base64结尾会带一个=。你可以修改字符串中某个3字节分组的第三个字符,让其对应的字节低6位为全1。比如把原字符串中最后一个字符\u007f(DEL,ASCII 0x7F)替换为?(ASCII 0x3F),此时最后一个3字节分组(}、~、?,对应字节0x7D、0x7E、0x3F)的Base64编码为fn8/,标准Base64结果会包含/,同时结尾保留=。修改后的字符串示例:
var allAciiChars = "\0\u0001\u0002\u0003\u0004\u0005\u0006\a\b\t\n\v\f\r\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}?";方案2:调整字符串长度,生成含
/的分组
若不想修改现有字符,可以去掉原字符串的前两个字符(\0和\u0001),让总长度变为126字节(刚好是3的倍数),此时最后一个3字节分组(}、~、\u007f,对应字节0x7D、0x7E、0x7F)的Base64编码为fN9/,标准Base64结果会包含/。如果需要保留Base64结尾的=,可以再去掉一个字符,让总长度变为125字节(3×41+2),此时标准Base64结尾会带一个=,同时仍包含/。
修改后,你需要重新计算expectedEncodedString:先获取输入字节的标准Base64编码,再将其中的+替换为-、/替换为_,最后去掉末尾的=即可。
内容的提问来源于stack exchange,提问作者Josh
相关产品推荐
相关产品推荐

