メインコンテンツまでスキップ

Moveでの暗号化

暗号化は、ブロックチェーンシステムでのデータのセキュリティ、整合性、機密性、不変性を確保する上で重要な役割を果たします。Move用のAptosアダプターは、開発者へ一連の暗号化プリミティブを提供し、この需要を満たします。このドキュメントでは、Move on Aptosが提供する暗号化機能について詳しく解説し、その設計の原動力となる原則を解説します。

暗号プリミティブ

MoveはAptosアダプタを通じて、いくつかの基本的な暗号化ツールを網羅しています。

  1. 暗号化ハッシュ関数 – 可変サイズの入力データから固定サイズの出力(ハッシュ)を生成するアルゴリズム。サポートされている関数は、SHA2-256、SHA3-256、Keccak256、Blake2b-256です。
  2. デジタル署名検証 – メッセージの整合性の確保、送信者の認証、否認防止の確保、またはそれらの組み合わせのためメッセージに署名するアルゴリズム。サポートされている署名スキームは、Ed25519、ECDSA、BLS等です。
  3. 楕円曲線演算 – 楕円曲線は、デジタル署名、公開鍵暗号化、検証可能な秘密共有などの高度な暗号化プリミティブの構築ブロックのひとつです。サポートされている曲線は、Ristretto255とBLS12-381等です。
  4. ゼロ知識証明(ZKP) – これらの暗号技術により、当事者は次の事を証明出来ます。秘密の証言 ww を漏らさず保持させ、関係 R(x;w)R(x; w)は公開ステートメント xx で満たされます。現在、Groth16 ZKP 検証と Bulletproofs ZK 範囲証明検証をサポートしています。

MoveへのAptos暗号化拡張機能の設計と統合は、以下の3つの基本原則へ従い行われます。

  1. 経済的なガス使用 – keyプリミティブをMoveネイティブ関数として実装する事で、Move開発者のガスコストを最小限に抑える事を目指します。 例えばBLS signatures over BLS12-381 elliptic curvesのモジュールを御覧下さい。

  2. 型安全APIs – タイプセーフは、APIが一般的な間違いへの耐性の確立で、コードの信頼性を高め、効率的な開発プロセスを促進します。例はEd25519署名モジュールを御覧下さい。

  3. 開発者のエンパワーメント – ネイティブ関数が利用できない場合は、有限体アーベル群 等の抽象的な暗号化ビルディングブロックの上へ開発者が独自の暗号化プリミティブを構築出来る権利を与えます。詳細はaptos_std::crypto_algebraモジュールを御覧下さい。

読み進めて、これら拡張機能の背後の複雑な仕組みや拡張機能で実現される応用範囲を詳しく調べて下さい。この主題最の包括的な理解は暗号化Moveモジュールコードを御覧下さい。

暗号ハッシュ関数

開発者はaptos_std::aptos_hashモジュールを介してMoveで多くの暗号化ハッシュ関数を使用出来ます。

ハッシュ関数ハッシュサイズ(ビット)1KiB のハッシュコスト (内部ガス単位)衝突耐性セキュリティ(ビット)
Keccak2562561,001,600128
SHA2-2562561,084,000128
SHA2-5125121,293,600256
SHA3-2562561,001,600128
SHA3-5125121,114,000256
RIPEMD1601601,084,00080 (弱い)
Blake2b-256256342,200128

全てのハッシュ関数は同じセキュリティ特性(一方向性、衝突耐性など)を持ちますが、セキュリティレベルは異なります。

注意

RIPEMD160はセキュリティレベルが80ビットであるため、衝突耐性関数としては使用しないで下さい。これは主に下位互換性の理由でサポートされています。例えば、Bitcoinアドレスの導出はRIPEMD160へ依存しています。

これらの関数の一部は、他のチェーンとの相互運用性のため使用出来ます(例:aptos_std::aptos_hash::keccak256を介して Ethereum Merkle 証明を検証する)。aptos_std::aptos_hash::blake2b_256等、その他の関数はガスコストが低くなります。一般に、ハッシュ関数の種類が多い程、セキュリティと他のオフチェーン暗号化システムとの相互運用性の両面で開発者の自由度が高まります。

デジタル署名の検証

