我希望JavaScript将textarea中的文本翻译成二进制代码.
例如,如果用户在TESTtextarea中键入" ",01010100 01000101 01010011 01010100则应返回值" ".
我想避免使用switch语句为每个字符分配二进制代码值(例如case "T": return "01010100)或任何其他类似技术.
这是一个JSFiddle来展示我的意思.这在原生JavaScript中是否可行?
如何使用Crypto Web API(window.crypto)在浏览器中获取HMAC-SHA512(密钥,数据)?
目前我使用的是CryptoJS库,它非常简单:
CryptoJS.HmacSHA512("myawesomedata", "mysecretkey").toString();
结果是91c14b8d3bcd48be0488bfb8d96d52db6e5f07e5fc677ced2c12916dc87580961f422f9543c786eebfb5797bc3febf796b929efac5c83b4ec69228927f21a03a.
我想摆脱额外的依赖,并开始使用Crypto Web API.我怎样才能得到相同的结果?
我正在使用浏览器内的Javascript,而不是NodeJS.我有两个Uint8Arrays ......
var d1 = new Uint8Array([255, 255, 255, 255, 255, 255, 255, 255])
var d2 = new Uint8Array([255, 255, 255, 255, 237, 49, 56, 0])
Run Code Online (Sandbox Code Playgroud)
每个元素都有8个元素,整数在0到255之间.每个数组代表一个更大的数字.例如,第一个数组表示正整数
0xffffffff
Run Code Online (Sandbox Code Playgroud)
我的问题是如何将d1除以d2得到结果?我读到Javascript中一个整数的最大值是2 ^ 53,我相信它比我可以拥有的最大数字少.我不关心结果的对象类型是什么,但是Uint8Array很好.
我想执行基本的 AES-CBC 解密。encData我有使用 128 位密钥加密的字符串rawKey,初始化向量defaultIV为零。我只想使用 Web Crypto API,而不使用第三方库。可以做吗?
window.crypto.subtle.decrypt当我在 Chromium 和Firefox中使用 Web Crypto API 时,它会抛出异常:(DOMException没有更多信息) 。OperationError: The operation failed for an operation-specific reason
到底是什么问题呢?
密钥和加密数据没问题,我已经在在线解密中检查过它(使用控制台输出中的十六进制字符串)。
代码:
!async function script() {
// ArrayBuffer to Hex String. https://stackoverflow.com/a/40031979/11468937
function buf2hex(buffer) {
return Array.prototype.map.call(new Uint8Array(buffer), x => ('00' + x.toString(16)).slice(-2)).join('');
}
const defaultIV = new Uint8Array(16);
const rawKey = new Uint8Array([42, 40, 254, 9, 99, 201, 174, 52, 226, 21, 90, 155, 81, …Run Code Online (Sandbox Code Playgroud) 我在JavaScript中有一个非常大的数字表示为二进制:
var largeNumber = '11010011010110100001010011111010010111011111000010010111000111110011111011111000001100000110000011000001100111010100111010101110100010001011010101110011110000011000001100000110000011001001100000110000011000001100000110000111000011100000110000011000001100000110000011000010101100011001110101101001100110100100000110000011000001100000110001001101011110110010001011010001101011010100011001001110001110010100111011011111010000110001110010101010001111010010000101100001000001100001011000011011111000011110001110111110011111111000100011110110101000101100000110000011000001100000110000011010011101010110101101001111101001010010111101011000011101100110010011001001111101'
Run Code Online (Sandbox Code Playgroud)
当我通过使用parseInt(largeNumber, 10)l 将其转换为十进制时它给了我1.5798770299367407e+199但是当我尝试将其转换回二进制时:
parseInt(`1.5798770299367407e+199`, 2)
Run Code Online (Sandbox Code Playgroud)
当我期望看到我的原始二进制表示时,它返回1(我认为与parseInt舍入值的工作方式有关)largeNumber.你能解释一下这种行为吗?我如何在JavaScript中将其转换回原始状态?
编辑:这个问题是我的实验结果,我正在玩存储和传输大量的布尔数据.它largeNumber是一组[true,true,false,true ...]布尔值的表示,必须在客户端,客户端工作者和服务器之间共享.
我正在尝试在 nodejs 中加密一段字符串,并且需要在前端 javascript 中对其进行解密。在 nodejs 中,我使用了加密库,而在前端使用了网络加密。在前端解密时遇到一些错误。
节点
const crypto = require('crypto');
const iv = crypto.randomBytes(12);
const algorithm = 'aes-256-gcm';
let password = 'passwordpasswordpasswordpassword';
let text = 'Hello World!';
let cipher = crypto.createCipheriv(algorithm, password, iv);
let encrypted = cipher.update(text, 'utf8', 'hex');
encrypted += cipher.final('hex');
var tag = cipher.getAuthTag();
let cipherObj = {
content: encrypted,
tag: tag,
iv: iv
}
Run Code Online (Sandbox Code Playgroud)
前端
let cipherObj; //GET FROM BE
let aesKey = await crypto.subtle.importKey(
"raw",
Buffer.from('passwordpasswordpasswordpassword'), //password
"AES-GCM",
true,
["decrypt"]
);
let decrypted = …Run Code Online (Sandbox Code Playgroud) 我有以下简单的代码:
inputBytes = new TextEncoder().encode(inputString)
hashBytes = await window.crypto.subtle.digest("SHA-256", inputBytes)
console.log((typeof hashBytes) + ": " + JSON.stringify(hashBytes))
Run Code Online (Sandbox Code Playgroud)
为什么结果是空对象?我怎样才能得到真正的结果?
这太奇怪了,非常感谢任何帮助
javascript ×6
cryptography ×3
aes-gcm ×1
arrays ×1
bigint ×1
binary ×1
division ×1
encryption ×1
hash ×1
string ×1
uint8array ×1