Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell 偏执狂的多重AES 256迭代_Powershell_Encryption_Aes - Fatal编程技术网

Powershell 偏执狂的多重AES 256迭代

Powershell 偏执狂的多重AES 256迭代,powershell,encryption,aes,Powershell,Encryption,Aes,我认为AES256不够强大。如果您在加密之前知道字符(数字和字母)的预期范围,那么使用蛮力攻击应该很容易对其进行解密。我尝试使用部分正确的键,并设法看到纯文本的某些部分 最终我想到了对加密文本进行多次加密的想法。我对随机生成的密钥的要求是包含所有256个ASCII字符 假设我的密钥是2048字节。此密钥的每32个字节应加密以前加密的文本。这意味着2048/32=64次迭代 我下面的代码是基于 生成加密密钥 用密钥加密字符串 用密钥解密消息 生成加密密钥 用密钥加密字符串 用密钥解密消息 我认为A

我认为AES256不够强大。如果您在加密之前知道字符(数字和字母)的预期范围,那么使用蛮力攻击应该很容易对其进行解密。我尝试使用部分正确的键,并设法看到纯文本的某些部分

最终我想到了对加密文本进行多次加密的想法。我对随机生成的密钥的要求是包含所有256个ASCII字符

假设我的密钥是2048字节。此密钥的每32个字节应加密以前加密的文本。这意味着2048/32=64次迭代

我下面的代码是基于

生成加密密钥 用密钥加密字符串 用密钥解密消息 生成加密密钥 用密钥加密字符串 用密钥解密消息 我认为AES256不够强大

你应该证明这种说法。要强制执行128位密钥需要花费亿万年的时间,并在我们的太阳系上迭代256位密钥方式。到目前为止,AES还没有崩溃,你可以相信比我们聪明的人。尽管这假设关键是具有高熵(足够随机)

如果您在加密之前知道字符(数字和字母)的预期范围,那么使用蛮力攻击应该很容易对其进行解密

这与加密无关。您正在猜测值,如果消息空间有限(短输入消息),您可能会以不可忽略的概率猜测它。没办法

如果你谈论猜测明文或关键材料,情况就不同了。即使明文是1个字符,正确加密的值也不会显示您的猜测是否正确

当你随机生成你的密钥时,没有人会猜到它。256位是32字节长。整个问题在于密钥库很短且不是随机的(例如,从密码生成密钥)。然后我们只能用salt和一些密钥生成函数(pbkfd2,…)来“修补”弱输入,这仍然是唯一的解决办法

最终我想到了对加密文本进行多次加密的想法。我对随机生成的密钥的要求是包含所有256个ASCII字符

如前所述,多次加密没有安全性改进,对密钥提出额外要求可能会降低密钥的随机性

您将有256个字节=2048位密钥(=8 x 256个密钥)和256个字节!可能性(比真正的随机键2^2048可能性小得多)。如果AES本身可以工作,256位就足够了。如果AES被破坏,即使是8发(不是真正的radom钥匙)也帮不了你

我尝试使用部分正确的键,并设法看到纯文本的某些部分

那么你做的加密是非常错误的。即使您的密钥被关闭了1位,您也不能解密密文的任何部分

我认为AES256不够强大

你应该证明这种说法。要强制执行128位密钥需要花费亿万年的时间,并在我们的太阳系上迭代256位密钥方式。到目前为止,AES还没有崩溃,你可以相信比我们聪明的人。尽管这假设关键是具有高熵(足够随机)

如果您在加密之前知道字符(数字和字母)的预期范围,那么使用蛮力攻击应该很容易对其进行解密

这与加密无关。您正在猜测值,如果消息空间有限(短输入消息),您可能会以不可忽略的概率猜测它。没办法

如果你谈论猜测明文或关键材料,情况就不同了。即使明文是1个字符,正确加密的值也不会显示您的猜测是否正确

当你随机生成你的密钥时,没有人会猜到它。256位是32字节长。整个问题在于密钥库很短且不是随机的(例如,从密码生成密钥)。然后我们只能用salt和一些密钥生成函数(pbkfd2,…)来“修补”弱输入,这仍然是唯一的解决办法

最终我想到了对加密文本进行多次加密的想法。我对随机生成的密钥的要求是包含所有256个ASCII字符

