Command-Line
將文件與密鑰異或
怎麼可能,從 bash 或標準的 linux 命令行工具,對一個密鑰進行異或文件?就像是:
cat my1GBfile | xor my1MB.key > my1GBfile.encrypted
題外話:我知道這個例子的加密很弱,但我只是想知道這是否可以從 bash 或標準 linux 命令行工具中獲得(或者更好:從 bash 和 cygwin,因為我同時使用 Linux 和 Windows )。
bash
不能處理 ASCIINUL
字元,所以你不會用 shell 函式來做這個,你需要一個小程序。這幾乎可以用任何語言完成,但用 C 語言完成似乎最容易,可能像這樣:#include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { FILE *kf; size_t ks, n, i; long pos; unsigned char *key, *buf; if (argc != 2) { fprintf (stderr, "Usage: %s <key>\a\n", argv[0]); exit(1); } if ((kf = fopen(argv[1], "rb")) == NULL) { perror("fopen"); exit(1); } if (fseek(kf, 0L, SEEK_END)) { perror("fseek"); exit(1); } if ((pos = ftell(kf)) < 0) { perror("ftell"); exit(1); } ks = (size_t) pos; if (fseek(kf, 0L, SEEK_SET)) { perror("fseek"); exit(1); } if ((key = (unsigned char *) malloc(ks)) == NULL) { fputs("out of memory", stderr); exit(1); } if ((buf = (unsigned char *) malloc(ks)) == NULL) { fputs("out of memory", stderr); exit(1); } if (fread(key, 1, ks, kf) != ks) { perror("fread"); exit(1); } if (fclose(kf)) { perror("fclose"); exit(1); } freopen(NULL, "rb", stdin); freopen(NULL, "wb", stdout); while ((n = fread(buf, 1, ks, stdin)) != 0L) { for (i = 0; i < n; i++) buf[i] ^= key[i]; if (fwrite(buf, 1, n, stdout) != n) { perror("fwrite"); exit(1); } } free(buf); free(key); exit(0); }
(這需要更多的錯誤檢查,但是很好)。
編譯上面的程式碼:
cc -o xor xor.c
然後像這樣執行它:
./xor my1MB.key <my1GBfile >my1GBfile.encrypted