Функция cipher.NewCTR
Функция cipher.NewCTR создает потоковый шифр, использующий режим счетчика (CTR) для шифрования и дешифрования данных. В первый параметр передается блочный шифр, реализующий интерфейс cipher.Block, а во второй параметр передается вектор инициализации (IV), который должен иметь длину, равную размеру блока используемого шифра.
Синтаксис
cipher.NewCTR(block cipher.Block, iv []byte) cipher.Stream
Пример
Давайте зашифруем открытый текст с использованием блочного шифра AES в режиме CTR:
package 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)
}
Результат выполнения кода:
"adf9a8c9e0b1f5d2e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9"
Пример
Давайте расшифруем зашифрованные данные, используя тот же ключ и вектор инициализации:
package 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))
}
Результат выполнения кода:
"Hello, World! This is a secret message."
Пример
Давайте зашифруем и расшифруем данные, демонстрируя, что для расшифровки используется тот же процесс XORKeyStream:
package 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))
}
Результат выполнения кода:
"12345 67890 abcde fghij"
Смотрите также
-
функцию
aes.NewCipher,
которая создает новый блочный шифр AES -
функцию
cipher.NewCBCEncrypter,
которая создает шифратор в режиме CBC -
функцию
cipher.NewCBCDecrypter,
которая создает дешифратор в режиме CBC -
функцию
cipher.NewGCM,
которая создает шифр в режиме GCM с аутентификацией