これで、開発者は 型安全な APIを使用し、Moveで多種類のデジタル署名を検証する事が出来ます。

署名方式曲線署名サイズ(バイト)PK サイズ (バイト)柔軟性仮定長所短所
ECDSAsecp256k16464有りGGM幅広い採用セキュリティ証明
Ed25519Edwards 255196432無しDLA, ROM速い細かい
マルチEd25519Edwards 255194+t644 + t \cdot 64n32n \cdot 32無しDLA, ROM導入が簡単大きな署名サイズ
最小PK BLSBLS12-3819648無しCDH, ROM多用途検証が遅い
最小署名 BLSBLS12-3814896無しCDH, ROM多用途検証が遅い
注記
  • CDHは 「計算的ディフィー・ヘルマン仮定」 の略です。
  • DLAは 「離散対数仮定」 の略です。
  • GGMは 「ジェネリックグループモデル」 の略です。
  • ROMは 「ランダムオラクルモデル」 の略です。

上記デジタル署名モジュールは、スマートコントラクトベースのウォレット、エアドロップの安全な請求メカニズム、またはdappのデジタル署名ベースのアクセス制御メカニズムの構築で使用出来ます。

Dappでの署名スキームの適切な選択は、多くの要因で決まります。

  1. 下位互換性

    • dappのユーザーベースが殆ど特定の署名メカニズムを使用している場合、移行と採用を容易にするため、そのメカニズムをサポートするのが妥当です。
      • 例: ユーザーが主に Ed25519 を使用して署名する場合、それが論理的な選択となります。
  2. 実装の容易さ

    • 理論的には正しいものの、複雑なプロトコルを実際実装するのは難しい場合が有ります。
      • 例: Ed25519のしきい値プロトコルtt-out-of-nnは存在しますが、署名者側の複雑さのため、より簡単な署名実装のMultiEd25519が開発者へ推奨される可能性があります。
  3. 効率

    • dappの要件次第で、効率性のある側面を他より優先する場合があります。
      • 署名サイズ対公開鍵サイズ: アプリケーションによっては小さな署名フットプリントを優先しますが、コンパクトなPKを重視するものもあります。
      • 署名時間対検証時間: 特定のdappでは署名速度が重要な場合がありますが、他のdappでは迅速な署名検証が優先される場合があります。
  4. セキュリティ分析

    • 署名スキームの基本的な前提と潜在的な脆弱性を考慮する事が重要です。
      • 例: ECDSAのセキュリティは、ジェネリックグループモデル(GGM)等の強力な仮定の下で証明されています。
      • マリアビリティの懸念: 一部の署名方式は改ざんの影響を受けやすく、有効な署σ\sigmaが同じメッセージmmに対し、別のまだ有効な署名σ\sigmaへ改変される可能性があります。
  5. 汎用性

    • 署名スキームの適応性と柔軟性を考慮することは重要であり、これでdappの暗号化需要へ適応出来ます。
      • 例:しきい値 tt-out-of-nn BLS署名の実装は非常に簡単です。
注意

慎重かつ原則的な設計1にもかかわらず、Ed25519は、実装の巧妙さで知られています。例えば、異なる実装では、特にバッチ検証が採用されている場合2,^,3、署名の有効性について簡単に反対する可能性があります。

ヒント

MinPK BLS用のAptosのaptos_std::bls12381のモジュールは、個別の署名、複数の署名、集約署名、しきい値署名の検証をサポートしています。

楕円曲線算術

ハッシュ関数デジタル署名モジュールは、殆どのアプリケーションへ充分な機能を提供しますが、一部のアプリケーションではより強力な暗号化が必要となります。

通常、そのようなアプリケーションの開発者は、必要な暗号化機能がAptosMoveフレームワークMoveネイティブ関数として効率的に実装されるまで待たなければなりません。そのかわり、基本的な構築ブロックを公開し、 開発者がMove言語で直接独自の暗号化プリミティブを効率良く実装出来ます。

現在、2つの一般的な楕円曲線グループとその関連する有限フィールドで低レベルの算術演算を公開しています。

  1. Ristretto255、aptos_std::ristretto255経由。
  2. BLS12-381、aptos_std::crypto_algebra 及びaptos_std::bls12381_algebra経由。

