簡體   English   中英

在 PowerShell 中加密的 Linux 字符串中解密

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM