[英]decrypt in Linux string encrypted in PowerShell
我有以下 PowerShell 命令
$a = 'MySecret'
$b = 'MySecretKey4Test'
$c = ConvertTo-SecureString $a -AsPlainText -Force | ConvertFrom-SecureString -Key ($b.ToCharArray() | % {[byte]$_})
簡而言之,我使用 $b 作為密鑰加密 $a。 如何在 Linux 下解密結果字符串 $c,例如使用 openssl?
我試過這些東西
$b | out-file 'b.txt' -enc ascii
$c | out-file 'c.txt' -enc ascii
然后在同一個文件夾中,我試過
openssl enc -d -aes128 -in c.txt -kfile b.txt
但它因“壞幻數”而失敗:(
我知道這個問題已經有 4 年歷史了,但是當我去尋找同樣的東西時它仍然出現在我的搜索結果的頂部,而且沒有答案。
這是答案。
首先使用您的腳本創建一個加密字符串:
$a = 'MySecret'
$b = 'MySecretKey4Test'
$c = ConvertTo-SecureString $a -AsPlainText -Force | ConvertFrom-SecureString -Key ($b.ToCharArray() | % {[byte]$_})
讓我們將 b(密鑰)和 c(加密字符串)放入 bash 中:
b="MySecretKey4Test"
c="76492d1116743f0423413b16050a5345MgB8ADkATgB4AEgAMQBZAHAAdABYAGgASgBJAGoAWABIAFMARgBoAHEANABhAHcAPQA9AHwAOABhADYANgBkAGUAZQBhAGIAMQBiADcANAA4ADMAZgA5AGUAYwA2ADEAZQBiADYAZAA5AGYAMgBmAGMAYgBmAGEANQBhADgAOAA4AGEAYgBhAGIAMgBiADAAYQA4AGYAMwBhAGYANwAyADUAYgA1AGMANgA4ADQAZQBjADgAMAA="
我們需要將密鑰轉換為十六進制,注意不要在最后得到換行符。
read -r b < <(echo -n "$b"|xxd -p -c 9999)
我們需要從加密字符串的開頭刪除一個固定的頭。 固定標頭始終為76492d1116743f0423413b16050a5345
。 不知道為什么會在這里,但確實如此。
c="${c/76492d1116743f0423413b16050a5345/}"
接下來,將加密的字符串解碼為 base64 並將其傳遞給 iconv,以正確解析 utf16-le 字符。 然后將結果拆分為|
成一個數組(這里稱為parts
)。
IFS='|' read -r -a parts < <(base64 -d <<< "$c"|iconv -f UTF16LE -co - -)
parts[0]
只是一個零件計數,它將是2
,可以忽略。 parts[1]
是 base64 格式的 cbc 初始化向量,但 openssl 需要十六進制。
read -r iv < <(base64 -d <<< "${parts[1]}"|xxd -p -c 99999)
parts[2]
是十六進制格式的實際加密數據。
read -r crypt <<< "${parts[2]}"
現在我們使用密鑰 ($b)、iv ($iv) 和加密數據 ($crypt) 進行解密。 $crypt 需要先轉換為二進制,所以我們使用 xxd。
read -r decrypted < <(openssl enc -d -A -aes-128-cbc -iv "$iv" -K "$b" < <(xxd -r -p <<< "$crypt"))
echo "$decrypted"
現在都在一起了:
b="MySecretKey4Test"
c="76492d1116743f0423413b16050a5345MgB8ADkATgB4AEgAMQBZAHAAdABYAGgASgBJAGoAWABIAFMARgBoAHEANABhAHcAPQA9AHwAOABhADYANgBkAGUAZQBhAGIAMQBiADcANAA4ADMAZgA5AGUAYwA2ADEAZQBiADYAZAA5AGYAMgBmAGMAYgBmAGEANQBhADgAOAA4AGEAYgBhAGIAMgBiADAAYQA4AGYAMwBhAGYANwAyADUAYgA1AGMANgA4ADQAZQBjADgAMAA="
read -r b < <(echo -n "$b"|xxd -p -c 9999)
c="${c/76492d1116743f0423413b16050a5345/}"
IFS='|' read -r -a parts < <(base64 -d <<< "$c"|iconv -f UTF16LE -co - -)
read -r iv < <(base64 -d <<< "${parts[1]}"|xxd -p -c 99999)
read -r crypt <<< "${parts[2]}"
read -r decrypted < <(openssl enc -d -A -aes-128-cbc -iv "$iv" -K "$b" < <(xxd -r -p <<< "$crypt"))
echo "$decrypted"
結果:
MySecret
請注意,如果您使用 32 字節(256 位)密鑰而不是 16 字節(128 位)密鑰,請在您的 openssl 命令中使用-aes-256-cbc
而不是-aes-128-cbc
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.