
シェル変数(コマンドライン入力から読み取る)にパスワードが保存されています。
また、ファイルにキーファイルが保存されています(使用してdd
作成されます/dev/urandom
)。
私のハードドライブの復号化にはこれら2つが必要だと思うので、2つをXORしてファイルに保存してキーとして使用したいと思います。
だから、最も簡単な方法が何であるかを知りたいです。
xxd
許可されている場合、これは完璧な選択ですが、-b
同時に-p
明らかにそうではありません...
編集:私はこれを使うでしょうhttps://github.com/xavierm02/combine-keys
答え1
シェルはビット操作を処理できますが、深刻な処理の場合は次のようになります。非常に速度が遅く、一度に約20個の数字しか処理できません。まだ:
sh <<\CMD
printf 'printf "%%b" "\\0$((%04o^04))"' "'a" |\
. /dev/stdin
CMD
#OUTPUT
A
私はbc
過去にバイナリバイトを傷つけたので、あなたの質問についてインターネット検索をしました。
インターネットでこの問題に対する解決策を見つけた場合は、おそらくbcに対応するC言語を探しているでしょう
^
。不快な真実:そんなことはありません
bc
。上向きbc
矢印演算子は整数指数化に使用されます。つまり、2^x
x の 2 番目のビット反転ではなく、2 の累乗を返します。 AND、OR、およびよりエキゾチックな親戚のためのXORおよびビット演算子に対応するものを探している場合は、このサイトのlogic.bcとこれらの操作を実行する関数を含む親戚を確認してください。
XOR
&&
ロジックandなどのifステートメントにロジックを入れたい場合は、条件を角括弧で囲んで使用してみ||
てください。!=
たとえば、
c=0;if((a==1)!=(b==2)){c=3}
a が 1 または b が 2 の場合、c は 3 に設定されますが、a が 1 で b がすべて 2 の場合はそうではありません。
(昔はlogic.bc xor()関数の中に秘密がありましたが、より速いアルゴリズムに置き換えられました。)
上記はbc
FAQから抜粋したものです。logic.bc
上記の機能には、探しているbitwise
ロジックが含まれています。見つけることができるここ。説明:
各種機能セットの実行ビットごとAND、OR、NOT、XORなどの関数です。この操作をまったくサポートしていないこのファイルの以前のバージョンとは異なり、負の数は2の補数を使用して表示されます。ここにあるいくつかの機能は、グローバルビット幅変数(それ自体がこのファイルの一部として初期化されます)を使用して、ほとんどのコンピュータで見つかったバイト/ワードサイズをエミュレートします。この変数が 0 に設定されている場合、ビット幅は無限大と見なされます。数値の補助浮動小数点表現が生成されたと思われる場合は、多くの関数が警告を表示します。たとえば、次のようになります。
1.1111... is an SFPR of
10.0000...;これらの警告は、グローバル変数を(デフォルトは1)
sfpr_warn
に設定することで無効にできます。0
- 固定フォントサイズ
- 言葉の長さ無制限
- 共通ビット別
- 2の報酬
- ビットシフト
- グレーコード
- 「乗算」
- 浮動小数点
- 浮動小数点「乗算」
- グレーコード+浮動小数点
答え2
Cバイナリを使用しました。
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char **argv) {
if (argc < 2) {
fprintf(stderr, "No argument given.\n");
exit(1);
}
char *filename = argv[1];
FILE *file = fopen(filename, "r");
if (file == NULL) {
fprintf(stderr, "Could not open given file.");
exit(1);
}
int c1;
int c2;
do {
c1 = fgetc(stdin);
c2 = fgetc(file);
if (c1 == EOF) {
while (c2 != EOF) {
printf("%c", c2);
c2 = fgetc(file);
}
break;
} else if (c2 == EOF) {
while (c1 != EOF) {
printf("%c", c1);
c1 = fgetc(stdin);
}
break;
}
int c = c1 ^ c2;
printf("%c", c);
} while (true);
exit(0);
}
答え3
SHではほとんど使えますが遅すぎます。
#!/bin/sh
small_hex_to_bin() {
hex=$1
hex_length=${#1}
bin=$(echo "ibase=16;obase=2;$hex" | bc)
bin_length=$((4*$hex_length))
bin=$(printf %0*d $bin_length $bin)
echo $bin
}
hex_to_bin() {
hex=$1
hex_length=${#hex}
for i in $(seq 1 $hex_length); do
hex_digit=$(expr substr $hex $i 1)
bin_digits=$(small_hex_to_bin $hex_digit)
echo -n $bin_digits
done
echo ""
}
bin_to_hex() {
bin=$1
hex=$(echo "ibase=2;obase=10000;$bin" | bc)
echo $hex
}
char_to_hex() {
char=$1
hex_lower=$(printf %x \'$char\')
hex=$(echo $hex_lower | tr '[:lower:]' '[:upper:]')
echo $hex
}
char_to_bin() {
char=$1
hex=$(char_to_hex $char)
bin=$(small_hex_to_bin $hex)
echo $bin
}
string_to_bin() {
s=$1
l=${#s}
for i in $(seq 1 $l); do
char=$(expr substr $s $i 1)
bin=$(char_to_bin $char)
echo -n $bin
done
echo ""
}
file_to_bin() {
filename=$1
hex_spaces=$(xxd -u -p $filename)
hex=$(echo $hex_spaces | tr -d '\n' | tr -d ' ')
bin=$(hex_to_bin $hex)
echo $bin
}
min() {
if [ $1 -ge $2 ]; then
echo $2
else
echo $1
fi
}
bit_xor() {
if [ $1 -eq $2 ]; then
echo 0
else
echo 1
fi
}
xor() {
b1=$1
b2=$2
l1=${#b1}
l2=${#b2}
l=$(min $l1 $l2)
for i in $(seq 1 $l); do
c1=$(expr substr $b1 $i 1)
c2=$(expr substr $b2 $i 1)
c=$(bit_xor $c1 $c2)
echo -n $c
done
next_i=$(($l + 1))
if [ $l -ne $l1 ]; then
for i in $(seq $next_i $l1); do
c1=$(expr substr $b1 $i 1)
echo -n $c1
done
fi
if [ $l -ne $l2 ]; then
for i in $(seq $next_i $l2); do
c2=$(expr substr $b2 $i 1)
echo -n $c2
done
fi
echo ""
}
#stdin=$(cat)
#file=$(cat $1)
#hex_to_bin $1
file_to_bin $1