使用PowerShell解密Python加密字符串
我正在使用python程序获取256字节或更多的大字符串,并使用AES-CBC对其进行加密。这将在Linux系统上发生,然后加密的数据将被传输到windows计算机,在那里进行解密。我可以用python加密数据,但无法在PowerShell中解密数据。我相信我的问题在于PowerShell代码,但我不能完全确定。在PowerShell中,我将获得一大串ASCII字符作为输出:使用PowerShell解密Python加密字符串,python,powershell,encryption,cryptography,aes,Python,Powershell,Encryption,Cryptography,Aes,我正在使用python程序获取256字节或更多的大字符串,并使用AES-CBC对其进行加密。这将在Linux系统上发生,然后加密的数据将被传输到windows计算机,在那里进行解密。我可以用python加密数据,但无法在PowerShell中解密数据。我相信我的问题在于PowerShell代码,但我不能完全确定。在PowerShell中,我将获得一大串ASCII字符作为输出: IV is equal to 81 114 150 34 27 90 82 1 78 188 221 119 110 2
IV is equal to 81 114 150 34 27 90 82 1 78 188 221 119 110 240 56 183
AES key is TXlwYXNzcGhyYXNlS2V5MQ==
Unencrypted string: TextMustBe16BytesUsually
Encrypted string: ZjE5NGRkMjY0MGU3NzJhNjRlZWI1MjlhYzlmNzk4N2NhNjE4ZjlmZDE5MmE3MWJjZDczMTBlZjBmNDQ3ZTUzMw==
Unencrypted string: g�V��⓪����DĖ u���.Ӣ���B�#�!�v����ƭɐ
我将发布以下两个来源,任何帮助都将不胜感激
Python:
from Crypto.Cipher import AES
import hashlib
import sys
import base64
import binascii
import Padding
val='TextMustBe16BytesUsually'
password='ew+39INFhCg+rcNZsY/bd64hWoopaOA5m8r9mgfF/x0='
ival= 12345678
plaintext=val
def encrypt2(plaintext,key, mode,iv):
encobj = AES.new(key,mode,iv)
return(encobj.encrypt(plaintext))
def decrypt2(ciphertext,key, mode,iv):
encobj = AES.new(key,mode,iv)
return(encobj.decrypt(ciphertext))
key = hashlib.sha256(password).digest()
iv= hex(ival)[2:8].zfill(16)
print "IV: "+ base64.b64encode(iv)
plaintext=val
plaintext = Padding.appendPadding(plaintext,blocksize=Padding.AES_blocksize,mode=0)
ciphertext = encrypt2(plaintext,key,AES.MODE_CBC,iv)
print ciphertext
print "Cipher (CBC): "+ base64.b64encode(binascii.hexlify(bytearray(ciphertext)))
plaintext = decrypt2(ciphertext,key,AES.MODE_CBC,iv)
plaintext = Padding.removePadding(plaintext,mode=0)
print "Decrypt: "+plaintext
Powershell:
function Create-AesManagedObject($key, $IV) {
$aesManaged = New-Object "System.Security.Cryptography.AesManaged"
$aesManaged.Mode = [System.Security.Cryptography.CipherMode]::CBC
$aesManaged.Padding = [System.Security.Cryptography.PaddingMode]::Zeros
$aesManaged.BlockSize = 128
$aesManaged.KeySize = 256
if ($IV) {
if ($IV.getType().Name -eq "String") {
$aesManaged.IV = [System.Convert]::FromBase64String($IV)
}
else {
$aesManaged.IV = $IV
}
}
if ($key) {
if ($key.getType().Name -eq "String") {
$aesManaged.Key = [System.Convert]::FromBase64String($key)
}
else {
$aesManaged.Key = $key
}
}
$aesManaged
}
function Create-AesKey() {
$aesManaged = Create-AesManagedObject
$aesManaged.GenerateKey()
[System.Convert]::ToBase64String($aesManaged.Key)
}
function Decrypt-String($key, $encryptedStringWithIV) {
$bytes = [System.Convert]::FromBase64String($encryptedStringWithIV)
$aesManaged = Create-AesManagedObject $key $IV
$decryptor = $aesManaged.CreateDecryptor();
$unencryptedData = $decryptor.TransformFinalBlock($bytes, 16, $bytes.Length - 16);
$aesManaged.Dispose()
[System.Text.Encoding]::UTF8.GetString($unencryptedData).Trim([char]0)
}
$key = "ew+39INFhCg+rcNZsY/bd64hWoopaOA5m8r9mgfF/x0="
"KEY:"
$key
"IV:"
$IV
$unencryptedString = "TextMustBe16BytesUsually"
"ENCRYPTED STRING"
$encryptedString = "ZjE5NGRkMjY0MGU3NzJhNjRlZWI1MjlhYzlmNzk4N2NhNjE4ZjlmZDE5MmE3MWJjZDczMTBlZjBmNDQ3ZTUzMw=="
$encryptedString
$backToPlainText = Decrypt-String $key $encryptedString
"Plain Text"
$backToPlainText
我修改了你的密码。您的加密缺少$IV引用 解密附加IV数组并将其传递给对象
function Encrypt-String($key, $unencryptedString) {
$bytes = [System.Text.Encoding]::UTF8.GetBytes($unencryptedString)
$aesManaged = Create-AesManagedObject $key $IV
$encryptor = $aesManaged.CreateEncryptor()
$encryptedData = $encryptor.TransformFinalBlock($bytes, 0, $bytes.Length);
[byte[]] $fullData = $aesManaged.IV + $encryptedData
$aesManaged.Dispose()
[System.Convert]::ToBase64String($fullData)
}
function Decrypt-String($key, $encryptedStringWithIV) {
$bytes = [System.Convert]::FromBase64String($encryptedStringWithIV)
$IV = $bytes[0..15]
$aesManaged = Create-AesManagedObject $key $IV
$decryptor = $aesManaged.CreateDecryptor();
$unencryptedData = $decryptor.TransformFinalBlock($bytes, 16, $bytes.Length - 16);
$aesManaged.Dispose()
[System.Text.Encoding]::UTF8.GetString($unencryptedData).Trim([char]0)
}
$unencryptedString = "TextMustBe16BytesUsually"
$encryptedString = Encrypt-String $key $unencryptedString
$backToPlainText = Decrypt-String $key $encryptedString
$backToPlainText
谢谢,尽管它确实有帮助,但问题在于python加密函数,而不是PowerShell函数。我需要它在Python中加密,在PowerShell中解密。很抱歉造成混淆。您的python代码只包含它数组[2,8]的一部分…为什么?因为hex函数以0xHex value格式打印传递给它的任何内容的值。[2:8]删除0x前缀。