Bashまたは標準のLinuxコマンドラインツールのキーを使用してファイルをXORするにはどうすればよいですか?それは次のとおりです。
cat my1GBfile | xor my1MB.key > my1GBfile.encrypted
トピック以外:この例の暗号化はかなり弱いことがわかりましたが、これがbashまたは標準のLinuxコマンドラインツールで可能であるかどうかを知りたいと思いました(またはより良い方法:LinuxとWindowsの両方を使用するため、bashとcygwinで)。 )。
答え1
bash
ASCIINUL
文字は処理できないため、これにはシェル関数を使用せずに小さなプログラムが必要です。これはほとんどすべての言語で行うことができますが、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
答え2
pip経由でインストール可能XORツールファイルをXORするコマンドラインツールがありますxortool-xor
。 ::
$ echo "foo bar baz" | xortool-xor -r secretkey --no-cycle -f - > test.enc
$ xortool-xor --no-cycle -r secretkey -f test.enc
foo bar baz
$
答え3
GNUツールを使用すると、次のことができます。
paste <(od -An -vtu1 -w1 file) <(while :; do od -An -vtu1 -w1 key; done) |
LC_ALL=C awk 'NF!=2{exit}; {printf "%c", xor($1, $2)}'
プロセス置換をサポートするシェル(GNUシェルなど)、オプションをサポートするod
シェル-w
(GNUシェルなどod
)、GNU awk
(xor()
およびNULバイトを出力する機能、すべてawk
がこれを行うわけではありません)が必要です。