Прошу прощения, в чем некорректное? Или вы имеете ввиду, что надо:
int readed = 0;
while ((readed += reader.read(buffer, readed, keyLength - readed) < keyLength)
    ; // Continue reading

Случай -1 тоже вроде как обрабатывается корректно (мы считали размер ключа, но не сам ключ => файл битый)