いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

Goメモ-248 (crypto/aesで暗号化と復号)(CBC, Cipher Block Chaining Mode)

概要

以下、自分用のメモです。忘れないうちにメモメモ。。。

AESで暗号化する必要があったので、ECBモードとCBCモードで試してみました。

今回はCBCモードでの利用です。ECBの場合は参照情報をご参照ください。

ECBとかCBCって何?って方は Wikipedia の以下が分かりやすいです。

ja.wikipedia.org

サンプル

ECBとは違い、CBCの場合は初期ベクトル(initial vector)、略してIVが必要になります。

IV自体は知られても問題ないので何でも良いですが、一応 rand.Reader 使ってます。

package aes

import (
    "crypto/aes"
    "crypto/cipher"
    "crypto/rand"
    "encoding/hex"
    "io"

    "github.com/devlights/gomy/output"
)

// Cbc -- crypto/aes のサンプルです (CBC) .
//
// # REFERENCES
//   - https://blog.takuchalle.dev/post/2019/06/06/how_to_aes_encrypt_golang/
//   - https://www.developer.com/languages/cryptography-in-go/
//   - https://ja.wikipedia.org/wiki/Advanced_Encryption_Standard
func Cbc() error {
    const (
        txt = "123456789012345_123456789012345_123456789012345_123456789012345_" // 64 bytes
        key = "this_must_be_of_32_byte_length!!"
    )

    var (
        iv  = make([]byte, aes.BlockSize)
        blk cipher.Block
        err error
    )

    _, err = io.ReadFull(rand.Reader, iv)
    if err != nil {
        return err
    }

    blk, err = aes.NewCipher([]byte(key))
    if err != nil {
        return err
    }

    var (
        plain     = []byte(txt)
        encBytes  = make([]byte, len(plain))
        decBytes  = make([]byte, len(plain))
        encrypter = cipher.NewCBCEncrypter(blk, iv)
        decrypter = cipher.NewCBCDecrypter(blk, iv)
    )

    encrypter.CryptBlocks(encBytes, plain)
    decrypter.CryptBlocks(decBytes, encBytes)

    output.Stdoutl("[AES][Encoding]", hex.EncodeToString(encBytes))
    output.Stdoutl("[AES][Decoding]", string(decBytes))

    return nil
}

以下、実行結果です。

$ task
task: [run] go run . -onetime

ENTER EXAMPLE NAME: crypto_aes_cbc

[Name] "crypto_aes_cbc"
[AES][Encoding]      1256a27421599771f7a05d48f5034a5d58dac921caaedb8d9b28b40ff132d722c0d49c5e2599844e1e4059f3ee14c0694b526e765033dbc414f25105bb6eeda4
[AES][Decoding]      123456789012345_123456789012345_123456789012345_123456789012345_


[Elapsed] 83.93µs

ECBとは違い、CBCの場合は同じパターンとはなりません。

参考情報

devlights.hatenablog.com

it-trend.jp

ja.wikipedia.org

qiita.com

Go言語による並行処理

Go言語による並行処理

Amazon


過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。