如前所述,多次加密没有安全性改进,对密钥提出额外要求可能会降低密钥的随机性

您将有256个字节=2048位密钥(=8 x 256个密钥)和256个字节!可能性(比真正的随机键2^2048可能性小得多)。如果AES本身可以工作,256位就足够了。如果AES被破坏,即使是8发(不是真正的radom钥匙)也帮不了你

我尝试使用部分正确的键,并设法看到纯文本的某些部分


那么你做的加密是非常错误的。即使您的密钥被关闭了1位,您也不能解密密文的任何部分

如果您使用良好的密钥和块链接(如具有良好IV的CBC),则AES-256足够强大。为了防止对用户提供的密钥(密码)的暴力攻击,使用密钥派生算法(例如PBKDF2、scrypt).这里有问题吗?如果使用良好的密钥和块链接(如CBC和良好的IV),AES-256足够强大。为了防止对用户提供的密钥(密码)进行暴力攻击,使用了密钥派生算法(如PBKDF2、scrypt)。这里有问题吗?
$Message = "Place here your passwords or other confidential data."

# Define how many times you want to iterate (encrypt the encrypted content) AES256 cipher
# If it's 64 means that the genrated key will be: 64 * 32 = 2048 bytes long
$AesIterations = 64

# Define your minimum requirement of unique ASCII characters.
# You may never randomly generate unique 256 chars if the iterations are less than 64
$MinUniqueChars = 256
$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
$aesManaged.GenerateKey()

[byte[]]$bytes = @()

while (($bytes | Select-Object -Unique).Count -lt $MinUniqueChars) {

    [byte[]]$bytes = @()

    for ($i=0; $i -lt $AesIterations; $i++) {
        $aesManaged.GenerateKey()
        $bytes += $aesManaged.Key
    }   
}

$aesManaged.Dispose()
Write-Host ("`r`n Unique bytes: " + ($bytes | Select-Object -Unique).Count)
Write-Host ("`r`n Key length: " + ($bytes | Measure-Object).Count + " bytes`r`n")

# Create encryption key for later use.
$bytes | Set-Content .\mykey.key -Encoding Byte

# Get the encryption key in Base64 and export in a file.
$Base64Key = [System.Convert]::ToBase64String($bytes)
$Base64Key | Set-Content .\Base64Key.txt -Encoding ASCII -NoNewline -Force
Write-Host " Encryption key in Base64:`r`n"
$Base64Key
$enc = Get-Content .\mykey.key -Encoding Byte

$bytes = [System.Text.Encoding]::UTF8.GetBytes($Message)

for ($i=0; $i -lt (32 * $AesIterations); $i+=32) {
    $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
    $aesManaged.Key = $enc[$i..($i+31)]

    $encryptor = $aesManaged.CreateEncryptor()
    $encryptedData = $encryptor.TransformFinalBlock($bytes, 0, $bytes.Length)
    [byte[]]$bytes = $aesManaged.IV + $encryptedData

    $aesManaged.Dispose()
}

# Convert the encrypted message in Base64 and export in a file.
$EncryptedMessageBase64 = [System.Convert]::ToBase64String($bytes)
$EncryptedMessageBase64 | Set-Content .\EncryptedInBase64.txt -Encoding ASCII -NoNewline -Force

Write-Host "`r`n Encrypted message in Base64:`r`n"
$EncryptedMessageBase64
$enc = Get-Content .\mykey.key -Encoding Byte
$bytes = [System.Convert]::FromBase64String($EncryptedMessageBase64)

# Since the last 32 bytes from the key were used for last iteration you have to start with them first.
# The decryption goes backwards from last 32 bytes to the beginning of your key. 
for ($i=(32 * $AesIterations) - 1; $i -gt 0; $i-=32) {

    $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
    $aesManaged.Key = $enc[($i-31)..$i]
    $aesManaged.IV = $bytes[0..15]

    $decryptor = $aesManaged.CreateDecryptor()
    $bytes = $decryptor.TransformFinalBlock($bytes, 16, $bytes.Length - 16);
    $aesManaged.Dispose()

}

$PlainText = [System.Text.Encoding]::UTF8.GetString($bytes).Trim([char]0)
Write-Host "`r`n Decrypted message after $AesIterations AES256 iterations:`r`n"
$PlainText