В PHP mcrypt ня оболочки шифрования


Есть два ключа: основной aes128 и второе однако, используется только для рандомизации данных внутри АЭС. Рандомизация производится с секретными случайный ключ, который не знаешь, даже если кто-то точно знает, что зашифровано. Также ключ производится делаешь хэш-много количество раз, и этот хэш соленый с IV, так что это не возможно, чтобы сделать атаку по словарю с предвычисленным хэшам.

function aes128ctr_en($data,$key,$hash_rounds = 0) {
    //iv is created
    $iv = mcrypt_create_iv(16,MCRYPT_DEV_URANDOM);
    //internal secret random string is created so no one knows what
    //is exactly encoded by main cipher
    $xtea = mcrypt_create_iv(16,MCRYPT_DEV_URANDOM);
    //password is hashed in many rounds to prevent dictionary attack,
    //hashing is done with individual iv for hmac so it make no sense to use
    //precalculated hashes
    for($i=0;$i<=$hash_rounds;++$i) $key = hash_hmac('sha256',$key,$iv,true);
    //string is randomized for use in aes, so no one knows what actually will be encoded
    //this is not actual encoding so password is stored inside with xtea encoded string,
    //second half of this password is used as IV for xtea
    //again: THIS IS NOT ACTUAL ENCODING
    $data = $xtea.mcrypt_encrypt('xtea',$xtea,$data,'ofb',substr($xtea,8));
    //hash is added to check if return string is really what we looked for,
    //must match with string on decoding
    $data = hash('md5',$data,true).$data;
    //actual encoding, IV is prepended to encrypted string
    return $iv.mcrypt_encrypt('rijndael-128',$key,$data,'ctr',$iv);
}

function aes128ctr_de($data,$key,$hash_rounds = 0) {
    $iv = substr($data,0,16);
    $data = substr($data,16);
    for($i=0;$i<=$hash_rounds;++$i) $key = hash_hmac('sha256',$key,$iv,true);
    $data = mcrypt_decrypt('rijndael-128',$key,$data,'ctr',$iv);
    $md5 = substr($data,0,16);
    $data = substr($data,16);
    if (hash('md5',$data,true)!==$md5) return false;
    $xtea = substr($data,0,16);
    $data = substr($data,16);
    return mcrypt_decrypt('xtea',$xtea,$data,'ofb',substr($xtea,8));
}

$key = 'suPer_secret aAnd L10ng ppswrd$%';
$encrypted = aes128ctr_en('the bomb will blow up at 1 pm',$key,12345);
echo aes128ctr_de($encrypted,$key,12345);

У меня нет знаний, чтобы сделать его лучше. Я не настолько образованны во всем этом читать RFC и сделать алгоритмы выхода из него. Я также ограничивается методами, которые компилируются в PHP бинарные как я хочу, чтобы эти методы, чтобы иметь возможность работать на удаленных серверах.



1183
12
задан 5 января 2011 в 09:01 Источник Поделиться
Комментарии
2 ответа

Вы должны использовать ключ активизации функции, как PKBDF2, скрипт или осуществляется для генерации ключа из пароля.
Часть С однако это бесполезно: вы полагаетесь на безопасность через неясность.
Вы не должны хеш-шифрование, если вы хотите, чтобы убедиться, что данные не были подделаны. Использовать код HMAC SHA-256 на зашифрованные данные.

И наконец: не писать свой собственный алгоритм шифрования. Используйте известные и проверенные решения.

8
ответ дан 2 февраля 2011 в 11:02 Источник Поделиться

Основной ответ: Нет

Где твоя случайная семян создавал? (Ой, подождите, вы не используете случайный вижу, - серьезно большая проблема #1), где он хранится? Какие криптографических симметричных шифров используются для создания семян.

Вы ожидаете, что метод вы используете, чтобы быть защищенным? Вы ожидаете, что ваш сервер никогда не будет нарушена?

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

Я вижу много кода предназначен, чтобы сделать одну вещь, но это 100% риск, потому что вы не смогли сделать другие вещи, которые необходимы для процесса шифрования данных.

Все что сказал, Это было бы очень легкий для того чтобы произвести что-то более надежное, чем ваши 33 строк кода.

Но сначала вы должны научиться основам. После этого начнут искать через openssl_public_encrypt() и Crypt_Blowfish().

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

4
ответ дан 27 января 2011 в 12:01 Источник Поделиться