2017-08-21 44 views
0

AESを使用してフォームをサーバーに送信する前に、node forgeを使用してフォームを暗号化しています。未知のURIError:jQueryでURIの形式が正しくないエラー

今の暗号化部分のコードは

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がある保つことである(まだ投稿ではない)であります

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) 

を呼び出すと、私のファイルの名前です。。

ここにthisという回答があり、特別なメタタグを含めることをお勧めします。私はそれをしましたが、それはまだ動作しません。オンラインいくつかのリソースは、それがUTF-8エンコーディングに関係していると言うので、私は

cipher.update(forge.util.createBuffer(encodeURIComponent("testing"))); 

または

cipher.update(forge.util.createBuffer("testing", 'utf8')); 

cipher.update(forge.util.createBuffer("testing")); 

を交換しようとしたが、それはどちらか動作しませんでした(上のベース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

RC2はAESとは異なる暗号です。ドキュメントへのアクセスには、 'var cipher = forge.cipher.createCipher( 'AES-CBC'、key);または' forge.aes.createEncryptionCipher(key); 'を使用してください。また、CBCモードは使用しないでください。 GCMモードを使用する方が良いです。 –

答えて

0

このエラーは、実際に_keyおよび_ivを生成するtoStringで発生しているようです。

投稿したサンプルコードで使用されているように、ハードコードされた文字列でテストしてみてください。次に、キーとIVのランダムなバイト文字列を生成するメソッドを使用します。

また、AES-256の場合、キーは32バイト(ビット数ではない)のエントロピーを持つ必要があります。 IVには16バイトのエントロピーが必要です。

関連する問題