我有这个脚本来加密和解密文本。
为什么在将解密的文本字节数组转换为ASCII时,每个字符之间都有一个空格?
#Encrypt:
$unencryptedData = "passwordToEncrypt"
$pfxPassword = "P@ssw0rd1"
$certLocation = "D:\Ava\CA\Scripts\Encryption\PFXfiles\f-signed.pfx"
$cert = New-Object 'System.Security.Cryptography.X509Certificates.X509Certificate2'($certLocation, $pfxPassword, [System.Security.Cryptography.X509Certificates.X509KeyStorageFlags]::Exportable)
$publicKey = $cert.PublicKey.Key.ToXmlString($false)
$privateKey = $cert.PrivateKey.ToXmlString($true)
$unencryptedDataAsByteArray = [System.Text.Encoding]::Unicode.GetBytes($unencryptedData)
$keySize = 16384
$rsaProvider = New-Object System.Security.Cryptography.RSACryptoServiceProvider($keySize)
$rsaProvider.FromXmlString($publicKey)
$encryptedDataAsByteArray = $rsaProvider.Encrypt($unencryptedDataAsByteArray, $false)
$encryptedDataAsString = [System.Convert]::ToBase64String($encryptedDataAsByteArray)
Write-Host "Encrypted password = $encryptedDataAsString"
#Decrypt:
$rsaProvider.FromXmlString($privateKey)
$encryptedDataAsByteArray = [System.Convert]::FromBase64String($encryptedDataAsString)
$decryptedDataAsByteArray = $rsaProvider.Decrypt($encryptedDataAsByteArray, $false)
$decryptedDataAsString = [System.Text.Encoding]::ASCII.GetString($decryptedDataAsByteArray)
###### "p a s s w o r d T o E n c r y p t " ######
#$decryptedDataAsString = [System.Text.Encoding]::Unicode.GetString($decryptedDataAsByteArray)
###### "passwordToEncrypt" ######
Write-Host "Decrypted password = $decryptedDataAsString"
答案 0 :(得分:3)
咨询Character Encodings in the .NET Framework。 [System.Text.Encoding]::Unicode
为UTF-16LE,因此字符A
被编码为16位值0x0041
,字节0x41 0x00
。 [System.Text.Encoding]::ASCII
是一种8位编码,因此当您使用ASCII解码0x41 0x00
时,您会得到字符A
和NUL
(不是空格)。
您必须使用编码它的相同编码对字节数组进行解码。
答案 1 :(得分:2)
在行中:
$unencryptedDataAsByteArray = [System.Text.Encoding]::Unicode.GetBytes($unencryptedData)
您正在将未加密的字节数组设置为Unicode字符串。这意味着对于字符串中的每个字符,数组中有2个字节。当它稍后被解密时,每个字符仍然是2个字节。
您需要以相反的顺序对其进行解密。首先,将其解密回Unicode。然后,如果您需要转到ASCII,请使用.Net Encoding.Convert方法之一。