NAS 
О расшифровке алгоритсма. На самом деле принцип кодирования очень прост.
первый разряд кода символа имеет ключ:
Q R O P U V S T I J G H M N K L
второй разряд кода символа имеет ключ:
K L I J O P M N C D A B G H E F
Стартовый символ: 0 -> 1С (в шеснадцатиричной системе счисления)
смещение первого разряда отностельно таблицы чисел и заглавных символов - +7
смещение первого разряда отностельно таблицы заглавных символов и строчных символов - +6
смещение второго разряда при переходе на следующий символ - -2
т.е. формула вычисления кода символа:
символ = [код символа hex] - (30 - 1C) + (4B-20)*[номер сивола в строке];
сокращенно:
символ = [код символа hex] - 20 + 2B*[номер сивола в строке];
(соответственно все считаем в шеснадцатиричной системе)
из полученного символа берем 2 последнии цифры и переводим в соответствии с ключами:
десятки:
0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F
K  L  I   J  O  P  M N  C  D  A  B  G  H  E  F
единицы:
0  1   2   3  4  5   6  7   8  9   A  B  C  D  E  F
Q  R  O   P  U  V  S   T  I   J   G  H  M  N  K  L
Получаем наш код...
Теперь попробуем объяснить теорию... %-)
для кодирования берутся просто 2 последовательности заглавных символов длинной в 16, для десятков и единиц с смещением, в нашем случае последовательности такие:
десятки: ABCDEFGHIJKLMNOP
единицы: GHIJKLMNOPQRSTUV
потом эти последовательности разбиваются на пополам, потом на пары, и собираются в виде: 
 Вторая половина      Первая половина
(2-я, 1-я, 4-я, 3-я) + (2-я, 1-я, 4-я, 3-я)
К сожалению я не видел кода crhbgnf поэтому не могу сказать какой функцией это делается, принцип простой: замена соседних пар, замена соседних пар пар, замена соседних пар пар пар.
соответственно собираем 2 готовые последовательности (ключи)
Потом идет смещение относительно первого символа "0" - 14(hex) или 20(dec) (может тоже как-то вычисляется относительно смещения последовательностей символов);
между последовательностями цифр, заглавных букв и строчных букв смещение +7 и +6 соответственно, прямо как в таблице кодировки, поэтому я подозреваю, что символы между этими последовательностями (например: = < > ?) тоже можно использовать в пароле (просто в приведенных выше паролях их не было, поэтому точно сказать не могу)
как только доходим до символа z - код продолжается, но от него отнимают 2 десятка и эти коды применяются для следующего символа в пароле... 
Сотни, соответственно, отбрасываются...
Вроде все...
Если, что не по человечески объяснил, или может опечатался где, напишите объясню...