在 powershell 中生成 RSA 密钥对

Posted

技术标签:

【中文标题】在 powershell 中生成 RSA 密钥对【英文标题】:Generating an RSA key pair in powershell 【发布时间】:2019-08-12 13:10:14 【问题描述】:

我想在不使用外部软件的情况下在 powershell 中生成一个 RSA 公钥私钥对,并且我想对其进行测试。它应该能够加密/解密任何在线公钥/私钥验证服务上的数据。

目的 - 严格的教育。我非常清楚,出于安全目的,您不应该在线导出您的私钥。

到目前为止,我已经尝试过 ssh-keygen

$RSA = New-Object System.Security.Cryptography.RSACryptoServiceProvider(2048)
[System.Convert]::ToBase64String($rsa.ExportCspBlob(1))
[System.Convert]::ToBase64String($rsa.ExportCspBlob(0))

System.Security.Cryptography.RSACryptoServiceProvider 创建 P、Q 等所有用于计算公钥/私钥的原材料,但我不想要这些原材料。

ExportCspBlob(x) 提供了一个密钥,但是当我尝试在线验证时,密钥对验证失败。

那么,有没有办法在powershell中创建RSA公钥私钥对而不使用任何外部程序,可以直接复制粘贴成证书格式(带有-----BEGIN PRIVATE KEY ---- 东西)?

【问题讨论】:

SSH 需要这些密钥吗? @MikeTwc 不,正如我所说,教育目的。所以,我只想创建一个密钥对,并通过加密和解密一个字符串来测试它。 【参考方案1】:

如果你只是想用 powershell 实现公钥加密/解密,有内置工具可以做到这一点。要生成密钥对,只需使用 New-SelfSignedCertificate cmdlet,然后您可以使用生成的证书使用 Protect/Unprotect-CmsMessage 加密/解密数据(这是类似 PGP 的 cmdlet,这意味着您不必自己处理对称密钥部分) .然后要将密钥共享或移动到其他计算机,您可以使用 Import/Export-Certificate cmdlet。请参阅下面的示例

$store = "cert:\CurrentUser\My"

$params = @
 CertStoreLocation = $store
 Subject = "CN=Test1"
 KeyLength = 2048
 KeyAlgorithm = "RSA" 
 KeyUsage = "DataEncipherment"
 Type = "DocumentEncryptionCert"


# generate new certificate and add it to certificate store
$cert = New-SelfSignedCertificate @params


# list all certs 
# Get-ChildItem -path $store

# Encryption / Decryption

$message = "My secret message"

$cipher = $message  | Protect-CmsMessage -To "CN=Test1" 
Write-Host "Cipher:" -ForegroundColor Green
$cipher

Write-Host "Decrypted message:" -ForegroundColor Green
$cipher | Unprotect-CmsMessage


# Exporting/Importing certificate

$pwd = ("P@ssword" | ConvertTo-SecureString -AsPlainText -Force)
$privateKey = "$home\Documents\Test1.pfx"
$publicKey = "$home\Documents\Test1.cer"

# Export private key as PFX certificate, to use those Keys on different machine/user
Export-PfxCertificate -FilePath $privateKey -Cert $cert -Password $pwd

# Export Public key, to share with other users
Export-Certificate -FilePath $publicKey -Cert $cert

#Remove certificate from store
$cert | Remove-Item

# Add them back:
# Add private key on your machine
Import-PfxCertificate -FilePath $privateKey -CertStoreLocation $store -Password $pwd

# This is for other users (so they can send you encrypted messages)
Import-Certificate -FilePath $publicKey -CertStoreLocation $store

【讨论】:

以上是关于在 powershell 中生成 RSA 密钥对的主要内容,如果未能解决你的问题,请参考以下文章

在 Java 中生成 PKCS#1 格式的 RSA 密钥

在 Mono C# 中生成密钥对并使用此加密数据

使用Thales nShield HSM的PKCS11interop c#wrapper库导出/导入RSA密钥对?

设置Linux服务器通过密钥登录

Linux采用非用户密码登录服务器

RSA加密公钥系数获取结果多00