在 powershell 中使用 RSACryptoServiceProvider 解密文件

Posted

技术标签:

【中文标题】在 powershell 中使用 RSACryptoServiceProvider 解密文件【英文标题】:Decrypt file using RSACryptoServiceProvider in powershell 【发布时间】:2020-08-21 13:03:35 【问题描述】:

我在 debian 机器上使用私钥加密了一个文件,命令如下:

openssl rsautl -encrypt -inkey private.pem -in test.txt -out test.txt.ssl 

我还在这里使用 python 脚本将我的公钥从 pem 转换为 xml:https://github.com/MisterDaneel/PemToXml

我试图破译 Windows 机器上的 test.txt.ssl 文件,但我无法安装任何软件。所以我必须使用onlyRSACryptoServiceProvider。我的 powershell 脚本如下所示:

$InputFileLocation = (Get-Location).tostring() + "\public.pem.xml"
$InputFile = $ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath($InputFileLocation)
$pemRawStr = (Get-Content $InputFile) -join ''

$rsa = New-Object -TypeName System.Security.Cryptography.RSACryptoServiceProvider
$key = $rsa.FromXmlString($pemRawStr)
$rsa.ExportParameters($false)
[byte[]]$str = Get-Content "test.ssl" -Encoding Byte
$DecryptedStr = $rsa.Decrypt($str, $false);  
Write-Host "File content : " $DecryptedStr

但它不起作用。我有这个错误:

Exception calling "Decrypt" with "2" argument(s): "Key doesn't esist.
"
At C:\Users\RICHARDAN\Documents\Dev - Git\protectmi_analysis_processing-master\windows\test.ps1:9 char:1
+ $DecryptedStr = $rsa.Decrypt($str, $false);
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : CryptographicException

【问题讨论】:

尝试Get-Content -Encoding Byte 以字节数组而不是字符串的形式获取内容,然后将它们连接在一起。 我总是有同样的错误:Cannot convert argument "rgb", with value: ""....", for "Decrypt" to type "System.Byte[]": "Cannot convert value "....." to type "System.Byte[]". Error: "Cannot convert value ""~...." to type "System.Byte". Error: "The format of the character string is incorrect."+ $DecryptedStr = $rsa.Decrypt($str, $false); + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [], MethodException + FullyQualifiedErrorId : MethodArgumentConversionInvalidCastArgument 【参考方案1】:

作为Jeroen Mostert comments,这里的问题是Decrypt() 需要[byte[]],而不是[string]

要解决此问题,请使用 Get-Content -Encoding Byte 并分配给具有 [byte[]] 类型约束的变量:

[byte[]]$str = Get-Content "test.ssl" -Encoding Byte
$DecryptedStr = $rsa.Decrypt($str, $false);  
Write-Host "File content : " $DecryptedStr

【讨论】:

如果你在$rsa.FromXmlString($pemRawStr)之后调用$rsa.ExportParameters($false),它会返回什么?对象上的ExponentModulus 属性是否都设置了?如果和key对应的值opensslshow比较,是不是一样? 这是电话的返回:Exponent : 1, 0, 1 Modulus : 204, 89, 206, 161... P : Q : DP : DQ : InverseQ : D : File content : <RSAKeyValue><Modulus>zFnOoYQ8EP8JhT0OsNfKlhZguLNhG66+3uT2QCpx96/Qmd2ZYabY5L+tCYiZ7sU1WlM/VJ+RtBx+omU1QG Z+heSOVius9Qyc09Htouqf+ttMOqu98i8zasA2r3fqYPtYckZQpvK6hUZPX6uln7ge7fVRrwt/Lm/E7HU2LnUlYac=</Modulus><Exponent>AQAB</Expo nent></RSAKeyValue> 并且您已经验证了 ExponentModulus 值与使用 openssl rsa -pubin -in pub.pem -inform PEM -text -noout 检查原始 pem 格式的 pub 密钥时显示的值相同?根据您的评论,OpenSSL 显示的模数应以 cc:59:ce:a1... 开头 你是对的,这不是相同的值。 RSA 公钥:(1024 位) 模数:00:cc:59:ce:a1:84:3c:10:ff:09:85:3d:0e:b0:d7: ca:96:16:60:b8 :b3:61:1b:ae:be:de:e4:f6:40:2a: 71:f7:af:d0:99:dd:99:61:a6:d8:e4:bf:ad:09:88 : 99:ee:c5:35:5a:53:3f:54:9f:91:b4:1c:7e:a2:65: 35:40:66:7e:85:e4:8e:56:2b:ac :f5:0c:9c:d3:d1: ed:a2:ea:9f:fa:db:4c:3a:ab:bd:f2:2f:33:6a:c0: 36:af:77:ea:60 :fb:58:72:46:50:a6:f2:ba:85:46:4f:5f:ab:a5:9f:b8:1e:ed:f5:51:af:0b:7f:2e:6f : c4:ec:75:36:2e:75:25:61:a7 指数:65537 (0x10001) 这可以解释 :) 在这种情况下,我可能会尝试直接从 pem 文件中对公钥内容进行 base64 解码,而不是尝试转换为 xml。

以上是关于在 powershell 中使用 RSACryptoServiceProvider 解密文件的主要内容,如果未能解决你的问题,请参考以下文章

通过 powershell 在 jenkins 中使用 AnsiColor

在 PowerShell 中使用特定配置文件启动 Chrome

Powershell中命令自动补全功能及使用Windows命令

powershell脚本隐藏退出码

在 windows 10 powershell 中使用 sqlplus 执行 sql 文件

如何在 powershell 中使用变量调用命令?