これらのモジュールは、次のような低レベルの演算をサポートします。

  • 楕円曲線点のスカラー乗算
  • マルチスカラー乗算(MSM)
  • ペアリング
  • スカラー加算、乗算、反転
  • スカラーまたはポイントへのハッシュ
  • などなど

上へ構築できる強力なアプリケーションの例は以下を含みます。

  1. 有効性ロールアップgroth16zkSNARK 検証者例を御覧下さい。
  2. ランダム性ベースのゲームdrand検証者例を御覧下さい。
  3. プライバシー保護アプリケーションveiled_coinを御覧下さい。

リストレット255算術

aptos_std::ristretto255モジュールは、一般的なRistretto255曲線上の楕円曲線演算のサポートを提供します。

Ristretto255の主な利点のひとつは(Edwards 25519曲線とは異なり)素数位数群であることです。 これにより、上へ構築された高レベル暗号システムに対する小サブグループ攻撃が除去されます。Ristretto255シリアル化は標準的であり、逆シリアル化では標準エンコーディングのみが受け入れられるため、高レベルプロトコルでの改ざん性の問題が除去されます。

このモジュールがいくつかの暗号化プリミティブの実装で役立つ事が証明されています。

  1. ゼロ知識Σ\Sigma-プロトコルveiled_coinを御覧下さい。
  2. ElGamal encryption –aptos_std::ristretto255_elgamalを御覧下さい。
  3. ペダーセンコミットメント –aptos_std::ristretto255_pedersenを御覧下さい。
  4. Bulletproofs ZKレンジプルーフ4aptos_std::ristretto255_bulletproofsを御覧下さい。

ristretto255上で構築する暗号システムのアイデアが必要ですか? 簡単に構築できる人気のプリミティブは、Ristretto255グループ上のSchnorr 署名の強化バージョンであるschnorrkel署名スキームです。

一般的な楕円曲線算術

ひとつの曲線よりも優れているものは何でしょうか? 曲線がもっと有る事です!

aptos_std::crypto_algebra は、ペアリングに適した曲線を含む、サポートされているあらゆる楕円曲線用の楕円曲線算術演算を提供します。その結果Move開発者は、現在サポートされている、または将来サポートされる予定のあらゆる曲線用上の、暗号システムを凡用的に実装出来ます。

コード内へ特定の曲線を固定する(例えば、 Ristretto255モジュールに対して実装する)場合と比較して、このアプローチは柔軟性が高く、異なる曲線に移行する際の開発時間を短縮出来ます。

現在、このcrypto_algebraモジュールは BLS12-381 曲線 (aptos_std::bls12381_algebraで宣言されたマーカータイプ経由aptos_std::bls12381_algebra)での算術のみをサポートしていますが、将来的にはさらに多くの曲線がサポートされる予定です (例: BN254、Ristretto255、BLS12-377、BW6-761、secp256k1、secp256r1)。

例えばMove開発者は、実装で曲線型の型引数を使用する事で、人気のBoneh-Lynn-Shacham(BLS)署名スキームをあらゆる曲線上で汎用的な実装が出来ます。

あらゆる曲線上での凡用BLS署名検証
use std::option;
use aptos_std::crypto_algebra::{eq, pairing, one, deserialize, hash_to};

/// ペアリングに適したグループトリプル`Gr1`、 `Gr2`、`GrT`上で機能するBLS署名検証関数の例。署名が有るのはは`Gr1`内、PKsは`Gr2`内。
/// ポイントは`FormatG1`と`FormatG2`の形式を使用してシリアライズ化され、ハッシュ化メソッドは`HashMethod`です。
///
/// 警告: この例は型安全では無いため、恐らく実稼動コードにはあまり適していません。
public fun bls_verify_sig<Gr1, Gr2, GrT, FormatG1, FormatG2, HashMethod>(
dst: vector<u8>,
signature: vector<u8>,
message: vector<u8>,
public_key: vector<u8>): bool
{
let sig = option::extract(&mut deserialize<Gr1, FormatG1>(&signature));
let pk = option::extract(&mut deserialize<Gr2, FormatG2>(&public_key));
let hash = hash_to<Gr1, HashMethod>(&dst, &message);

// $e(H(m), pk) = e(sig, g_2)$ かどうか確認します。$g_2$ は $\mathbb{G}_2$ を生成します。
eq(
&pairing<Gr1, Gr2, GrT>(&hash, &pk),
&pairing<Gr1, Gr2, GrT>(&sig, &one<Gr2>())
)
}

