ホームページ  >  記事  >  バックエンド開発  >  対称暗号化: 暗号化のシークレット ハンドシェイク、Go Crypto 4

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

Patricia Arquette
Patricia Arquetteオリジナル
2024-10-20 06:07:30590ブラウズ

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 を使用してシンプルで安全なメモアプリを実装するでしょうか?安全な通信の世界があなたのすぐそばにあります!コーディングを楽しんでください、暗号化チャンピオン!

以上が対称暗号化: 暗号化のシークレット ハンドシェイク、Go Crypto 4の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。