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

Функция rsa.EncryptOAEP

Функция rsa.EncryptOAEP выполняет шифрование сообщения с использованием открытого ключа RSA и схемы дополнения OAEP (Optimal Asymmetric Encryption Padding). В первый параметр функция принимает хеш-функцию, которая используется для вычисления дайджеста в схеме OAEP. Вторым параметром передается криптографически стойкий генератор случайных чисел. Третий параметр - это открытый ключ RSA, используемый для шифрования. Четвертый параметр - само сообщение, которое нужно зашифровать, в виде среза байтов. Пятый параметр - это необязательная метка, которая также участвует в процессе шифрования (может быть пустой строкой). Функция возвращает зашифрованные данные в виде среза байтов и ошибку, если шифрование не удалось.

Синтаксис

rsa.EncryptOAEP(hash hash.Hash, random io.Reader, pub *rsa.PublicKey, msg []byte, label []byte) ([]byte, error)

Пример

Давайте сгенерируем пару RSA-ключей и зашифруем сообщение "Hello, World!" с помощью открытого ключа:

package main import ( "crypto/rand" "crypto/rsa" "crypto/sha256" "fmt" "log" ) func main() { // Generate a 2048-bit RSA key pair privateKey, err := rsa.GenerateKey(rand.Reader, 2048) if err != nil { log.Fatal(err) } // Message to encrypt msg := []byte("Hello, World!") // Encrypt the message using OAEP with SHA-256 ciphertext, err := rsa.EncryptOAEP( sha256.New(), rand.Reader, &privateKey.PublicKey, msg, nil, ) if err != nil { log.Fatal(err) } fmt.Printf("%x\n", ciphertext) }

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

"ciphertext in hexadecimal format"

Пример с использованием метки

Рассмотрим пример шифрования с использованием дополнительной метки, которая также используется в процессе шифрования:

package main import ( "crypto/rand" "crypto/rsa" "crypto/sha256" "fmt" "log" ) func main() { // Generate a 2048-bit RSA key pair privateKey, err := rsa.GenerateKey(rand.Reader, 2048) if err != nil { log.Fatal(err) } // Message to encrypt msg := []byte("Sensitive data") // Optional label for OAEP label := []byte("my-encryption-label") // Encrypt the message with label ciphertext, err := rsa.EncryptOAEP( sha256.New(), rand.Reader, &privateKey.PublicKey, msg, label, ) if err != nil { log.Fatal(err) } fmt.Printf("Encrypted message length: %d bytes\n", len(ciphertext)) }

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

"Encrypted message length: 256 bytes"

Пример с шифрованием и расшифровкой

Давайте продемонстрируем полный цикл шифрования и расшифровки данных с использованием функций rsa.EncryptOAEP и rsa.DecryptOAEP:

package main import ( "crypto/rand" "crypto/rsa" "crypto/sha256" "fmt" "log" ) func main() { // Generate a 2048-bit RSA key pair privateKey, err := rsa.GenerateKey(rand.Reader, 2048) if err != nil { log.Fatal(err) } // Original message msg := []byte("This is a secret message") // Encrypt ciphertext, err := rsa.EncryptOAEP( sha256.New(), rand.Reader, &privateKey.PublicKey, msg, nil, ) if err != nil { log.Fatal(err) } // Decrypt decrypted, err := rsa.DecryptOAEP( sha256.New(), rand.Reader, privateKey, ciphertext, nil, ) if err != nil { log.Fatal(err) } fmt.Printf("Original: %s\n", string(msg)) fmt.Printf("Decrypted: %s\n", string(decrypted)) fmt.Printf("Match: %t\n", string(msg) == string(decrypted)) }

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

"Original: This is a secret message" "Decrypted: This is a secret message" "Match: true"

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

  • функцию rsa.DecryptOAEP,
    которая выполняет расшифровку данных, зашифрованных по схеме OAEP
  • функцию rsa.EncryptPKCS1v15,
    которая шифрует данные с использованием устаревшей схемы PKCS#1 v1.5
  • функцию rsa.GenerateKey,
    которая генерирует пару RSA-ключей заданной длины
  • функцию rand.Int,
    которая генерирует криптографически стойкое случайное число
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить