Как правильно написать из PHP hex2bin и openssl_decode на Go?

В Go можно перевести шестнадцатеричную строку в бинарные данные и декодировать OpenSSL-зашифрованный текст с помощью пакетов "encoding/hex" и "crypto/cipher". Вот пример кода, демонстрирующий, как это сделать:

package main

import (
    "bytes"
    "crypto/aes"
    "crypto/cipher"
    "encoding/hex"
    "fmt"
)

func main() {
    // Шестнадцатеричная строка, которую нужно преобразовать в бинарные данные
    hexString := "48656c6c6f20576f726c6421"

    // Пароль и вектор инициализации (IV) для OpenSSL-шифрования
    password := "myPassword123"
    iv := "1234567890123456"

    // Преобразование шестнадцатеричной строки в бинарные данные
    binaryData, err := hex.DecodeString(hexString)
    if err != nil {
        fmt.Println("Ошибка при декодировании шестнадцатеричной строки:", err)
        return
    }

    // Расшифровка с использованием OpenSSL-совместимого алгоритма (AES-256/CBC)
    plaintext, err := decryptOpenSSL(binaryData, []byte(password), []byte(iv))
    if err != nil {
        fmt.Println("Ошибка при расшифровке данных:", err)
        return
    }

    fmt.Println("Расшифрованный текст:", string(plaintext))
}

func decryptOpenSSL(ciphertext, key, iv []byte) ([]byte, error) {
    block, err := aes.NewCipher(key)
    if err != nil {
        return nil, err
    }

    mode := cipher.NewCBCDecrypter(block, iv)

    // Расшифровка данных
    plaintext := make([]byte, len(ciphertext))
    mode.CryptBlocks(plaintext, ciphertext)

    // Удаление дополнительных байтов, добавленных в результат OpenSSL
    plaintext = bytes.TrimRight(plaintext, "x04")

    return plaintext, nil
}

Обратите внимание, что в этом коде используется алгоритм шифрования AES-256 в режиме CBC с заданным паролем и вектором инициализации. Если ваши данные были зашифрованы с использованием других параметров, вам может потребоваться изменить код соответственно.