Command-Line

將文件與密鑰異或

  • June 15, 2021

怎麼可能,從 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

引用自:https://unix.stackexchange.com/questions/398481