// sshphrase.go — генерация ED25519-ключей с использованием golang.org/x/crypto/ssh package main import ( "bytes" "crypto/ed25519" "crypto/sha256" "encoding/pem" "fmt" "log" "os" "golang.org/x/crypto/ssh" "golang.org/x/term" ) type Pair struct { Private []byte Public []byte } func PairFromED25519(public ed25519.PublicKey, private ed25519.PrivateKey) (*Pair, error) { privBlock, err := ssh.MarshalPrivateKey(private, "") if err != nil { return nil, err } var buf bytes.Buffer err = pem.Encode(&buf, privBlock) if err != nil { return nil, err } pubKey, err := ssh.NewPublicKey(public) if err != nil { return nil, err } return &Pair{ Private: buf.Bytes(), Public: ssh.MarshalAuthorizedKey(pubKey), }, nil } func main() { fmt.Print("Введите фразу: ") b, err := term.ReadPassword(int(os.Stdin.Fd())) fmt.Println() if err != nil { log.Fatalf("Ошибка чтения фразы: %v", err) } phrase := string(b) seed := sha256.Sum256([]byte(phrase)) privateKey := ed25519.NewKeyFromSeed(seed[:]) publicKey := privateKey.Public().(ed25519.PublicKey) pair, err := PairFromED25519(publicKey, privateKey) if err != nil { log.Fatalf("Ошибка генерации ключей: %v", err) } for { fmt.Println("\nВыберите действие:") fmt.Println("1 - Показать публичный ключ") fmt.Println("2 - Показать приватный ключ") fmt.Println("0 - Выход") fmt.Print("> ") var choice string fmt.Scanln(&choice) switch choice { case "1": fmt.Println("\n📤 Публичный ключ (копируй в authorized_keys):") fmt.Println(string(pair.Public)) case "2": fmt.Println("\n🔐 Приватный ключ (в формате OpenSSH):") fmt.Println(string(pair.Private)) fmt.Println("(Сохрани как id_ed25519 и установи chmod 600)") case "0": fmt.Println("Выход.") return default: fmt.Println("Неверный выбор. Попробуйте снова.") } } }