Как установить шифрованное по ключу (RSA/MD5/BASE64) соединение по сокету Golang? Нужно создать приложение (клиент сервер) которое будет обмениваться шифрованными пакетами и дешифровать их по ключу. Ниже пример СЕРВЕР Исходный пакет ~> Шифрование ~> Отправка клиенту КЛИЕНТ ~> Получение пакета ~> Дешифрование ~> Обработка
Для создания клиент-серверного приложения, которое будет обмениваться шифрованными пакетами по ключу, вы можете воспользоваться библиотекой golang "crypto". Ниже приведен пример кода для сервера и клиента:
package main import ( "crypto/rsa" "crypto/x509" "encoding/pem" "log" "net" ) func main() { conn, err := net.Dial("tcp", "localhost:1234") if err != nil { log.Fatal(err) } defer conn.Close() // Получить публичный ключ от сервера keyBytes := make([]byte, 2048) _, err = conn.Read(keyBytes) if err != nil { log.Fatal(err) } // Преобразование PEM ключа обратно в rsa.PublicKey block, _ := pem.Decode(keyBytes) rsaPublicKey, err := x509.ParsePKCS1PublicKey(block.Bytes) if err != nil { log.Fatal(err) } // Шифрование данных с использованием публичного ключа data := []byte("Secret message") encryptedData, err := rsa.EncryptPKCS1v15(rand.Reader, rsaPublicKey, data) if err != nil { log.Fatal(err) } // Отправка зашифрованных данных серверу _, err = conn.Write(encryptedData) if err != nil { log.Fatal(err) } }
Помните, что это простой пример и не включает аутентификацию и другие меры безопасности. Кроме того, для полной защиты данных рекомендуется использовать адекватные ключи и алгоритмы шифрования.
Для создания клиент-серверного приложения, которое будет обмениваться шифрованными пакетами по ключу, вы можете воспользоваться библиотекой golang "crypto". Ниже приведен пример кода для сервера и клиента:
Сервер:
package mainimport (
"crypto/rsa"
"crypto/rand"
"crypto/x509"
"encoding/pem"
"log"
"net"
)
func handleConnection(conn net.Conn) {
defer conn.Close()
// Генерация RSA ключей
privateKey, err := rsa.GenerateKey(rand.Reader, 2048)
if err != nil {
log.Fatal(err)
}
// Преобразование приватного ключа в PEM формат
privkeyBytes := x509.MarshalPKCS1PrivateKey(privateKey)
privkeyPem := pem.EncodeToMemory(&pem.Block{
Type: "RSA PRIVATE KEY",
Bytes: privkeyBytes,
})
// Отправить публичный ключ клиенту
_, err = conn.Write(privkeyPem)
if err != nil {
log.Fatal(err)
}
// Получение данные
data := make([]byte, 1024)
n, err := conn.Read(data)
if err != nil {
log.Fatal(err)
}
log.Printf("Received encrypted data: %s\n", string(data[:n]))
}
func main() {
l, err := net.Listen("tcp", ":1234")
if err != nil {
log.Fatal(err)
}
defer l.Close()
for {
conn, err := l.Accept()
if err != nil {
log.Fatal(err)
}
go handleConnection(conn)
}
}
Клиент:
package mainimport (
"crypto/rsa"
"crypto/x509"
"encoding/pem"
"log"
"net"
)
func main() {
conn, err := net.Dial("tcp", "localhost:1234")
if err != nil {
log.Fatal(err)
}
defer conn.Close()
// Получить публичный ключ от сервера
keyBytes := make([]byte, 2048)
_, err = conn.Read(keyBytes)
if err != nil {
log.Fatal(err)
}
// Преобразование PEM ключа обратно в rsa.PublicKey
block, _ := pem.Decode(keyBytes)
rsaPublicKey, err := x509.ParsePKCS1PublicKey(block.Bytes)
if err != nil {
log.Fatal(err)
}
// Шифрование данных с использованием публичного ключа
data := []byte("Secret message")
encryptedData, err := rsa.EncryptPKCS1v15(rand.Reader, rsaPublicKey, data)
if err != nil {
log.Fatal(err)
}
// Отправка зашифрованных данных серверу
_, err = conn.Write(encryptedData)
if err != nil {
log.Fatal(err)
}
}
Помните, что это простой пример и не включает аутентификацию и другие меры безопасности. Кроме того, для полной защиты данных рекомендуется использовать адекватные ключи и алгоритмы шифрования.