広告
最も簡単な暗号化/複合化を試してみる。
任意のデータとある定数値の排他的論理和(XOR)を2回とると元のデータに戻る性質を利用する。
例)
1 2 3 4 5 6 7 8 9 10 11 12 |
任意のデータ : 10101010 XORをとる定数: 11110000 1回目 10101010 XOR 11110000 ------------- 01011010 2回目 01011010 XOR 11110000 ------------- 10101010 ★ |
ソースコード
1byte単位で暗号/複合キーとのXORをとりファイルへ書き出す。
xor.c
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
#include <stdio.h> #include <stdlib.h> #include <stdint.h> #include <string.h> #include <errno.h> #define XOR_KEY 0xE5 int main(int argc, char* argv[]) { if (argc != 3) { printf("usage : %s <src file> <dst file> \n", argv[0]); exit(EXIT_FAILURE); } FILE* srcfp = fopen(argv[1], "rb"); if (NULL == srcfp) { perror("fopen"); exit(EXIT_FAILURE); } FILE* dstfp = fopen(argv[2], "w+b"); if (NULL == dstfp) { perror("fopen"); fclose(srcfp); exit(EXIT_FAILURE); } while(0 == feof(srcfp)) { uint8_t dat = 0x00; size_t rs = fread(&dat, sizeof(dat), 1, srcfp); if (rs == 0) { break; } /* 暗号化 or 複合化 */ dat ^= XOR_KEY; fwrite(&dat, sizeof(dat), 1, dstfp); } fclose(dstfp); fclose(srcfp); return 0; } |
暗号化対象のデータ
file1.txt
1 2 3 4 5 6 7 |
$ cat file1.txt abcdefghijklmnopqrstuvwxyz $ $ hexdump -C file1.txt 00000000 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 |abcdefghijklmnop| 00000010 71 72 73 74 75 76 77 78 79 7a 0a |qrstuvwxyz.| 0000001b |
実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
$ gcc -o xor xor.c $ ./xor file1.txt file2.txt $ ./xor file2.txt file3.txt $ $ hexdump -C file1.txt 00000000 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 |abcdefghijklmnop| 00000010 71 72 73 74 75 76 77 78 79 7a 0a |qrstuvwxyz.| 0000001b $ hexdump -C file2.txt 00000000 84 87 86 81 80 83 82 8d 8c 8f 8e 89 88 8b 8a 95 |................| 00000010 94 97 96 91 90 93 92 9d 9c 9f ef |...........| 0000001b $ hexdump -C file3.txt 00000000 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 |abcdefghijklmnop| 00000010 71 72 73 74 75 76 77 78 79 7a 0a |qrstuvwxyz.| 0000001b |
広告
広告