Инструменты пользователя

Инструменты сайта


projects:windows:ssh_phrase

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слеваПредыдущая версия
Следующая версия
Предыдущая версия
projects:windows:ssh_phrase [2025/04/15 18:33] projects:windows:ssh_phrase [2025/04/15 23:01] (текущий)
Строка 6: Строка 6:
  
 **Программа в архиве:**\\ **Программа в архиве:**\\
-{{ :projects:windows:sshphrase.zip |}} (1.24 Mb)+{{ :projects:windows:sshphrase.zip |}} (1.25 Mb) 
 + 
 + 
 +<WRAP center round important 90%> 
 +<code> 
 +в ssh приватном ключе вида 
 +-----BEGIN OPENSSH PRIVATE KEY----- 
 +b3BlbnNzaC1rZXktZ...много base64 
 +-----END OPENSSH PRIVATE KEY----- 
 +обязательно должен быть символ переноса на новую строку в конце файла, 
 +иначе будет ошибка при попытке подключения 
 +</code> 
 +</WRAP> 
 + 
  
 **Исходный код:** **Исходный код:**
 ++++sshphrase.go| ++++sshphrase.go|
 <code go sshphrase.go> <code go sshphrase.go>
-// sshphrase.go+// sshphrase.go — генерация ED25519-ключей с использованием golang.org/x/crypto/ssh
 package main package main
  
Строка 27: Строка 41:
 ) )
  
-// ===== marshalOpenSSHPrivateKey: Сериализация приватного ключа в OpenSSH-формате ===== +type Pair struct { 
-func marshalOpenSSHPrivateKey(privateKey ed25519.PrivateKey) ([]byte, error) { + Private []byte 
- // Структура для OpenSSH-ключа + Public  []byte 
- type opensshPrivateKey struct +
- Check1 uint32 + 
- Check2 uint32 +func PairFromED25519(public ed25519.PublicKey, private ed25519.PrivateKey) (*Pair, error) { 
- Key    struct { + privBlock, err := ssh.MarshalPrivateKey(private, "") 
- Curve  string + if err != nil 
- PubKey []byte + return nil, err
- Priv   []byte +
- }+
  }  }
  
- pub := privateKey.Public().(ed25519.PublicKey) + var buf bytes.Buffer 
- buf := &bytes.Buffer{} + err = pem.Encode(&buf, privBlock)
- buf.Write([]byte("openssh-key-v1\x00")) +
- writeString(buf, "none") // cipher name (без шифрования) +
- writeString(buf, "none") // kdf name (без ключевого деривационного алгоритма) +
- writeString(buf, ""    // kdf options (пусто) +
- writeUint32(buf, 1)      // количество ключей +
- +
- pubKey, err := ssh.NewPublicKey(pub)+
  if err != nil {  if err != nil {
  return nil, err  return nil, err
  }  }
- writeString(buf, string(ssh.MarshalAuthorizedKey(pubKey))) 
  
- content := &bytes.Buffer{} + pubKey, err := ssh.NewPublicKey(public
- check := uint32(0x01020304) // контрольное значение для валидации + if err !nil 
- writeUint32(content, check) + return nil, err
- writeUint32(content, check) +
- writeString(content, "ssh-ed25519"+
- writeString(content, string(pub)) +
- writeString(content, string(privateKey)) +
- content.WriteByte(0// завершающий ноль +
- +
- padLen :8 - (content.Len() % 8) +
- for i := 1; i <= padLen; i++ +
- content.WriteByte(byte(i))+
  }  }
- writeString(buf, content.String()) 
  
- final := pem.EncodeToMemory(&pem.Block+ return &Pair
- Type "OPENSSH PRIVATE KEY"+ Privatebuf.Bytes()
- Bytesbuf.Bytes(), + Public ssh.MarshalAuthorizedKey(pubKey), 
- }+ }, nil
- return final, nil+
 } }
  
-// ===== Конец marshalOpenSSHPrivateKey ===== 
- 
-func writeString(w *bytes.Buffer, s string) { 
- writeUint32(w, uint32(len(s))) 
- w.WriteString(s) 
-} 
- 
-func writeUint32(w *bytes.Buffer, v uint32) { 
- w.WriteByte(byte(v >> 24)) 
- w.WriteByte(byte(v >> 16)) 
- w.WriteByte(byte(v >> 8)) 
- w.WriteByte(byte(v)) 
-} 
- 
-// ===== main: CLI-меню, генерация ключей по введённой фразе ===== 
 func main() { func main() {
  fmt.Print("Введите фразу: ")  fmt.Print("Введите фразу: ")
Строка 100: Строка 78:
  phrase := string(b)  phrase := string(b)
  
- // Создание seed на основе хэша введённой фразы 
  seed := sha256.Sum256([]byte(phrase))  seed := sha256.Sum256([]byte(phrase))
  privateKey := ed25519.NewKeyFromSeed(seed[:])  privateKey := ed25519.NewKeyFromSeed(seed[:])
- publicKey, err := ssh.NewPublicKey(privateKey.Public())+ publicKey := privateKey.Public().(ed25519.PublicKey) 
 + 
 + pair, err := PairFromED25519(publicKey, privateKey)
  if err != nil {  if err != nil {
- log.Fatalf("Ошибка создания публичного ключа: %v", err)+ log.Fatalf("Ошибка генерации ключей: %v", err)
  }  }
  
Строка 121: Строка 100:
  case "1":  case "1":
  fmt.Println("\n📤 Публичный ключ (копируй в authorized_keys):")  fmt.Println("\n📤 Публичный ключ (копируй в authorized_keys):")
- fmt.Println(string(ssh.MarshalAuthorizedKey(publicKey)))+ fmt.Println(string(pair.Public))
  
  case "2":  case "2":
  fmt.Println("\n🔐 Приватный ключ (в формате OpenSSH):")  fmt.Println("\n🔐 Приватный ключ (в формате OpenSSH):")
- keyBytes, err := marshalOpenSSHPrivateKey(privateKey) + fmt.Println(string(pair.Private))
- if err != nil { +
- log.Fatalf("Ошибка сериализации приватного ключа: %v", err) +
-+
- fmt.Println(string(keyBytes))+
  fmt.Println("(Сохрани как id_ed25519 и установи chmod 600)")  fmt.Println("(Сохрани как id_ed25519 и установи chmod 600)")
  
Строка 141: Строка 116:
  }  }
 } }
- 
-// ===== Конец main ===== 
- 
  
 </code> </code>
projects/windows/ssh_phrase.1744731211.txt.gz · Последнее изменение: 2025/04/15 18:33 —

Если не указано иное, содержимое этой вики предоставляется на условиях следующей лицензии: CC Attribution 4.0 International
CC Attribution 4.0 International Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki