将SSH密钥转换为C#格式以在Windows中加密(C#)并在Linux中解密(Python/Shell)

3 投票
1 回答
2522 浏览
提问于 2025-04-21 09:11

我在Centos机器上用ssh-keygen生成了一对公钥和私钥。现在我需要把公钥转换成C#能理解的格式(比如XML),这样在Windows上的C#应用程序就可以用这个公钥加密信息,而在Centos上的应用程序(用Python或Shell)可以用对应的私钥解密这个信息。请问这个转换该怎么做呢?

我手头有的示例密钥是:

公钥:

ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAnq2b0d3fbUMTN85q0xhHH2grdwwmg/8+1Efu2rKLAN1RiqHnov9wgRpL+l0cK5xpS7Z03+Up81HTJWxfH39WW18K+u3I6gyMBcrLaCdB/mWdJ1ayo0gdUiSz7TNDC1AR1S0BORET0oawF0BrhcYabzegQ1cpiQ4dfiQT9s3fupvQF/ZM5fSLFMK3w8wHxvtZoGGJR3K6aawIdWvz/kP0Tz9XXzr3WSrj6OApiACB/X2AvO0bIXvbVrIOsE74kseVBx2jsdVQeJuwN9EPbj4B6EyPaCNeok3Ua/vBNnxGFYIgS4QXPLXh8TXOKu+GI9QQ5Fl2lHRWh82rjMCsv88Wcw== test@local

私钥:

-----BEGIN PRIVATE KEY-----
MIIEugIBADANBgkqhkiG9w0BAQEFAASCBKQwggSgAgEAAoIBAQCerZvR3d9tQxM3
zmrTGEcfaCt3DCaD/z7UR+7asosA3VGKoeei/3CBGkv6XRwrnGlLtnTf5SnzUdMl
bF8ff1ZbXwr67cjqDIwFystoJ0H+ZZ0nVrKjSB1SJLPtM0MLUBHVLQE5ERPShrAX
QGuFxhpvN6BDVymJDh1+JBP2zd+6m9AX9kzl9IsUwrfDzAfG+1mgYYlHcrpprAh1
a/P+Q/RPP1dfOvdZKuPo4CmIAIH9fYC87Rshe9tWsg6wTviSx5UHHaOx1VB4m7A3
0Q9uPgHoTI9oI16iTdRr+8E2fEYVgiBLhBc8teHxNc4q74Yj1BDkWXaUdFaHzauM
wKy/zxZzAgEjAoIBAFYjuvzmKNTp5dx3Xo/Z+rlHLYnExHOKj9JS72DHUsX0fLj4
zjPpwLsc52qnkvMaZQvYE498Zzrx56aZ6n7QGO/F4WOlp5T/fzZYJUcrQRUSlyP7
3VFTCJpOcE2Q20CnzyqUxiZLGWOoM7TZ0/gptpQlguK6Sb9uEAKl3vOxlrXBcZHp
LQ+CUdixgtq9m5Fmq1rcZtX53m7bp/5DH7P5uTuNan37Um0zqZJjgQM91wwKXK63
Cv/DErTSWdGeSMSdDkzal8/MzD1NkUf153E7RVMKkrHELH+vo+b+06cGzA4lrYQq
MfCFaiW6y2NKlFmfBGopyh+T6HAhOdF7cbgChSMCgYEAycRoCg9X5WZEzBAWXr5X
69BDHPua5EFbi4PyWks0oIlGDCNTH2LMdokx/RRv3nfc/j6RKoJ1LzmfOJoG/+Iw
AH9QyeSQ6881wTlGBlRxweZ/GcrglQMrwDQHjVMoO6jmC5umfaFre8rBN5EJhFEF
TKsIxU4LZoqJTyp5n1cq3WUCgYEAyVQ/CseEKdvzjt1l202i7sptePeSSeLWzjgL
bMXXhUrMXqStF7PxyTcR0wHN4XzrvNC56dVb9XGqS5QkZSt2REsRwiYOgKRC1eXG
DerlzcclxbQcyH4G88RUrgB9ahynhDWq0dLAbLiISFxBrS23UE1UjcjfNlciGkwt
wqni8vcCgYBK8S31G6RN5CguiaHorRlXln9T6Gy7Ljfx/c8LmEa/SO4hw/pNfHfU
QZY5bf2qZwjwuCdKTbZ/QUnEkPtJGX+LJ/lvj2kHIRP3T8mNUpCnGxlEGCeHzfpO
tD1Rv80deT+Ap4b7dnhhLg1AhlP98jUrGvShDlwBg+nbk28Aq1kQZwKBgEUG8QsC
k7aUjgUYtTU/MIxiqTDJ6QNjt1ylgEKM+W+HXAMxJWc2YYbRDWzqrPzaX3PvyraS
S2oYV6TiVZ8HlkNM8CVO4Gaet9ROx4++QClLl+wDPRGKS4bG+HYsDb37Mh6zUIJ0
JLePubJoxg99Y2v9QY+ylaw7IaKdxoviebJjAoGAZNYtOpG3b9IIIGRvEyfC2m5b
v1+6QggQ/1AThLdSpBaR/mU+rQ120aUcNc60aLILmoub+DjRwoDHuO9Qnu4krwJI
WOV9mrBEJfcuNT+dDDJ2MGFqBSwitH2CenTWvbyCMfXOB7Bn8PqMlW5M/6AVv/Nf
lytOwERMgIc67pKkC+c=
-----END PRIVATE KEY-----

我能从私钥中提取出PEM格式的公钥,使用了:

openssl rsa -in myPrivateKey -pubout > PublicKey.x509


-----BEGIN PUBLIC KEY-----
MIIBIDANBgkqhkiG9w0BAQEFAAOCAQ0AMIIBCAKCAQEAnq2b0d3fbUMTN85q0xhH
H2grdwwmg/8+1Efu2rKLAN1RiqHnov9wgRpL+l0cK5xpS7Z03+Up81HTJWxfH39W
W18K+u3I6gyMBcrLaCdB/mWdJ1ayo0gdUiSz7TNDC1AR1S0BORET0oawF0BrhcYa
bzegQ1cpiQ4dfiQT9s3fupvQF/ZM5fSLFMK3w8wHxvtZoGGJR3K6aawIdWvz/kP0
Tz9XXzr3WSrj6OApiACB/X2AvO0bIXvbVrIOsE74kseVBx2jsdVQeJuwN9EPbj4B
6EyPaCNeok3Ua/vBNnxGFYIgS4QXPLXh8TXOKu+GI9QQ5Fl2lHRWh82rjMCsv88W
cwIBIw==
-----END PUBLIC KEY-----

在Windows机器上,我只有公钥,所以为了在C#中加密信息,我需要把公钥转换成XML格式,这样才能用RSACryptoServiceProvider类加载它。使用其他方法,比如X509Certificate2,则需要公钥和私钥都以证书的形式存在。考虑到我只有ssh格式的公钥,我该如何在C#中进行加密呢?同样的字符串需要在Linux端用对应的私钥解密。

谢谢!

1 个回答

-2

我找到了一段 C# 的源代码,它展示了如何读取 PEM 格式的公钥(也就是从 BEGIN PUBLIC KEY 开始的部分),并从中构建一个 RSACryptoServiceProvider(可以在代码中找 DecodeX509PublicKey 这个方法)。我自己还没有试过这段代码,但这是一个可以开始的地方。

撰写回答