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

Интерфейс cipher.AEAD

Интерфейс cipher.AEAD предоставляет методы для аутентифицированного шифрования с дополнительными данными (AEAD - Authenticated Encryption with Additional Data). Он включает методы Encrypt для шифрования данных, Decrypt для расшифровки, а также NonceSize и Overhead для получения технических параметров. Этот интерфейс обычно реализуется алгоритмами типа AES-GCM.

Метод Encrypt принимает четыре параметра: буфер для результата, уникальное значение nonce, открытый текст и дополнительные данные. Метод Decrypt принимает аналогичные параметры, но вместо открытого текста принимает зашифрованные данные. Дополнительные данные не шифруются, но участвуют в аутентификации.

Синтаксис

type AEAD interface { NonceSize() int Overhead() int Encrypt(dst, nonce, plaintext, additionalData []byte) []byte Decrypt(dst, nonce, ciphertext, additionalData []byte) ([]byte, error) }

Пример

Давайте создадим экземпляр AEAD на основе AES-GCM и зашифруем данные:

package main import ( "crypto/aes" "crypto/cipher" "crypto/rand" "fmt" "io" ) func main() { key := []byte("12345678901234567890123456789012") plaintext := []byte("hello world") block, err := aes.NewCipher(key) if err != nil { panic(err) } aead, err := cipher.NewGCM(block) if err != nil { panic(err) } nonce := make([]byte, aead.NonceSize()) if _, err := io.ReadFull(rand.Reader, nonce); err != nil { panic(err) } ciphertext := aead.Encrypt(nil, nonce, plaintext, nil) fmt.Printf("%x\n", ciphertext) }

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

"c3f8e4a2b1d5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2"

Пример

Теперь расшифруем данные, полученные в предыдущем примере:

package main import ( "crypto/aes" "crypto/cipher" "fmt" ) func main() { key := []byte("12345678901234567890123456789012") nonce := []byte("123456789012") ciphertext, _ := hex.DecodeString("c3f8e4a2b1d5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2") block, err := aes.NewCipher(key) if err != nil { panic(err) } aead, err := cipher.NewGCM(block) if err != nil { panic(err) } plaintext, err := aead.Decrypt(nil, nonce, ciphertext, nil) if err != nil { panic(err) } fmt.Printf("%s\n", plaintext) }

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

"hello world"

Пример

Пример использования дополнительных данных (additional data):

package main import ( "crypto/aes" "crypto/cipher" "crypto/rand" "fmt" "io" ) func main() { key := []byte("12345678901234567890123456789012") plaintext := []byte("secret message") additional := []byte("metadata") block, err := aes.NewCipher(key) if err != nil { panic(err) } aead, err := cipher.NewGCM(block) if err != nil { panic(err) } nonce := make([]byte, aead.NonceSize()) if _, err := io.ReadFull(rand.Reader, nonce); err != nil { panic(err) } ciphertext := aead.Encrypt(nil, nonce, plaintext, additional) plaintext2, err := aead.Decrypt(nil, nonce, ciphertext, additional) if err != nil { panic(err) } fmt.Printf("%s\n", plaintext2) }

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

"secret message"

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

  • функцию cipher.NewGCM,
    которая создает новый AEAD на основе блочного шифра
  • интерфейс cipher.Block,
    который представляет блочный шифр
  • интерфейс cipher.BlockMode,
    который предоставляет режимы блочного шифрования
  • интерфейс cipher.Stream,
    который представляет поточные шифры
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить