📑

[Astar]コントラクト備忘録45(Polkadot.jsを使ってメッセージのエンコード、デコードを実施しよう!)

2023/03/13に公開

本日は、Polkadot.jsを用いた、メッセージのエンコード、デコードを見ていきましょう。

こちらの公式サイトを元にしています。
https://polkadot.js.org/docs/util-crypto/examples/encrypt-decrypt

コードがこちらになります。

一つずつ見ていきましょう。


https://polkadot.js.org/docs/util-crypto/examples/encrypt-decrypt

まずは、こちらからです。

const secret = randomAsU8a();

randomAsU8a()によって、ランダムなバイト配列を作成しています。

ちなみに、U8aの「a」は「Array」の「a」です。

後々、こちらを秘密鍵として使用します。

chatGPT

次はこちらです。

const messagePreEncryption = stringToU8a('super secret message');

stringToU8aによって、文字列をバイト配列に変換しています。

chatGPT

次はこちらです。

// Encrypt the message
  const { encrypted, nonce } = naclEncrypt(messagePreEncryption, secret);

「naclEncrypt」関数を用いて、メッセージを暗号化しています。

ここで、今回用意した、秘密鍵と、それとは別のランダムなバイト配列を組み合わせてエフェメラル鍵を作成しています。

使用した、ランダムなバイト配列はnonceに返しています。

chatGPT

なお、エフェメラル鍵とは、下のように、一時的に生成され、使用が終われば廃棄される鍵です。

chatGPT

なお、naclEncryptの「nacl」とは「Networking And Cryptography Library」の略で、暗号化技術を提供しているオープンソースプロジェクトとのことです。


chatGPT

一つ飛ばして、次はこちらです。

// Decrypt the message
  const messageDecrypted = naclDecrypt(encrypted, nonce, secret);

先ほど、秘密鍵とnonceを用いて、エフェメラル鍵を作成していたので、この二つと暗号化されたものを渡し、デコードしています。


chatGPT

最後はこちらです。

// Convert each Uint8Array to a string for comparison
  const isMatch = u8aToString(messagePreEncryption) === u8aToString(messageDecrypted);

「u8aToString」関数を使って、バイト配列を文字列に変換しています。

chatGPT

下のように、うまく実行できていることも確認できました。

今回は以上です。

import { naclDecrypt, naclEncrypt,randomAsU8a }  from '@polkadot/util-crypto'
import { stringToU8a, u8aToString } from '@polkadot/util'

const inter = Inter({ subsets: ['latin'] })

export default function Home() {

  async function encryptMessage () {
    const secret = randomAsU8a();
    const messagePreEncryption = stringToU8a('super secret message');

    // Encrypt the message
    const { encrypted, nonce } = naclEncrypt(messagePreEncryption, secret);

    // Show contents of the encrypted message
    console.log(`Encrypted message: ${JSON.stringify(encrypted, null, 2)}`);

    // Decrypt the message
    const messageDecrypted = naclDecrypt(encrypted, nonce, secret);

    // Convert each Uint8Array to a string for comparison
    const isMatch = u8aToString(messagePreEncryption) === u8aToString(messageDecrypted);

    // Verify that the decrypted message matches the original message
    console.log(`Does the decrypted message match the original message? ${isMatch}`);
  
  }
<button onClick={encryptMessage}>encrypt Message test</button>

Discussion