NodeはAES暗号化を実現し、結果は「byte」と出力される.

3169 ワード

NodeはAES暗号化を実現し、結果は「byte」と出力される。


最近、AES(Advanced Encryption Standard)暗号化アルゴリズムを採用したプラットフォームのインタフェースを接続する必要があります.暗号化モードはAES-128-CBで、符号化方式はAES/CBC/PKCS 5 Paddingで、鍵とベクトルはいずれも16ビットです.暗号化の結果はByte配列です.
ノードを使うのが悪いところは、サードパーティインタフェースは一般的にノードの実現がないので、自分で書くしかないということです.ノードには暗号化されたライブラリcryptoが提供されており、公式ドキュメントhttps://nodejs.org/api/crypto.htmlああ、今回の暗号化を実現するために必要なものを見つけることができます。を参照してください.
crypto.createCipheriv(algorithm, key, iv)

このメソッドはcryptoオブジェクトを作成し、情報を暗号化します.パラメータkeyとivはスプーンとベクトルです.パラメータalgorithmとは、暗号化アルゴリズム、すなわちOpenSSLがサポートするすべてのcipher暗号化アルゴリズムを指し、以下のコマンドを使用してすべてのアルゴリズムをリストします.
 openssl list-cipher-algorithms 

もちろん、今回使用したAES-128-CBC暗号化アルゴリズムはサポートされているに違いありません.くだらないことは言わないで、直接コードをつけます.
/**
 *
 * @param data  
 * @param key  
 * @param algorithm  
 * @param clearEncoding  
 * @param cipherEncoding   
 * @param iv   
 * @returns {*}buffer  
 */
function encrypt(data, key, iv, algorithm) {
  //  crypto  
  var cipher = crypto.createCipheriv(algorithm, key, iv);
  //     
  cipher.setAutoPadding(true);
  var cipherChunks = [];
  //   update  。
  var upate = cipher.update(new Buffer(data));
  cipherChunks.push(upate);
  //  
  cipherChunks.push(cipher.final());
  return bufferToByte(cipherChunks);
}
var encryptData = encrypt(' ', key, iv, 'AES-128-CBC');
console.log('  :', encryptData);

ここではupdate+finalの結果が最終結果であることに注意し、finalの結果だけでは足りない点があります.
ドキュメントを見ると、cipherのデフォルトの出力フォーマットはBufferであり、NodeのBufferはバイナリ列であることがわかります.Bufferの詳細については、この記事深入浅出Node.js(六):Bufferのことを参照してください.
需要では出力byte配列が要求されるが、Nodeにはbyteタイプはなく、Javaならではの値範囲は-127~127である.ない以上、Buffer to byte関数bufferToByteを自分で書きましょう.
/**
 *   buffer   byte
 * @param buffers
 * @returns {string}
 */
function bufferToByte(buffers) {
  var rt = [];
  for (var i = 0; i < buffers.length; i++) {
    var buffer = buffers[i];
    for (var j = 0; j < buffer.length; j++) {
      var c = buffer.readInt8(j);
      rt.push(c);
    }
  }
  //console.log('rt', rt);
  return rt.join(' ');
}

この方法は主にBufferが提供するreadInt 8関数を用い,bufferから8ビットのバイナリ数を読むたびに,2^8はちょうど-127〜127,すなわち我々が望む「byte」であることを意味する.最終出力:
  : -18 22 105 -22 84 -106 29 -24 -23 -91 -92 -37 20 48 58 51 -34 -65 27 -106 -13 109 25 66 55 -3 -7 4 -25 113 97 6

まとめ:

  • cipher暗号化の完全な結果はupdate+finalの結果である.
  • Bufferはバイナリ数を読み取る方法を提供し、readInt 8はそのうちの1つにすぎない.詳細は公式ドキュメントを参照:https://nodejs.org/api/buffer.html#buffer_class_buffer
  • 補コードについては、今回はデフォルトのsettAutoPaddingを使用してニーズを満たしています.特別な補コード方式が必要な場合は、ドキュメントには~
  • と書かれています.
    参照:http://yijiebuyi.com/blog/13e2ae33082ac12ba4946b033be04bb5.html