>>読み込みが成功したら(fread関数の戻り値が1)
>の戻り値が1とは厳密には、どういう事でしょうか?
 厳密に、といわれてもどう答えていいか困るけど、
fread(&ch, sizeof(char), 1, fp)
と書いた場合、読み取りが成功すると第三引数の値、
つまりこの場合では1がfread関数から返ってくる。1以外だと読み取り失敗。

>>fread(&ch, sizeof(char), 1, fp)
>>ch = ch - key[i++];
>等は、何故宜しくないのでしょうか?
 上の方はよろしくない、はいいすぎだったかも。
ただね、ぱっとこのソースを見て、「chの型がcharじゃなく変更されたら
どうすんだろ」って思った。fread(&ch, sizeof(ch), 1, fp)
なら、chの型は比較的意識しなくていいでしょ。そう思っただけ。
 下の方はありえないと思うよ。だって
ch = ch - key[i];
i++;
とでも書けばいいのに、なんで
ch = ch - key[i++];
なんて読みにくい書き方するわけ。前者は読めても後者は読めない人は
結構いるだろうし、後者にする積極的理由は現代には無いと思う。
(リソースが乏しくて1文字でもコード量を減らしたかった時代ならともかく)