Javascript 如何将二进制字符串传递给'btoa'以对原始值进行编码

Javascript 如何将二进制字符串传递给'btoa'以对原始值进行编码,javascript,cryptography,cryptojs,Javascript,Cryptography,Cryptojs,我需要修改这个(工作)代码,并用原生JS替换CryptoJS函数 变量b64encoded的值正确,但我尝试使用本机代码(encodedIncorrect)的结果不正确。你能帮我输入正确的输入吗 工作正常,但第三方LIB不能在我开发的平台上使用: const encrypted = CryptoJS.HmacSHA1("message", "secret"); // encrypted = "0caf649feee4953d87bf903ac1176c45e028df16" << H

我需要修改这个(工作)代码,并用原生JS替换
CryptoJS
函数

变量
b64encoded
的值正确,但我尝试使用本机代码(
encodedIncorrect
)的结果不正确。你能帮我输入正确的输入吗

工作正常,但第三方LIB不能在我开发的平台上使用:

const encrypted = CryptoJS.HmacSHA1("message", "secret");
// encrypted = "0caf649feee4953d87bf903ac1176c45e028df16" << Hexadecimal encoded string
const b64encoded = CryptoJS.enc.Base64.stringify(encrypted);
// b64encoded = "DK9kn+7klT2Hv5A6wRdsReAo3xY="
const encrypted_vendor = VENDOR.hmacSHA1("message", "secret") // Vendor-provided HMAC-SHA1 func
// encrypted_vendor = "0caf649feee4953d87bf903ac1176c45e028df16"

// Split hex string into two-character byte representations for binary conversion
function splitHex(hexString) {
    let chunks = [];
    for (var i = 0, charsLength = hexString.length; i < charsLength; i += 2) {
        chunks.push(hexString.substring(i, i + 2));
    }
}
// Convert hex characters to binary value
function hexCharToBinary(value) {
    return (parseInt(value, 16).toString(2)).padStart(8, '0');
}

binaryChunks = splitHex(encrypted)
var binaryStr = ""
binaryChunks.forEach(i => binaryStr += hexCharToBinary(i))
// binaryStr = "0000110010101111011001001001111111101110111001001001010100111101100001111011111110010000001110101100000100010111011011000100010111100000001010001101111100010110"
encodedIncorrect = btoa(binaryStr)
// encodedIncorrect = "MDAwMDExMDAxMDEwMTExMTAxMTAwMTAwMTAwMTExMTExMTEwMTExMDExMTAwMTAwMTAwMTAxMDEwMDExMTEwMTEwMDAwMTExMTAxMTExMTExMDAxMDAwMDAwMTExMDEwMTEwMDAwMDEwMDAxMDExMTAxMTAxMTAwMDEwMDAxMDExMTEwMDAwMDAwMTAxMDAwMTEwMTExMTEwMDAxMDExMA=="

我还使用此站点()验证了二进制输出是否正确,当设置为二进制输入时,该站点将二进制输出编码为正确的base64。

您编码的是二进制数字的字符串表示形式,而不是实际数据

您需要一个,您可以使用以下方法构建:

常量hexString=“0caf649feee4953d87bf903ac1176c45e028df16” //分成两个字符组(每个字符组一个字节),参见。 // https://stackoverflow.com/questions/6259515/how-can-i-split-a-string-into-segments-of-n-characters //对于潜在的错误处理,最好使用/{1,2}/g //但如果总是有偶数个字符,那就没关系了。 让hexCharacterPairs=hexString.match(/../g); //将两个十六进制字符解析为数字 让bytes=hexCharacterPairs.map(e=>parseInt(e,16)); //从字节生成符号 让binaryStringSymbols=bytes.map(e=>String.fromCharCode(e)); //从所有符号中获取字符串 让binaryString=binaryStringSymbols.join(“”); //使用二进制字符串获取base64编码 设base64=btoa(二进制字符串); console.log(base64); //还是一行
console.log(btoa(“0caf649feee4953d87bf903ac1176c45e028df16”.match(/../g).map(e=>String.fromCharCode(parseInt(e,16))).join(“”))您正在编码二进制数字的字符串表示形式,而不是实际数据。你也可以很容易地从不断重复的“MDA”、“MDE”和类似的错误结果中看出这一点。是的,我知道!这就是我的问题-如何将原始二进制数据转换成一个变量来传递给
btoa
?您应该看看,它指出了a在本文中是什么。换句话说,字符串中的每个符号都应该是0-255之间的一个代码点,一个字节的数据。
btoa(“0caf649feee4953d87bf903ac1176c45e028df16”。匹配(/../g)。映射(e=>string.fromCodePoint(parseInt(e,16))。连接(“”)
tbh,使用
fromCharCode
可能更好一些,但是由于参数应该始终是[0255]中的整数,所以这并不重要。