В Go существует несколько библиотек, позволяющих использовать асимметричное шифрование по паролю. Одной из них является библиотека crypto/nacl/box
, которая предоставляет простой API для шифрования и дешифрования данных с использованием асимметричного шифра XSalsa20Poly1305.
Прежде чем начать, вам потребуется установить Go, если он еще не установлен на вашем компьютере.
Начнем с генерации пары ключей: приватного и публичного. Публичный ключ будет использоваться для шифрования, а приватный – для расшифрования данных.
package main import ( "crypto/rand" "crypto/nacl/box" "fmt" "io" ) func generateKeypair() (*[32]byte, *[32]byte, error) { pubKey, privKey, err := box.GenerateKey(rand.Reader) if err != nil { return nil, nil, err } return pubKey, privKey, nil } func main() { pubKey, privKey, err := generateKeypair() if err != nil { fmt.Println("Failed to generate keypair:", err) return } fmt.Println("Public Key:", pubKey) fmt.Println("Private Key:", privKey) }
Этот код сначала генерирует пару ключей с помощью box.GenerateKey
, принимая в качестве параметра генератор случайных чисел rand.Reader
. Если генерация ключей проходит успешно, функция возвращает два значения: публичный и приватный ключи.
Затем мы выводим сгенерированные ключи на экран.
Теперь, когда у нас есть пара ключей, мы можем использовать их для шифрования и дешифрования данных с помощью функций box.Seal
и box.Open
соответственно.
package main import ( "crypto/rand" "crypto/nacl/box" "fmt" "io" ) func generateKeypair() (*[32]byte, *[32]byte, error) { // Генерация ключей } func encryptData(pubKey *[32]byte, data []byte) ([]byte, error) { // Генерация временного ключа // Шифрование данных } func decryptData(privKey *[32]byte, encryptedData []byte) ([]byte, error) { // Извлечение публичного ключа из зашифрованных данных // Расшифровка данных } func main() { pubKey, privKey, err := generateKeypair() if err != nil { fmt.Println("Failed to generate keypair:", err) return } data := []byte("Hello, World!") encryptedData, err := encryptData(pubKey, data) if err != nil { fmt.Println("Failed to encrypt data:", err) return } fmt.Println("Encrypted Data:", encryptedData) decryptedData, err := decryptData(privKey, encryptedData) if err != nil { fmt.Println("Failed to decrypt data:", err) return } fmt.Println("Decrypted Data:", decryptedData) }
В этом коде мы сначала генерируем пару ключей, как описано выше.
Затем мы определяем функцию encryptData
, которая принимает публичный ключ и данные в виде среза байтов. Внутри этой функции мы генерируем временный ключ с помощью box.GenerateKey
, шифруем данные с использованием функции box.Seal
и возвращаем зашифрованные данные.
Функция decryptData
принимает приватный ключ и зашифрованные данные в виде среза байтов. Внутри этой функции мы извлекаем публичный ключ из зашифрованных данных, расшифровываем данные с использованием функции box.Open
и возвращаем расшифрованные данные.
В функции main
мы сначала генерируем пару ключей, как описано выше. Затем мы объявляем переменную data
, которая содержит данные, которые мы хотим зашифровать.
Мы вызываем функцию encryptData
с публичным ключом и данными, чтобы зашифровать данные. Если шифрование прошло успешно, мы выводим зашифрованные данные на экран.
Затем мы вызываем функцию decryptData
с приватным ключом и зашифрованными данными, чтобы расшифровать данные. Если расшифровка прошла успешно, мы выводим расшифрованные данные на экран.
Таким образом, вы можете использовать этот код для шифрования и дешифрования данных по паролю с использованием асимметричного шифра на Go.