Несколько AES 256 итераций для параноиков - PullRequest
0 голосов
/ 19 ноября 2018

Я не думаю, что AES256 достаточно силен. Если вы знаете ожидаемый диапазон символов (цифр и букв) перед шифрованием, должно быть легко расшифровать его с помощью атаки методом перебора. Я попытался с частично правильным ключом и смог увидеть некоторые части простого текста.

В конце концов мне пришла идея зашифровать зашифрованный текст несколько раз. Мое требование для случайно сгенерированного ключа должно содержать все 256 символов ASCII.

Скажем, мой ключ 2048 байт. Каждые 32 байта этого ключа должны шифровать ранее зашифрованный текст. Это означает 2048/32 = 64 итерации.

Мой код ниже основан на https://gist.github.com/ctigeek/2a56648b923d198a6e60

Ответы [ 2 ]

0 голосов
/ 19 ноября 2018

Я не думаю, что AES256 достаточно силен.

Такое утверждение вы должны доказать.Чтобы взломать 128-битный ключ, потребовались бы эоны и итерация 256-битного ключа по тепловой смерти нашей солнечной системы.Пока AES не сломлен, и вы можете доверять людям намного умнее, чем мы.Хотя это предполагает, что ключ обладает высокой энтропией (достаточно случайный).

Если вы знаете ожидаемый диапазон символов (цифр и букв) до шифрования, его легко расшифровать с помощью атаки методом перебора.

Это не имеет ничего общего с шифрованием.Вы угадываете значения, и если пространство сообщений ограничено (короткое входное сообщение), вы можете угадать его с немалой вероятностью.Никакого обхода.

Другое дело, если вы говорите об угадывании открытого текста или материала ключа.Даже если обычный текст состоит из 1 символа, правильно зашифрованное значение не покажет, что, если ваше предположение верно или нет.

Когда вы генерируете свой ключ действительно случайным образом, никто не сможет его угадать.256 бит длиной 32 байта.Весь вопрос в том, что база ключей короткая и не случайная (например, генерация ключей из паролей).Тогда мы можем только «исправить» слабый ввод солью и некоторой функцией генерации ключа (pbkfd2, ..), которая все еще остается только обходным путем.

В конце концов мне пришла идея зашифровать зашифрованный текст несколько раз.Мое требование к случайно сгенерированному ключу состоит в том, чтобы содержать все 256 символов ASCII.

Как уже отмечалось, улучшений безопасности по сравнению с многократным шифрованием нет, а введение дополнительных требований к ключу может даже снизить случайность ключа,

У вас будет 256 байт = ключ 2048 бит (= 8 x 256 ключей) с 256!возможности (что намного меньше, чем действительно случайный ключ из 2 ^ 2048 возможностей).Если сам AES работает, достаточно 256 бит.Если AES будет сломан, даже 8 раундов (из не очень радомных ключей) вам не помогут.

Я попытался с частично правильным ключом и смог увидеть некоторые части простого текста.

Тогда вы делаете шифрование очень неправильно.Даже если ваш ключ отключен на 1 бит, вы не сможете расшифровать любую часть зашифрованного текста.

0 голосов
/ 19 ноября 2018
$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
...