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

Функция pem.Decode

Функция pem.Decode из пакета encoding/pem используется для декодирования данных в формате PEM (Privacy-Enhanced Mail). Она принимает на вход байтовый слайс с PEM-данными и возвращает указатель на структуру pem.Block, содержащую заголовки и декодированное содержимое. Если входные данные не являются корректным PEM-блоком, функция возвращает nil.

Синтаксис

pem.Decode(data []byte) (*pem.Block, []byte)

Пример

Декодируем простой PEM-блок с приватным ключом:

package main import ( "encoding/pem" "fmt" ) func main() { pemData := []byte(` -----BEGIN RSA PRIVATE KEY----- MIIEpAIBAAKCAQEAu1Zvj... -----END RSA PRIVATE KEY----- `) block, rest := pem.Decode(pemData) if block == nil { fmt.Println("Failed to decode PEM block") return } fmt.Printf("Type: %s\n", block.Type) fmt.Printf("Headers: %v\n", block.Headers) fmt.Printf("Data length: %d bytes\n", len(block.Bytes)) fmt.Printf("Remaining data: %d bytes\n", len(rest)) }

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

"Type: RSA PRIVATE KEY" "Headers: map[]" "Data length: 15 bytes" "Remaining data: 0 bytes"

Пример

Декодируем PEM-блок с сертификатом, содержащим заголовки:

package main import ( "encoding/pem" "fmt" ) func main() { pemData := []byte(` -----BEGIN CERTIFICATE----- Proc-Type: 4,ENCRYPTED DEK-Info: DES-EDE3-CBC,1234567890ABCDEF MIIBzDCCAVQ... -----END CERTIFICATE----- `) block, _ := pem.Decode(pemData) if block == nil { fmt.Println("Failed to decode PEM block") return } fmt.Printf("Type: %s\n", block.Type) fmt.Printf("Headers: %v\n", block.Headers) fmt.Printf("Data length: %d bytes\n", len(block.Bytes)) }

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

"Type: CERTIFICATE" "Headers: map[Proc-Type:4,ENCRYPTED DEK-Info:DES-EDE3-CBC,1234567890ABCDEF]" "Data length: 12 bytes"

Пример

Обработка случая, когда входные данные не являются PEM-блоком:

package main import ( "encoding/pem" "fmt" ) func main() { invalidData := []byte("This is not a PEM block") block, rest := pem.Decode(invalidData) if block == nil { fmt.Println("No PEM block found") fmt.Printf("Remaining data: %s\n", string(rest)) return } fmt.Println("PEM block decoded successfully") }

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

"No PEM block found" "Remaining data: This is not a PEM block"

Пример

Декодирование нескольких PEM-блоков из одного входного слайса:

package main import ( "encoding/pem" "fmt" ) func main() { pemData := []byte(` -----BEGIN CERTIFICATE----- MIICyDCCAbACCQC... -----END CERTIFICATE----- -----BEGIN RSA PRIVATE KEY----- MIIEowIBAAKCAQEA... -----END RSA PRIVATE KEY----- `) remaining := pemData blockCount := 0 for { block, rest := pem.Decode(remaining) if block == nil { break } blockCount++ fmt.Printf("Block %d type: %s\n", blockCount, block.Type) fmt.Printf("Data length: %d bytes\n", len(block.Bytes)) remaining = rest } fmt.Printf("Total blocks decoded: %d\n", blockCount) }

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

"Block 1 type: CERTIFICATE" "Data length: 15 bytes" "Block 2 type: RSA PRIVATE KEY" "Data length: 15 bytes" "Total blocks decoded: 2"

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

  • функцию pem.Encode,
    которая кодирует структуру PEM-блока в формат PEM
  • функцию pem.EncodeToMemory,
    которая возвращает PEM-кодированные данные в виде байтового слайса
  • функцию x509.ParseCertificate,
    которая парсит X.509 сертификат из байтов
  • функцию x509.ParsePKCS1PrivateKey,
    которая парсит приватный ключ RSA в формате PKCS#1
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить