Функция cipher.NewOFB

Функция cipher.NewOFB создает новый потоковый шифр в режиме обратной связи по выходу (Output Feedback) для указанного блочного шифра. Она принимает два параметра: первый — это блочный шифр, реализующий интерфейс cipher.Block, а второй — вектор инициализации (IV) длиной равной размеру блока шифра. В режиме OFB выход блочного шифра подается на вход следующего блока, создавая ключевой поток, который затем накладывается на открытый текст с помощью XOR. Этот режим позволяет шифровать данные произвольной длины без необходимости дополнения и не распространяет ошибки шифрования.

Синтаксис

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

Пример

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

gopackage main

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

func main() {
  key := []byte("1234567890123456")
  iv := []byte("1234567890123456")
  plaintext := []byte("Hello, World!")

  block, err := aes.NewCipher(key)
  if err != nil {
    fmt.Println("Error creating cipher:", err)
    return
  }

  stream := cipher.NewOFB(block, iv)

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

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

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

go"4a7b8c9d1e2f3a4b5c6d7e8f"

Пример

Расшифруем зашифрованное сообщение, используя тот же ключ и IV:

gopackage main

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

func main() {
  key := []byte("1234567890123456")
  iv := []byte("1234567890123456")
  ciphertext := []byte{0x4a, 0x7b, 0x8c, 0x9d, 0x1e, 0x2f, 0x3a, 0x4b, 0x5c, 0x6d, 0x7e, 0x8f}

  block, err := aes.NewCipher(key)
  if err != nil {
    fmt.Println("Error creating cipher:", err)
    return
  }

  stream := cipher.NewOFB(block, iv)

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

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

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

go"Hello, World!"

Пример

Пример шифрования данных с использованием метода XORKeyStream и переменной длины сообщения:

gopackage main

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

func main() {
  key := []byte("1234567890123456")
  iv := []byte("1234567890123456")
  data := []byte("Short")

  block, err := aes.NewCipher(key)
  if err != nil {
    fmt.Println("Error:", err)
    return
  }

  stream := cipher.NewOFB(block, iv)

  encrypted := make([]byte, len(data))
  stream.XORKeyStream(encrypted, data)

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

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

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

go"Short"

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

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