「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > 対称暗号化: 暗号化のシークレット ハンドシェイク、Go Crypto 4

対称暗号化: 暗号化のシークレット ハンドシェイク、Go Crypto 4

2024 年 11 月 4 日に公開
ブラウズ:689

Symmetric Encryption: The Secret Handshake of Cryptography, Go Crypto 4

暗号愛好家の皆さん、こんにちは!対称暗号化の世界に飛び込む準備はできましたか?これは、デジタル世界の秘密の握手、つまり二者が自分たちだけが理解できる情報を共有する方法であると考えてください。分析して、Go がこれらのデジタル シークレット ハンドシェイクの実装にどのように役立つかを見てみましょう!

ブロック暗号: 構成要素

まず、ブロック暗号があります。これらはデジタル時代の暗号ホイールのようなもので、固定サイズのデータ​​の塊を処理します。ここでの主役は AES (Advanced Encryption Standard) です。

AES: ヘビー級チャンピオン

AES は暗号化のスイス アーミー ナイフのようなもので、多用途で強力で広く使用されています。 Go での設定方法は次のとおりです:

import (
    "crypto/aes"
    "crypto/rand"
    "fmt"
)

func main() {
    // Let's create a 256-bit key (32 bytes)
    key := make([]byte, 32)
    if _, err := rand.Read(key); err != nil {
        panic("Oops, the universe's randomness machine broke!")
    }

    block, err := aes.NewCipher(key)
    if err != nil {
        panic("AES threw a tantrum!")
    }

    fmt.Printf("Our AES block size: %d bytes\n", block.BlockSize())
}

これで AES が設定されますが、ブロック暗号だけでは車輪のない車のようなものであることを覚えておいてください。機能はしますが、まだあまり役に立ちません。そこで動作モードが登場しますが、それについては後ほど説明します。

ストリーム暗号: 暗号化の流れる川

次にストリーム暗号です。これらは、ランダムに見えるビットの終わりのないストリームのようなもので、データと XOR して暗号化します。 Go は、現代的で高速なストリーム暗号である ChaCha20 を提供します。

ChaCha20: ザ・ニュー・キッド・オン・ザ・ブロック

ChaCha20 の使用方法は次のとおりです:

import (
    "fmt"
    "golang.org/x/crypto/chacha20"
)

func main() {
    key := make([]byte, chacha20.KeySize)
    nonce := make([]byte, chacha20.NonceSize)

    cipher, err := chacha20.NewUnauthenticatedCipher(key, nonce)
    if err != nil {
        panic("ChaCha20 isn't feeling chatty today!")
    }

    secretMessage := []byte("ChaCha20 is my new dance move!")
    encrypted := make([]byte, len(secretMessage))
    cipher.XORKeyStream(encrypted, secretMessage)

    fmt.Printf("Our secret dance move, encrypted: %x\n", encrypted)
}

ChaCha20 は、速度が必要な場合、特に AES ハードウェア アクセラレーションのないプラットフォームで最適です。

動作モード: すべてをまとめる

さて、動作モードについて話しましょう。これらはゲームのルールのようなものです。データを安全に暗号化するために暗号を使用する方法を定義します。

GCM (ガロア/カウンターモード): スイスアーミーナイフ

GCM は暗号化モードのスイス アーミー ナイフのようなものです。これは機密性と整合性の両方を提供するため、ほとんどのユースケースで強く推奨されます。使用方法は次のとおりです:

import (
    "crypto/aes"
    "crypto/cipher"
    "crypto/rand"
    "fmt"
)

func main() {
    key := make([]byte, 32)
    if _, err := rand.Read(key); err != nil {
        panic("The random number generator went on strike!")
    }

    block, err := aes.NewCipher(key)
    if err != nil {
        panic("AES is having an existential crisis!")
    }

    nonce := make([]byte, 12)
    if _, err := rand.Read(nonce); err != nil {
        panic("Nonce generator is feeling noncommittal!")
    }

    aesgcm, err := cipher.NewGCM(block)
    if err != nil {
        panic("GCM mode is feeling moody!")
    }

    secretMessage := []byte("AES-GCM: Making encryption great again!")
    encrypted := aesgcm.Seal(nil, nonce, secretMessage, nil)

    fmt.Printf("Our encrypted message: %x\n", encrypted)

    // Let's decrypt it to make sure it worked
    decrypted, err := aesgcm.Open(nil, nonce, encrypted, nil)
    if err != nil {
        panic("Decryption failed! Did someone tamper with our message?")
    }

    fmt.Printf("Decrypted message: %s\n", decrypted)
}

