나는 나의 초기 질문으로 모든 것을 배웠다. 위의 문제에 대한 단 하나의 해결책이있는 것으로 보이며, 이는 형식 유지 암호화입니다. 알다시피, 내가 알 수있는 한, 이것을하는 기존의 명령은 없습니다.
그래서 첫 번째 옵션은 정확히 무엇을 했는가? 파일 이름을 해시하고 해시 및 파일 이름을 일반 파일 (디렉토리 당 하나의 파일)에 넣고 암호를 사용하여 파일을 암호화합니다.
여기에 내 코드를 게시 할 예정입니다. 아마 가장 예쁜 코드는 아니지만 이식성이 뛰어나지 만 작업은 정말 간단합니다 (IMO). 내가 어떤 OOP 신경 쓰지 않았고, 나 또한 확인하고 많은 단계가 대부분의 시간에는 이름이 엉망이 얻을 있는지 확인했기 때문에
#!/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]}";
아마 그것이 너무 오래 왜 유일한 이유는 복원 할 수 없습니다. 사용자 오류로 인해 여전히이 문제가 발생할 수 있습니다. 전혀 되돌릴 수 있다면 CCrypt
, 그것은 암호 해시 아니다 :
이
해시 테이블 파일을 암호화하는 데 사용되는 명령입니다. 그건 그들이 일하는 방식 /하는 일 /하는 일이 아닙니다. –@CharlesDuffy 알아, 나는 암호가 이것을 위해 정확히 언급했다. 하지만 난 해시의 속성 중 일부가 필요합니다. 해시 길이, 속도 등이 동일해야합니다. – areuz
(이제는 암호화 해시의 출력으로 일부 콘텐츠 xor'd를 저장할 수 있다고 가정합니다. 원하는 것을 선택하십시오. 그러나 목표를 자세히 설명하면 더 나은 제안을 얻을 수 있습니다.) –