PR

Go言語(Golang)1.27で追加された「crypto/mldsa」パッケージとは?|ML-DSA・ポスト量子暗号(PQC)を解説

2. 基礎

こんにちは。Tomoyuki(@tomoyuki65)です。

Go言語(Golang)のバージョン1.27では、「crypto/mldsa」パッケージが追加されました。

これはML-DSA(Module-Lattice-Based Digital Signature Algorithm)による電子署名を扱うための標準ライブラリです。

この記事では、そんな「crypto/mldsa」パッケージについてご紹介します。

 

Go言語(Golang)1.27で追加された「crypto/mldsa」パッケージとは?|ML-DSA・ポスト量子暗号(PQC)を解説

ML-DSAとは?

ML-DSA(Module-Lattice-Based Digital Signature Algorithm)とは、ポスト量子暗号(PQC)向けに設計された電子署名アルゴリズムです。

 

ポスト量子暗号(PQC)とは?

ポスト量子暗号(PQC: Post-Quantum Cryptography)とは、将来実用的な量子コンピュータが登場しても安全性を維持できるように設計された暗号技術です。

現在広く利用されているRSAやECDSAなどの公開鍵暗号は、強力な量子コンピュータが実現すると安全性が破られる可能性があるため、量子コンピュータを使っても効率的に解くことが難しいと考えられている数学的問題を利用し、量子コンピュータによる攻撃への耐性を持つ新しい暗号方式が研究・標準化されています。

 

電子署名アルゴリズムとは?

電子署名アルゴリズムとは、データの作成者が本人であることや、データが改ざんされていないことを確認するために使用されるアルゴリズムです。

電子署名では、基本的に「秘密鍵」と「公開鍵」の2つの鍵を使用し、秘密鍵でデータに署名し、受信者は公開鍵を使って署名を検証することで、『本当に本人が署名したものか』、『署名後にデータが改ざんされていないか』を確認することが可能です。

 

「crypto/mldsa」パッケージの使い方

例えば「crypto/mldsa」パッケージを利用し、秘密鍵と公開鍵の作成から署名を検証するサンプルコードとしては以下の通りです。

package main

import (
    "crypto/mldsa"
    "fmt"
)

func main() {
    // ① 秘密鍵を生成
    privateKey, err := mldsa.GenerateKey(mldsa.MLDSA44())
    if err != nil {
        panic(err)
    }

    // ② 公開鍵を取得
    publicKey := privateKey.PublicKey()

    // ③ メッセージに署名
    message := []byte("Hello, ML-DSA!")

    signature, err := privateKey.Sign(
        nil,
        message,
        nil,
    )
    if err != nil {
        panic(err)
    }

    fmt.Printf("署名: %d bytes\n", len(signature))

    // ④ 署名を検証
    if err = mldsa.Verify(
        publicKey,
        message,
        signature,
        nil,
    ); err != nil {
        fmt.Println("署名NG")
    } else {
        fmt.Println("署名OK")
    }
}

※MLDSA44を利用して秘密鍵を生成(ほとんどのアプリケーションではこれでよい模様)

 

実行結果

署名: 2420 bytes
署名OK

 

また、署名にコンテキストを付けたい場合は、以下のようにすることも可能です。

package main

import (
    "crypto/mldsa"
    "fmt"
)

func main() {
    // ① 秘密鍵を生成
    privateKey, err := mldsa.GenerateKey(mldsa.MLDSA44())
    if err != nil {
        panic(err)
    }

    // ② 公開鍵を取得
    publicKey := privateKey.PublicKey()

    // ③ メッセージに署名(コンテキストも追加)
    message := []byte("Hello, ML-DSA!")

    options := &mldsa.Options{
        Context: "my-app",
    }

    signature, err := privateKey.Sign(
        nil,
        message,
        options,
    )
    if err != nil {
        panic(err)
    }

    fmt.Printf("署名: %d bytes\n", len(signature))

    // ④ 署名を検証(コンテキストも利用)
    if err = mldsa.Verify(
        publicKey,
        message,
        signature,
        options,
    ); err != nil {
        fmt.Println("署名NG")
    } else {
        fmt.Println("署名OK")
    }
}

 

実行結果

署名: 2420 bytes
署名OK

 

ML-DSAの種類一覧

ML-DSA-44 ML-DSA-65 ML-DSA-87
想定セキュリティレベル 約128-bit 約192-bit 約256-bit
公開鍵 1,312 bytes 1,952 bytes 2,592 bytes
秘密鍵 2,560 bytes 4,032 bytes 4,896 bytes
署名 2,420 bytes 3,309 bytes 4,627 bytes
特徴 小さめ・高速 中間 最も高い安全性

 

スポンサーリンク

最後に

今回は「crypto/mldsa」パッケージについてご紹介しました。

今すぐ使うようなパッケージではありませんが、将来的にML-DSAによる電子署名を扱う可能性があるため、Goの標準ライブラリでML-DSAが使えるようになった点については、覚えておきましょう。

 

SubstackでITエンジニア向けニュースレター(メルマガ)を始めました!
こんにちは。Tomoyuki(@tomoyuki65)です。最近はどのSNSもアルゴリズム(どの投稿を誰に表示するかを決める仕組み)中心のタイムライン(投稿が流れてくる画面)になっていて、フォローしている人の投稿が見つけにくく、逆にフォロー...

 

この記事を書いた人
Tomoyuki

SE→ブロガーを経て、現在はSoftware Engineer(Web/Gopher)をしています!

Tomoyukiをフォローする
2. 基礎
スポンサーリンク
Tomoyukiをフォローする

コメント

タイトルとURLをコピーしました