CTR (カウンターモード): ストリーファイア

CTR モードは、ブロック暗号をストリーム暗号に変える魔法の杖のようなものです。ストリーム暗号の柔軟性は必要だが、ブロック暗号アルゴリズムにこだわりたい場合に便利です:

import (
    "crypto/aes"
    "crypto/cipher"
    "crypto/rand"
    "fmt"
)

func main() {
    key := make([]byte, 32)
    if _, err := rand.Read(key); err != nil {
        panic("Random number generator is feeling random about its job!")
    }

    block, err := aes.NewCipher(key)
    if err != nil {
        panic("AES is having a block party, and we're not invited!")
    }

    iv := make([]byte, aes.BlockSize)
    if _, err := rand.Read(iv); err != nil {
        panic("IV generator is feeling too independent!")
    }

    stream := cipher.NewCTR(block, iv)

    secretMessage := []byte("CTR mode: Turning blocks into streams since 1979!")
    encrypted := make([]byte, len(secretMessage))
    stream.XORKeyStream(encrypted, secretMessage)

    fmt.Printf("Our streamed secret: %x\n", encrypted)

    // Let's decrypt it
    decrypted := make([]byte, len(encrypted))
    stream = cipher.NewCTR(block, iv) // Reset the stream
    stream.XORKeyStream(decrypted, encrypted)

    fmt.Printf("Decrypted message: %s\n", decrypted)
}

対称暗号化の黄金律

これらのピカピカの新しい暗号化ツールを手に入れたので、留意すべきいくつかの黄金律を次に示します:

  1. GCM はあなたの友達です: ほとんどの場合、AES-GCM を使用します。これはデータのボディーガードのようなものです。機密性と完全性の両方を保護します。

  2. ナンスは人生のスパイスです: 暗号化操作ごとに常に一意のナンス (一度使用される番号) を使用します。これは、各秘密メッセージの一意の識別子のようなものです。

  3. ランダム性がキー: crypto/rand を使用してキーを生成します。弱いキーを使用することは、銀行口座に「password123」を使用するようなものです。

  4. CTR にはバディが必要です: CTR モードを使用している場合は、整合性が保護されないことに注意してください。整合性保護が必要な場合は、MAC との組み合わせを検討してください。

  5. エラー処理はオプションではありません: 特にキーの生成および初期化中に、常にエラーを処理します。暗号コードのエラーを無視することは、車の「エンジンチェック」ライトを無視するようなものです。

  6. 秘密は秘密にしてください: ソース コードにキーをハードコーディングしないでください。それは家の鍵をウェルカムマットの下に隠すようなものです - 攻撃者が最初に注目する場所です!

次は何ですか?

おめでとう!これで、暗号化ツールキットに対称暗号化が追加されました。これらの手法は、双方が秘密鍵を共有する場合にデータを保護するのに最適です。

しかし、これまでに会ったことのない人と安全な接続を確立する必要がある場合はどうすればよいでしょうか?そこで公開キー暗号化が登場します。これについては次のセクションで説明します。これは、秘密のハンドシェイクと公開署名の違いのようなものです。どちらも便利ですが、シナリオが異なります。

暗号の世界では、これらの基本を理解することが重要であることを覚えておいてください。それは、城を建てる前にドアに鍵をかけることを学ぶようなものです。これらをマスターすれば、Go で安全で堅牢なアプリケーションを作成できるようになります。

それでは、自分宛てのメッセージを暗号化してみてはどうでしょうか?それとも、AES-GCM を使用してシンプルで安全なメモアプリを実装するでしょうか?安全な通信の世界があなたのすぐそばにあります。コーディングを楽しんでください、暗号チャンピオン!

リリースステートメント この記事は次の場所に転載されています: https://dev.to/rezmoss/symmetric-encryption-the-secret-handshake-of-cryptography-go-crypto-4-1d17?1 侵害がある場合は、study_golang@163 までご連絡ください。 .comを削除してください
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3