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