上記のbls_verify_sig 汎用 関数を使用し、開発者はサポートされている(ペアリングに適した)あらゆる曲線でBLS署名を検証出来ます。 例えば、適切なBLS12-381マーカー型を型引数として上記の関数を呼び出す事で、BLS12-381曲線でMinSig BLS署名を検証出来ます。

BLS12-381でのMinSig BLS署名検証
use aptos_std::bls12381_algebra::{
G1, G2, Gt, FormatG1Compr, FormatG2Compr, HashG1XmdSha256SswuRo
};

// BLS12-381j曲線上のMinSig BLS署名が検証出来なかった場合、コード1で中止します。

assert(
bls_verify_sig<G1, G2, Gt, FormatG1Compr, FormatG2Compr, HashG1XmdSha256SswuRo>(
dst, signature, message, public_key
),
1
);

crypto_algebraモジュールの使用例は、Moveの例を御確認下さい。

  1. あらゆる曲線上でのVerifying Groth16 zkSNARK proofs
  2. drand`ビーコンからのランダム性の検証

強力な暗号化アプリケーションの構築

隠されたコイン

このveiled_coin上記のRistretto255モジュールを使用して、コインの残高とトランザクションに合理的な機密性レイヤーを追加する方法を示します。

具体的には、ユーザーは残高を隠し、バリデーターを含む全ての人から隠す事が出来ます。更に、ユーザーは、バリデーターを含む全ての人から取引金額を隠す隠蔽トランザクションを送信出来ます。重要な注意点は、隠蔽トランザクションでは送信者または受信者の身元が隠されないことです。

危険

このモジュールは教育用です。本番環境へは対応していません。使用すると資金が失われる可能性があります。

Groth16 zkSNARK検証者

このgroth16は、最短かつ最速で検証可能な汎用のゼロ知識証明であるGroth16 zkSNARK証明5を検証する方法を示します。重要なのは、上記の様に、この実装はどの曲線に対しても 汎用的 であるため、Move開発者が自分の好きな(サポートされている)曲線での使用が簡単な事です。

注意

このコードは第三者機関の監査を受けていません。本番システムで使用する場合は、自己責任で進めてください。

drandビーコンからのランダム性の検証

このdrand は、drandランダム性ビーコンから公開ランダム性を検証する方法を示します。このランダム性は、ゲームやその他のチャンスベースのスマートコントラクトで使用出来ます。

lottery.movedrandランダム性へ基づいて実装された宝くじの簡単な例を示します。

注意

このコードは第三者機関による監査を受けていません。本番システムで使用する場合は、自己責任で進めて下さい。

drand上で構築できる別のアプリケーションは、タイムロック暗号化6です。これによりユーザーは情報を暗号化して、将来のブロックでのみ復号化出来ます。現在実装は有りませんが、読者は実装する事をお勧めします。

Footnotes

  1. ed25519: Ed25519:高速高セキュリティ署名、Daniel J. Bernstein、Niels Duif、Tanja Lange、Peter Schwabe、Bo-Yin Yang著、 https://ed25519.cr.yp.to/

  2. 価格低下: 255:19AMです。 あなたの検証基準が何か知っていますか?, Henry de Valence著、 https://hdevalence.ca/blog/2020-10-04-its-25519am

  3. eddsa: 多くのEdDSAを制御する、Konstantinos Chalkias、François Garillot、Valeria Nikolaenko著、in SSR 2020, https://dl.acm.org/doi/abs/10.1007/978-3-030-64357-7_4

  4. 防弾: Bulletproofs: 機密トランザクション等のための短い証明; by B. Bünz、J. Bootle、D. Boneh、A. Poelstra、P. Wuille、G. Maxwell著; 2018 IEEE セキュリティとプライバシー関連の討論会

  5. groth16: ペアリングベースの非対話型引数のサイズについて; Groth、Jens著; EUROCRYPT 2016

  6. tlock: tlock: しきい値 BLS からの実用的なタイムロック暗号化; Nicolas Gailly、Kelsey Melissaris、Yolan Romailler著; https://eprint.iacr.org/2023/189