gpt4 book ai didi

php - 使用 MCRYPT_RIJNDAEL_256 的 PHP 加密库对应的 Powershell 模块是什么?

转载 作者:行者123 更新时间:2023-12-02 23:27:25 26 4
gpt4 key购买 nike

PHP代码:
mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $to_encrypt, MCRYPT_MODE_ECB);
我需要可以产生相同结果的相应 powershell 代码。

我已经尝试过 ConvertTo-SecureString/ConvertFrom-SecureString。

Powershell 代码(不产生正确的加密):

$api_code = "214e3854a1ec5433ae986d1e5d40c436"
$params = @{"controller" = $controller; "action"= $action; "all"= $TRUE; }
[Byte[]] $key = $api_code[0..$api_code.length]
$param_object = $params | ConvertTo-SecureString -AsPlainText -Force
$param_aes = $param_object | ConvertFrom-SecureString -key $key

加密的字符串出来不同。是否有我缺少的参数?或者是否有另一个模块?

最佳答案

正如评论中所指出的,SecureString s 与 Rijndael 规范无关,MCRYPT_RIJNDAEL_256与 AES256 不同(使用 256 位 key 引用 Rijndael-128)

因此,为了解决您的问题,我们只需要一个函数来使用 block 大小为 256 的 Rijndael 在 ECB 密码模式下加密明文。

为此,显而易见的选择是 RijndaelManaged 类(class)。幸运的是,MSDN 文档提供了一个基本但功能齐全的示例,说明如何使用 RijndaelManaged类和 CryptoStream 加密和解密字符串 - 我们需要做的就是在 PowerShell 中重写它并更改 block 大小和密码模式:

function Encrypt-Rijndael256ECB {
param(
[byte[]]$Key,
[string]$Plaintext
)

$RijndaelProvider = New-Object -TypeName System.Security.Cryptography.RijndaelManaged

# Set block size to 256 to imitate MCRYPT_RIJNDAEL_256
$RijndaelProvider.BlockSize = 256
# Make sure we use ECB mode, or the generated IV will fuck up the first block upon decryption
$RijndaelProvider.Mode = [System.Security.Cryptography.CipherMode]::ECB
$RijndaelProvider.Key = $key

# This object will take care of the actual cryptographic transformation
$Encryptor = $RijndaelProvider.CreateEncryptor()

# Set up a memorystream that we can write encrypted data back to
$EncMemoryStream = New-Object System.IO.MemoryStream
$EncCryptoStream = New-Object System.Security.Cryptography.CryptoStream -ArgumentList $EncMemoryStream,$Encryptor,"Write"
$EncStreamWriter = New-Object System.IO.StreamWriter -ArgumentList $EncCryptoStream

# When we write data back to the CryptoStream, it'll get encrypted and written back to the MemoryStream
$EncStreamWriter.Write($Plaintext)

# Close the writer
$EncStreamWriter.Close()
# Close the CryptoStream (pads and flushes any data still left in the buffer)
$EncCryptoStream.Close()
$EncMemoryStream.Close()

# Read the encrypted message from the memory stream
$Cipher = $EncMemoryStream.ToArray() -as [byte[]]
$CipherText = [convert]::ToBase64String($Cipher)

# return base64 encoded encrypted string
return $CipherText
}

解密过程几乎相同,不过这次我们需要反转它并通过 CryptoStream 从 MemoryStream 中读回密文:

function Decrypt-Rijndael256ECB {
param(
[byte[]]$Key,
[string]$CipherText
)

$RijndaelProvider = New-Object -TypeName System.Security.Cryptography.RijndaelManaged

$RijndaelProvider.BlockSize = 256
$RijndaelProvider.Mode = [System.Security.Cryptography.CipherMode]::ECB
$RijndaelProvider.Key = $key

$Decryptor = $RijndaelProvider.CreateDecryptor()

# Reverse process: Base64Decode first, then populate memory stream with ciphertext and lastly read decrypted data through cryptostream
$Cipher = [convert]::FromBase64String($CipherText) -as [byte[]]

$DecMemoryStream = New-Object System.IO.MemoryStream -ArgumentList @(,$Cipher)
$DecCryptoStream = New-Object System.Security.Cryptography.CryptoStream -ArgumentList $DecMemoryStream,$Decryptor,$([System.Security.Cryptography.CryptoStreamMode]::Read)
$DecStreamWriter = New-Object System.IO.StreamReader -ArgumentList $DecCryptoStream

$NewPlainText = $DecStreamWriter.ReadToEnd()

$DecStreamWriter.Close()
$DecCryptoStream.Close()
$DecMemoryStream.Close()

return $NewPlainText
}

Rijndael256 in action

关于php - 使用 MCRYPT_RIJNDAEL_256 的 PHP 加密库对应的 Powershell 模块是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31007475/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com