Генерация пары ключей RSA в powershell - PullRequest
2 голосов
/ 21 марта 2019

Я хочу сгенерировать пару открытых закрытых ключей RSA в PowerShell без использования внешнего программного обеспечения и хочу протестировать ее. Он должен иметь возможность шифровать / дешифровать данные в любой онлайн-службе проверки открытого / закрытого ключа.

Цель - строго образовательная. Я очень хорошо понимаю, что вы не должны экспортировать свой личный ключ онлайн в целях безопасности.

Пока я пробовал 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) предоставляет ключ, но когда я пытаюсь проверить его онлайн, проверка пары ключей завершается неудачей.

Итак, есть ли способ создать пару открытого личного ключа RSA в powershell без использования каких-либо внешних программ, которые можно напрямую скопировать в формат сертификата (тот, который имеет ----- BEGIN PRIVATE KEY ---- материал)?

1 Ответ

1 голос
/ 22 марта 2019

Если вы просто хотите реализовать шифрование / дешифрование с открытым ключом с powershell, для этого есть встроенные инструменты.Для генерации пары ключей просто используйте командлет New-SelfSignedCertificate, затем вы можете использовать сгенерированный сертификат для шифрования / дешифрования данных с помощью Protect / Unprotect-CmsMessage (это PGP-подобные командлеты, то есть вам не нужно иметь дело с частью симметричного ключа самостоятельно),Затем, чтобы поделиться или переместить ключи на другие машины, вы можете использовать командлеты Import / Export-Certificate.Смотрите пример ниже

$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
...