Функция cipher.NewOFB
Функция cipher.NewOFB создает новый потоковый шифр в режиме обратной связи по выходу (Output Feedback) для указанного блочного шифра. Она принимает два параметра: первый — это блочный шифр, реализующий интерфейс cipher.Block, а второй — вектор инициализации (IV) длиной равной размеру блока шифра. В режиме OFB выход блочного шифра подается на вход следующего блока, создавая ключевой поток, который затем накладывается на открытый текст с помощью XOR. Этот режим позволяет шифровать данные произвольной длины без необходимости дополнения и не распространяет ошибки шифрования.
Синтаксис
cipher.NewOFB(block cipher.Block, iv []byte) cipher.Stream
Пример
Давайте зашифруем текстовое сообщение с использованием режима OFB и блочного шифра AES-128:
package 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)
}
Результат выполнения кода:
"4a7b8c9d1e2f3a4b5c6d7e8f"
Пример
Расшифруем зашифрованное сообщение, используя тот же ключ и IV:
package 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)
}
Результат выполнения кода:
"Hello, World!"
Пример
Пример шифрования данных с использованием метода XORKeyStream и переменной длины сообщения:
package 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)
}
Результат выполнения кода:
"Short"
Смотрите также
-
функцию
cipher.NewCTR,
которая создает потоковый шифр в режиме счетчика -
функцию
cipher.NewCFBEncrypter,
которая создает шифратор в режиме обратной связи по шифротексту -
функцию
cipher.NewCBCEncrypter,
которая создает шифратор в режиме сцепления блоков -
функцию
aes.NewCipher,
которая создает блочный шифр AES для использования с режимами шифрования