我使用node forge加密表单,然后使用AES将表单发送到服务器。
现在加密部分的代码是
const bigInt = require("big-integer");
const forge = require('node-forge');
function generateParams() {
// Cryptographic random number generator
var array = new Uint32Array(2);
var _key = bigInt(window.crypto.getRandomValues(array)[0]).toString();
var _iv = bigInt(window.crypto.getRandomValues(array)[1]).toString();
// generate random key and IV
var key = forge.util.encode64(_key);
var iv = forge.util.encode64(_iv);
const params = {
key: key,
iv: iv
}
return params;
}
function encrypt(params) {
var cipher = forge.rc2.createEncryptionCipher(params.key);
cipher.start(params.iv);
// Encrypting "testing"
cipher.update(forge.util.createBuffer("testing"));
cipher.finish();
return cipher.output;
}
function decrypt(params, encrypted) {
var cipher = forge.rc2.createDecryptionCipher(params.key);
cipher.start(params.iv);
cipher.update(encrypted);
cipher.finish();
return cipher.output;
}
和jQuery函数(尚未发布)
$('#recordForm').submit(function(event) {
// Stop form from submitting normally
event.preventDefault();
// Grab form data
// Crypto
const params = generateParams();
const encryptedForm = {
test: encrypt(params),
}
console.log("Encrypted: " + encryptedForm.test);
const decryptedForm = {
test: decrypt(params, encryptedForm.id).data,
}
console.log("Decrypted: " + decryptedForm.test);
});
我的问题是我一直回来(cryptob.js是我的文件名,用browserify生成)
Uncaught URIError: URI malformed
at decodeURIComponent (<anonymous>)
at Object.util.decodeUtf8 (cryptob.js:24437)
at ByteStringBuffer.util.ByteStringBuffer.toString (cryptob.js:23490)
at HTMLFormElement.<anonymous> (cryptob.js:1282)
at HTMLFormElement.dispatch (jquery-3.1.1.slim.min.js:3)
at HTMLFormElement.q.handle (jquery-3.1.1.slim.min.js:3)
致电encrypt()
。
这里有this个答案,建议包含一个特殊的元标记。我已经这样做但它仍然无效。由于网上的一些资源说它与UTF-8编码有关,我试图替换
cipher.update(forge.util.createBuffer("testing"));
与
cipher.update(forge.util.createBuffer(encodeURIComponent("testing")));
或
cipher.update(forge.util.createBuffer("testing", 'utf8'));
但它也不起作用(基于encodeURIComponent(str))。
您可以测试伪造here,如果您运行此代码(这基本上就是我正在做的)
var forge = require("node-forge")
// generate a random key and IV
var key = forge.util.encode64("12354523465");
var iv = forge.util.encode64("2315");
// encrypt some bytes
var cipher = forge.rc2.createEncryptionCipher(key);
cipher.start(iv);
cipher.update(forge.util.createBuffer("testing"));
cipher.finish();
var encrypted = cipher.output;
console.log(encrypted);
// decrypt some bytes
var cipher = forge.rc2.createDecryptionCipher(key);
cipher.start(iv);
cipher.update(encrypted);
cipher.finish();
console.log(cipher.output.data)
它工作正常。
我该如何解决这个问题?
答案 0 :(得分:0)
看起来这个错误实际上发生在toString中,你生成_key和_iv。
尝试使用一些硬编码字符串进行测试,如您发布的示例代码中所使用的那样。然后,使用一种方法为密钥和IV生成随机字节字符串。
此外,对于AES-256,密钥应具有32个字节(而不是位)的熵。 IV应该有16个字节的熵。