Функция cipher.NewCBCDecrypter

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

Синтаксис

gocipher.NewCBCDecrypter(block cipher.Block, iv []byte) cipher.BlockMode

Пример

Давайте расшифруем данные, зашифрованные с помощью AES в режиме CBC:

gopackage main

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

func main() {
  // Ключ и вектор инициализации должны быть такими же, как при шифровании
  key := []byte("0123456789abcdef0123456789abcdef") // 32 байта для AES-256
  iv := []byte("1234567890abcdef")        // 16 байт для AES

  // Зашифрованные данные (обычно получаем извне)
  ciphertext := []byte{
    0x8b, 0x1a, 0x99, 0x5a, 0x8c, 0x31, 0x3a, 0x7c,
    0x2a, 0x6f, 0x9f, 0x44, 0x57, 0x8d, 0x3d, 0x1b,
  }

  // Создаем блочный шифр AES
  block, err := aes.NewCipher(key)
  if err != nil {
    panic(err)
  }

  // Создаем расшифровщик в режиме CBC
  mode := cipher.NewCBCDecrypter(block, iv)

  // Расшифровываем данные
  plaintext := make([]byte, len(ciphertext))
  mode.CryptBlocks(plaintext, ciphertext)

  fmt.Printf("%s\n", plaintext)
}

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

go"Hello, World!"

Пример

Давайте расшифруем данные с использованием блочного шифра с размером блока 16 байт (AES-128):

gopackage main

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

func main() {
  // Ключ 16 байт для AES-128
  key := []byte("0123456789abcdef")
  iv := []byte("1234567890abcdef")

  // Зашифрованные данные с PKCS#7 паддингом
  ciphertext := []byte{
    0x9c, 0x6e, 0x9b, 0x6f, 0xa7, 0x8e, 0x3c, 0x7b,
    0x2d, 0x4b, 0x3a, 0x7f, 0x9c, 0x8d, 0x3a, 0x1b,
  }

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

  mode := cipher.NewCBCDecrypter(block, iv)

  plaintext := make([]byte, len(ciphertext))
  mode.CryptBlocks(plaintext, ciphertext)

  // После расшифровки необходимо удалить паддинг
  fmt.Printf("%q\n", plaintext[:len(plaintext)-int(plaintext[len(plaintext)-1])])
}

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

go"Hello, World!"

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

  • функцию cipher.NewCBCEncrypter,
    которая создает объект для шифрования в режиме CBC
  • функцию cipher.NewCFBDecrypter,
    которая создает объект для расшифровки в режиме CFB
  • интерфейс cipher.BlockMode,
    который реализует объект, возвращаемый функцией
  • функцию aes.NewCipher,
    которая создает блочный шифр AES для использования в режиме CBC