Symbol from NEMのSDKを利用して暗号と署名検証を行う方法


今回はsymbol-sdkを利用してブロックチェーンを使わずに暗号化と署名検証を使う方法を説明します。
(※sdk非推奨の方法を記載していたのでコメントアウトしました)

事前準備

スクリプト埋め込み


(script = document.createElement('script')).src = 'https://xembook.github.io/nem2-browserify/symbol-sdk-pack-0.21.0.js';
document.getElementsByTagName('head')[0].appendChild(script);

chromeのコンソールを開いてsymbol-sdkのスクリプトを埋め込んでください。

ライブラリインポートとアカウント生成

nem = require("/node_modules/symbol-sdk");

alice = nem.Account.generateNewAccount(nem.NetworkType.TEST_NET);
bob = nem.Account.generateNewAccount(nem.NetworkType.TEST_NET);

今回の暗号化や署名に使用するライブラリのインポートとアカウントを生成しておきます。

暗号化

message = 'Symbol from NEM!';
//encodedMessage = nem.Crypto.encode(alice.privateKey,bob.publicKey,message);
encryptedMessage = alice.encryptMessage(message ,bob.publicAccount);

送信者の秘密鍵、受信者の公開鍵、メッセージの順に指定します。
受信者の公開鍵でメッセージを暗号化する、という点がポイントです。

"294C8979156C0D941270BAC191F7C689E93371EDBC36ADD8B920CF494012A97BA2D1A3759F9A6D55D5957E9D"

暗号化できました。

復号化

/*
decodedHex = nem.Crypto.decode(
  bob.privateKey, 
  alice.publicKey,
  "2561a6aa1c5ea51b3971fc907d28678db6d28c568a30249541eb9d411eced23ee0f432a58459acb741f7b963"
)
nem.Convert.decodeHex(decodedHex)
*/
bob.decryptMessage(
  new nem.EncryptedMessage(
    "294C8979156C0D941270BAC191F7C689E93371EDBC36ADD8B920CF494012A97BA2D1A3759F9A6D55D5957E9D"
  ),
  alice.publicAccount
).payload

受信者の秘密鍵、送信者の公開鍵、暗号化メッセージの順に指定します。
受信者の秘密鍵で復号化するという点がポイントです。
出力されたHEX文字をデコードします。

"Symbol from NEM!"

無事復号化されました。

署名

payload = nem.Convert.hexToUint8(nem.Convert.utf8ToHex("Symbol from NEM"));
signature = nem.Convert.utf8ToHex(nem.KeyPair.sign(alice.keyPair, payload));

署名したいメッセージをHEX変換してUint8Arrayに変換します。
署名したいアカウントのキーペアを指定して署名、HEX変換します。
メッセージを作成したアカウントの秘密鍵で署名するというのがポイントです。

"7FCF7614D60BF4506DEC7D1B55AA1A0972881FA8FC40D0D0FBAAAF77E036E7988270E57631D49FCE253C4FB992E17C9360FA948B6626B2954E7DAB84DA7D6E01"

署名テキストが出力されました。

検証

nem.KeyPair.verify(
  alice.keyPair.publicKey,
  nem.Convert.hexToUint8(nem.Convert.utf8ToHex("Symbol from NEM")),
  nem.Convert.hexToUint8( 
 "7FCF7614D60BF4506DEC7D1B55AA1A0972881FA8FC40D0D0FBAAAF77E036E7988270E57631D49FCE253C4FB992E17C9360FA948B6626B2954E7DAB84DA7D6E01")
)

検証したいアカウントの公開鍵、検証したいメッセージ、署名テキストの順で指定します。
メッセージを作成したアカウントの公開鍵で検証する、というのがポイントです。

true

無事、trueが出力されました。

このように、暗号、復号、署名、検証はブロックチェーンと切り離して使うことができます。場合によってはこれらの出力結果をメールでやりとりして信頼性検証を行うこともできます。

では、ブロックチェーンを使うことの意味とは何でしょうか?
このことを、ぜひ一度振り返って考えてみるきっかけにしていただければ幸いです。