パソコンの隣ですぐに読める
書籍版苦C
/* 使用法
CodeCaesar(入力ファイル名、出力ファイル名、パスワード);
パスワードは0~255の範囲内の数値にします
パスワードをマイナスの数にすれば復号できます。
*/
void CodeCaesar(char finame[], char foname[], int key)
{
FILE *fi, &*fo;
int value;
fi = fopen(finame, "rb");
if (fi == NULL) return;
fo = fopen(foname, "wb");
if (fo == NULL) return;
while ((value = getc(fi)) != EOF) {
putc(value + key, fo);
}
fclose(fi);
fclose(fo);
}
2進数の計算で、同じ数が入力された時に出力が0となる。
/* 使用法
CodeExor(入力ファイル名、出力ファイル名、パスワード);
※パスワードは0~255の範囲内の数値にします。
※同じパスワードで復号できます。
*/
void CodeExor(char finame[], char foname[], int key)
{
FILE *fi, &*fo;
int value;
fi = fopen(finame, "rb");
if (fi == NULL) return;
fo = fopen(foname, "wb");
if (fo == NULL) return;
while ((value = getc(fi)) != EOF) {
putc(value ^ key, fo);
}
fclose(fi);
fclose(fo);
}
考え方は単純です。複数の数値を繰り返して使えばよいだけです。
/*
使用法
CodeExor(入力ファイル名、出力ファイル名、パスワード文字列);
パスワードは任意の長さの文字列を指定できます。
同じパスワードで復号できます。
*/
void CodeExorLong(char finame[], char foname[], char key[])
{
FILE *fi, *fo;
int value, i = 0;
fi = fopen(finame, "rb");
if (fi == NULL) return;
fo = fopen(foname, "wb");
if (fo == NULL) return;
while ((value = getc(fi)) != EOF) {
putc(value ^ key[i], fo);
i++;
if (key[i] == '\0') i = 0;
}
fclose(fi);
fclose(fo);
}
/*
CodeExorRandom(入力ファイル名、出力ファイル名、パスワード文字列);
パスワードは任意の長さの文字列を指定できます。
同じパスワードで復号できます。
*/
int GetRandom(int min, int max)
{
return min + (int)(rand() * (max - min + 1.0) / (1.0 + RAND_MAX));
}
void CodeExorRandom(char finame[], char foname[], char key[])
{
FILE *fi, *fo;
int value, early = 0, i;
fi = fopen(finame, "rb");
if (fi == NULL) return;
fo = fopen(foname, "wb");
if (fo == NULL) return;
for (i = 0; key[i] != '\0'; i++) {
early += key[i];
}
srand(early);
i = 0;
while ((value = getc(fi)) != EOF) {
putc(value ^ GetRandom(0, 255), fo);
i++;
if (key[i] == '\0') i = 0;
}
fclose(fi);
fclose(fo);
}
苦しんで覚えるC言語(苦C)は
C言語入門サイトの決定版です。
C言語の基本機能を体系立てて解説しており、
市販書籍と同等以上の完成度です。