簡體   English   中英

C# 生成 Ed25519 私鑰和公鑰對用於 SSH 身份驗證

[英]C# Generate Ed25519 private and public key pair for SSH authentication


我需要使用 C# 在 ssh 隧道中生成用於身份驗證的密鑰對。
唯一的限制是密碼應該是Ed25519
我能夠生成一個有效的公鑰,但不能生成一個有效的私鑰(或者可能只是格式)。
我已經嘗試使用BouncyCastleNSec庫來生成它們,但沒有成功。

這是我的一些嘗試:

#### NSec ####
var creationParameters = new KeyCreationParameters
{
    ExportPolicy = KeyExportPolicies.AllowPlaintextArchiving
};
using (var key = Key.Create(SignatureAlgorithm.Ed25519, creationParameters))
{
    var blob = key.Export(KeyBlobFormat.PkixPrivateKeyText);
    result.PrivateKey = Convert.ToBase64String(blob);

    blob = key.Export(KeyBlobFormat.PkixPublicKeyText);
    result.PublicKey = string.Format("ssh-ed25519 {0} generated-key", Convert.ToBase64String(blob));
}


#### BouncyCastle ####
IAsymmetricCipherKeyPairGenerator gen;
KeyGenerationParameters param;
gen = new Ed25519KeyPairGenerator();
param = new Ed25519KeyGenerationParameters(new SecureRandom());
gen.Init(param);
AsymmetricCipherKeyPair pair = gen.GenerateKeyPair();
PrivateKeyInfo pkInfo = PrivateKeyInfoFactory.CreatePrivateKeyInfo(pair.Private);
result.PrivateKey = Convert.ToBase64String(pkInfo.GetDerEncoded());
SubjectPublicKeyInfo info = SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(pair.Public);
result.PublicKey = Convert.ToBase64String(info.GetDerEncoded());

更具體地說,我希望從 cmd 中獲得類似以下生成的結果:

ssh-keygen -t ed25519 -f ssh-ed25519-private-key.pem

生成公鑰,如:

ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICjTBKzEKElOtmjuYDaBsoF9UpsXUeLUmKuqiK86jv2A xxxxxx\xxxxxxx@xxxx

和私人喜歡:

-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW
QyNTUxOQAAACAo0wSsxChJTrZo7mA2gbKBfVKbF1Hi1JirqoivOo79gAAAAKgLape6C2qX
ugAAAAtzc2gtZWQyNTUxOQAAACAo0wSsxChJTrZo7mA2gbKBfVKbF1Hi1JirqoivOo79gA
AAAECRX7SDurbmPZzRMqYwONep7gk4ZCFp1Uj6hTpVbGWi0CjTBKzEKElOtmjuYDaBsoF9
UpsXUeLUmKuqiK86jv2AAAAAJWNnLWNvbnRyb2xzLXJkXGFtZW5lZ2F0QFcwNTItQU1lbm
VnYXQ=
-----END OPENSSH PRIVATE KEY-----

謝謝,
安德烈亞

我能夠生成一個有效的公鑰,但不能生成一個有效的私鑰(或者可能只是格式)。

這沒有意義。

公鑰實際上是橢圓曲線上的一個(X,Y 坐標),由y^2 = x^3 + 486662*x^2 + x在大小為57896044618658097711785492504343953926634992332820282019728792003956564819949 y^2 = x^3 + 486662*x^2 + x

公鑰只能通過生成點 G 的標量相乘得到(9 , 14781619447589544791020593568409986887264606134616475288964881837755586237401)

由大量。 因此,私鑰實際上只是一個 256 位整數,一個數字。

在最原始的形式中,私鑰是一個 256 位的隨機值,上面的 OpenSSH 格式是一個 base64 編碼的值,包括其他組件,例如:

"openssh-key-v1"0x00    # NULL-terminated "Auth Magic" string
32-bit length, "none"   # ciphername length and string
32-bit length, "none"   # kdfname length and string
32-bit length, nil      # kdf (0 length, no kdf)
32-bit 0x01             # number of keys, hard-coded to 1 (no length)
32-bit length, sshpub   # public key in ssh format
    32-bit length, keytype
    32-bit length, pub0
    32-bit length, pub1
32-bit length for rnd+prv+comment+pad
    64-bit dummy checksum?  # a random 32-bit int, repeated
    32-bit length, keytype  # the private key (including public)
    32-bit length, pub0     # Public Key parts
    32-bit length, pub1
    32-bit length, prv0     # Private Key parts
    ...                     # (number varies by type)
    32-bit length, comment  # comment string
    padding bytes 0x010203  # pad to blocksize

我強烈建議您切換libsodium ,這是與curve25519交互時的標准,或者它是 Twisted Edwards 簽名聚焦變體ed25519

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM