Added ed25519-converter script

This commit is contained in:
2025-08-08 19:34:10 +03:00
parent 64e4e52cef
commit 824f3ba435
3 changed files with 96 additions and 0 deletions

View File

@@ -0,0 +1,83 @@
package main
import (
"bufio"
"crypto/ed25519"
"encoding/base64"
"encoding/pem"
"fmt"
"os"
"os/exec"
"strings"
"golang.org/x/crypto/ssh"
)
func main() {
key := ""
fmt.Println("Key:")
_, _ = fmt.Scan(&key)
reader := bufio.NewReader(os.Stdin)
fmt.Print("Passphrase: ")
passphrase, _ := reader.ReadString('\n')
passphrase = strings.TrimSpace(passphrase)
keyBytes, err := base64.StdEncoding.DecodeString(key)
if err != nil {
fmt.Println("Invalid base64:", err)
return
}
if len(keyBytes) != 64 {
fmt.Println("Invalid key length:", len(keyBytes))
return
}
// Use the first 32 bytes as private seed
privKey := ed25519.NewKeyFromSeed(keyBytes[:32])
var pemBlock *pem.Block
hasPassphrase := passphrase != "none"
if hasPassphrase {
fmt.Printf("Encrypting with passphrase: '%s'\n", passphrase)
pemBlock, err = ssh.MarshalPrivateKeyWithPassphrase(privKey, "eko", []byte(passphrase))
} else {
fmt.Println("Encrypting without passphrase")
pemBlock, err = ssh.MarshalPrivateKey(privKey, "eko")
}
if err != nil {
fmt.Println("failed private key marshaling", err)
return
}
err = pem.Encode(os.Stdout, pemBlock)
if err != nil {
fmt.Println("pem encoding to file error:", err)
return
}
fmt.Println("randomart")
printRandomart(privKey)
}
func printRandomart(key ed25519.PrivateKey) {
pub, err := ssh.NewPublicKey(key.Public())
if err != nil {
panic(err)
}
tmpfile, err := os.CreateTemp("", "id_ed25519.pub")
if err != nil {
panic(err)
}
defer os.Remove(tmpfile.Name())
tmpfile.Write(ssh.MarshalAuthorizedKey(pub))
tmpfile.Close()
cmd := exec.Command("ssh-keygen", "-lvf", tmpfile.Name())
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
cmd.Run()
}

7
scripts/go.mod Normal file
View File

@@ -0,0 +1,7 @@
module scripts
go 1.24.5
require golang.org/x/crypto v0.41.0
require golang.org/x/sys v0.35.0 // indirect

6
scripts/go.sum Normal file
View File

@@ -0,0 +1,6 @@
golang.org/x/crypto v0.41.0 h1:WKYxWedPGCTVVl5+WHSSrOBT0O8lx32+zxmHxijgXp4=
golang.org/x/crypto v0.41.0/go.mod h1:pO5AFd7FA68rFak7rOAGVuygIISepHftHnr8dr6+sUc=
golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI=
golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
golang.org/x/term v0.34.0 h1:O/2T7POpk0ZZ7MAzMeWFSg6S5IpWd/RXDlM9hgM3DR4=
golang.org/x/term v0.34.0/go.mod h1:5jC53AEywhIVebHgPVeg0mj8OD3VO9OzclacVrqpaAw=