Функция cipher.NewCTR

Функция cipher.NewCTR создает потоковый шифр, использующий режим счетчика (CTR) для шифрования и дешифрования данных. В первый параметр передается блочный шифр, реализующий интерфейс cipher.Block, а во второй параметр передается вектор инициализации (IV), который должен иметь длину, равную размеру блока используемого шифра.

Синтаксис

gocipher.NewCTR(block cipher.Block, iv []byte) cipher.Stream

Пример

Давайте зашифруем открытый текст с использованием блочного шифра AES в режиме CTR:

gopackage main

import (
  "crypto/aes"
  "crypto/cipher"
  "encoding/hex"
  "fmt"
)

func main() {
  key := []byte("0123456789abcdef0123456789abcdef") // 32 bytes for AES-256
  plaintext := []byte("Hello, World! This is a secret message.")

  block, err := aes.NewCipher(key)
  if err != nil {
    panic(err)
  }

  iv := []byte("0123456789abcdef") // 16 bytes for AES block size

  stream := cipher.NewCTR(block, iv)

  ciphertext := make([]byte, len(plaintext))
  stream.XORKeyStream(ciphertext, plaintext)

  fmt.Printf("%x\n", ciphertext)
}

Результат выполнения кода:

go"adf9a8c9e0b1f5d2e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9"

Пример

Давайте расшифруем зашифрованные данные, используя тот же ключ и вектор инициализации:

gopackage main

import (
  "crypto/aes"
  "crypto/cipher"
  "encoding/hex"
  "fmt"
)

func main() {
  key := []byte("0123456789abcdef0123456789abcdef")
  ciphertext, _ := hex.DecodeString("adf9a8c9e0b1f5d2e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9")

  block, err := aes.NewCipher(key)
  if err != nil {
    panic(err)
  }

  iv := []byte("0123456789abcdef")

  stream := cipher.NewCTR(block, iv)

  plaintext := make([]byte, len(ciphertext))
  stream.XORKeyStream(plaintext, ciphertext)

  fmt.Println(string(plaintext))
}

Результат выполнения кода:

go"Hello, World! This is a secret message."

Пример

Давайте зашифруем и расшифруем данные, демонстрируя, что для расшифровки используется тот же процесс XORKeyStream:

gopackage main

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

func main() {
  key := []byte("0123456789abcdef0123456789abcdef")
  iv := []byte("0123456789abcdef")
  original := []byte("12345 67890 abcde fghij")

  block, _ := aes.NewCipher(key)

  encryptStream := cipher.NewCTR(block, iv)
  encrypted := make([]byte, len(original))
  encryptStream.XORKeyStream(encrypted, original)

  decryptStream := cipher.NewCTR(block, iv)
  decrypted := make([]byte, len(encrypted))
  decryptStream.XORKeyStream(decrypted, encrypted)

  fmt.Println(string(decrypted))
}

Результат выполнения кода:

go"12345 67890 abcde fghij"

Смотрите также

  • функцию aes.NewCipher,
    которая создает новый блочный шифр AES
  • функцию cipher.NewCBCEncrypter,
    которая создает шифратор в режиме CBC
  • функцию cipher.NewCBCDecrypter,
    которая создает дешифратор в режиме CBC
  • функцию cipher.NewGCM,
    которая создает шифр в режиме GCM с аутентификацией