私は私の最初の質問ですべての方法を得た。上記の問題に対する唯一の解決策があるように思われます。それは、(Jamesが示唆したように)フォーマットを保持する暗号化です。しかし、私が知る限り、これを行う既存のコマンドはありません。
私は非常に最初の選択肢でしたが、ファイル名をハッシュし、ハッシュとファイル名をプレーンファイル(ディレクトリごとに1つのファイル)に入れ、そのファイルをパスフレーズで暗号化しています。
ここに私のコードを掲載します。それはおそらく、最もかわいい、または最も移植性の高いコードではありませんが、仕事をして、本当に簡単です(IMO)。
#!/usr/bin/env bash
man="Usage: namecrypt [ -h ] [ -e || -d ] [ -F ] [ -D ] [DIRECTORY] [PASSPHRASE]\n
-h, --help display this message
-e, --encrypt encrypt the specified directory
-d, --decrypt decrypt the specified directory
-F, --files include files
-D, --dir include directories
[DIRECTORY] relative or absolute path to a directory/symbolic link
[PASSPHRASE] optional - specify the user passphrase on command line";
options=();
for Arg in "[email protected]"; do
if [ "$Arg" == "-h" ] || [ "$Arg" == "--help" ]; then
echo -e "$man"; exit;
elif [ "$Arg" == "-e" ] || [ "$Arg" == "--encrypt" ]; then
options[0]="E";
elif [ "$Arg" == "-d" ] || [ "$Arg" == "--decrypt" ]; then
options[0]="D";
elif [ "$Arg" == "-F" ] || [ "$Arg" == "--files" ]; then
options[1]="${options[1]}F";
elif [ "$Arg" == "-D" ] || [ "$Arg" == "--dir" ]; then
options[1]="${options[1]}D";
elif [ -d "$Arg" ]; then
options[2]="$(realpath "$Arg")";
else
options[3]="$Arg";
fi;
done;
if [ "${options[0]}" == "" ]; then echo "No Mode specified!"; exit 1; fi;
if [ "${options[1]}" == "" ]; then options[1]="F"; fi;
if [ "${options[2]}" == "" ]; then echo "No such directory!"; exit 2; fi;
if [ "${options[3]}" == "" ]; then echo "Enter a passphrase: "; read options[3]; fi;
shopt -s nullglob dotglob;
function hashTarget
{
BASE="$(basename "$1")";
DIR="$(dirname "$1")/";
if [ -a "$1" ]; then
oldName="$BASE";
newName=$(echo "$oldName" | md5sum);
echo "$oldName||$newName" >> "$DIR.names";
mv "$1" "$DIR$newName";
else echo "Skipping '$1' - No such file or directory!";
fi;
}
function dehashTarget
{
BASE="$(basename "$1")";
DIR="$(dirname "$1")/";
[ -f "$DIR.names.cpt" ] && ccdecrypt -K "${options[3]}" "$DIR.names.cpt";
if [ -f "$DIR.names" ]; then
oldName="$BASE";
newName=$(grep "$oldName" "$DIR.names" | awk -F '|' '{print $1}');
[[ ! -z "${newName// }" ]] && mv "$1" "$DIR$newName";
else
echo "Skipping '$1' - Hash table not found!";
fi;
}
function mapTarget
{
DIR="$(dirname "$1")/";
for Dir in "$1"/*/; do
mapTarget "$Dir";
done;
for Item in "$1"/*; do
if ([ -f "$Item" ] && [[ "${options[1]}" == *"F"* ]]) ||
([ -d "$Item" ] && [[ "${options[1]}" == *"D"* ]]); then
if [ "${options[0]}" == "E" ]; then
hashTarget "$Item";
else
dehashTarget "$Item";
fi;
fi;
done;
[ "${options[0]}" == "D" ] && [ -f "$DIR.names" ] && rm "$DIR.names";
[ "${options[0]}" == "E" ] && [ -f "$DIR.names" ] && ccencrypt -K "${options[3]}" "$DIR.names";
}
mapTarget "${options[2]}";
私はOOPと気にしませんでしたので、それは、とても長いですされている理由おそらく唯一の理由、と私はまた、名前のない時間のほとんどは、マングルされ得ることを確認するチェックと手順の多くをやりました復元することはできません - ユーザーエラーがこれを引き起こす可能性があります。
これは、ハッシュ・テーブル・ファイルを暗号化するために使用されるコマンドです:CCrypt
それがすべてで可逆的なら、それは暗号化ハッシュではありません。それは彼らがどのように仕事をしているのか、彼らが何をしているのか、彼らが何をするのか、 –
@CharlesDuffy私はそれを知っています、私は暗号がまさにこのためだと言いました。しかし、私はハッシュのプロパティのいくつかが必要です - 一定のハッシュ長さ、スピードなど – areuz
(今、私はあなたが暗号化ハッシュの出力でいくつかのコンテンツxor'dを保存できると思います - あなたの目標をより詳細に記述すれば、より良い提案を得ることができます)。 –