コード:

#include <stdio.h>
#include <string.h>
#include <sys/file.h>

#define key 1234
#define SIZE 16

int main()
{

    int i;
    char str[SIZE];
    fpos_t ft;
    FILE *fp;
    fp = fopen("test.dat", "rb");
    FILE *file;
    file = fopen("test2.dat","wb");

    int j = 0;
    while(1){
        memset(str, 0, sizeof(str));
        fseek(fp, j, SEEK_SET);
        fread(str, SIZE-1, 1, fp);

        for(i=0; i<strlen(str); i++){
            fprintf(file, "%c", (char)(str[i] ^ key));
            printf("%c", str[i]);
        }
        if(str[i+1]=='\0'){puts("a"); break;}
        //if(feof(fp)){printf("aaa"); break;}
        j += 15;
    }
    fclose(fp);
    fclose(file);

    return 0;
}

小さめのテキストファイルでしか試してませんが、テキストファイルの場合はこのコードで暗号化復号化できます。
画像ファイルや実行ファイルで試すとうまくいきません。
このまま1.1MBくらいの画像ファイルで動かしてみると120バイトのファイルが出力されて、コメントアウトしてるif文に切り替えると1MBのファイルが出力されました。
どうすればいいと思いますか?