1. Что возвращают функции
protect() и
crypt()?
2. Почитайте про
разницу между OR и || в PHP и используйте && и || вместо AND и OR соответственно.
3. Используйте
XDebug или, в крайнем случае,
var_dump($password), чтобы узнать, что по факту лежит в этих переменных перед проверкой.
$password = crypt($_POST['password'], $salt);
Теперь в $password лежит не пароль, а его (скорее всего) хэш. И затем вы делаете проверку не длины пароля, а его хэша. Не надо так.