[Astar]コントラクト備忘録45(Polkadot.jsを使ってメッセージのエンコード、デコードを実施しよう!)
本日は、Polkadot.jsを用いた、メッセージのエンコード、デコードを見ていきましょう。
こちらの公式サイトを元にしています。
コードがこちらになります。
一つずつ見ていきましょう。
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