概要
以下、自分用のメモです。忘れないうちにメモメモ。。。
AESで暗号化する必要があったので、ECBモードとCBCモードで試してみました。
今回はCBCモードでの利用です。ECBの場合は参照情報をご参照ください。
ECBとかCBCって何?って方は Wikipedia の以下が分かりやすいです。
サンプル
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の場合は同じパターンとはなりません。
参考情報
過去の記事については、以下のページからご参照下さい。
サンプルコードは、以下の場所で公開しています。