РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
1249 of 1593 menu

Функция 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 с аутентификацией
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить