Bash 또는 표준 Linux 명령줄 도구의 키를 사용하여 파일을 XOR하려면 어떻게 해야 합니까? 그것은 다음과 같습니다:
cat my1GBfile | xor my1MB.key > my1GBfile.encrypted
주제 외: 이 예제의 암호화가 다소 약하다는 것을 알고 있지만 이것이 bash 또는 표준 Linux 명령줄 도구에서 가능한지 알고 싶었습니다(또는 더 나은 방법: Linux와 Windows를 모두 사용하므로 bash 및 cygwin에서). ).
답변1
bash
ASCII NUL
문자는 처리할 수 없으므로 이를 위해 쉘 함수를 사용하지 않고 작은 프로그램이 필요합니다. 이는 거의 모든 언어로 수행할 수 있지만 다음과 같이 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
것이 이것을 수행하는 것은 아님)가 필요합니다.