Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feat/dearchive #30

Merged
merged 13 commits into from
Jun 7, 2021
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ QiiCipher で使えるコマンドは以下の通りです。
|暗号化(Encrypt)|`enc`|`$ ./enc KEINOS himitsu.txt`|
|アーカイブ&暗号化(Archive)|`archive`|[WIP](https://github.com/Qithub-BOT/QiiCipher/blob/master/bin/archive)|
|復号(Decrypt)|`dec`|`$ ./dec ~/.ssh/id_rsa himitsu.txt.enc himitsu.txt`|
|復号&解凍(DeArchive)|`dearchive`|[WIP](https://github.com/Qithub-BOT/QiiCipher/blob/master/bin/dearchive)|
|動作確認(Check)|`check`|`$ ./check KEINOS ~/.ssh/id_rsa`|
|電子署名(Sign)|`sign`|`$ ./sign KEINOS ~/.ssh/id_rsa himitsu.txt`|
|署名の確認(Verify)|`verify`|`$ ./verify himitsu.txt KEINOS himitsu.txt.sig`|
Expand Down
96 changes: 96 additions & 0 deletions bin/dearchive
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
#!/usr/bin/env bash

# AES SHA256 CBC 復号スクリプト (UTF-8)
# =======================================
#
#
# OpenSSL の AES-256-CBC と「共通鍵」を使って暗号化されたファイルを復号します。
#
# - 使い方の例:
# 以下のコマンドで復号&解凍済みファイル `myfile` が作成されます。
# (password.passwdはパスワードが書かれたテキストファイルです)
# $ ./dearchive myfile.tar.gz.aes myfile password.passwd
#
# 4つ目の引数として秘密鍵を指定すると、3つ目の引数で渡したパスワードファイルがencスクリプトで暗号化
# されているとみなし、秘密鍵で復号してからパスワードとして利用します。
# (password.passwd.encはencスクリプトで暗号化済みのパスワードが記録されたバイナリファイルです)
# $ ./dearchive myfile.tar.gz.aes myfile password.passwd.enc ~/.ssh/github_key
#
# - 注意:利用前にスクリプトに実行権限を与えるのを忘れないでください。
#

# ヘルプ表示
# ----------
if [[ $# -lt 3 ]]; then
echo
echo "ファイルを復号して解凍します。(AES-256-CBC暗号)"
echo
echo "使い方: $0 <input file> <output file> <password file> [<private key>]"
echo
echo "- <input file> : 復号&解凍したいファイルのパス"
echo "- <output file> : 復号&解凍済みファイルの出力先のパス"
echo "- <password file> : パスワードが記載されたファイル。"
echo " オプションの<private key>が指定されている場合は"
echo " パスワードがencスクリプトによって暗号化されているとみなします。"
echo
echo "[オプション]"
echo "- <private key> : encスクリプトで暗号化されたパスワードを復号するための秘密鍵。"
echo
exit 1
fi

md5s() {
if [ -e "$(which md5sum)" ]; then
echo "$1" | md5sum | awk '{ print $1 }'
elif [ -e "$(which md5)" ]; then
md5 -q -s "$1"
fi
}
KEINOS marked this conversation as resolved.
Show resolved Hide resolved

# コマンド引数取得
# ----------------
INPUTFILE=$1
OUTPUTFILE=$2
PASSWORDFILE=$3
PRIVATEKEYFILE=$4

# 一時ファイル
# ------------
TMP=$(md5s $RANDOM)
OUTPUTFILENAME=`basename ${OUTPUTFILE}`
KEINOS marked this conversation as resolved.
Show resolved Hide resolved
TEMPFILE="/tmp/QiiCipher_${TMP}.${OUTPUTFILENAME}.tar.gz"
yoshi389111 marked this conversation as resolved.
Show resolved Hide resolved
DECRYPTED_PASSWORDFILE="/tmp/QiiCipher_${TMP}.passwd"

# trap の設定
# -----------
# スクリプト終了後一時ファイルを削除します。
# - 参考URL : https://qiita.com/m-yamashita/items/889c116b92dc0bf4ea7d
trap "rm -rf /tmp/QiiCipher_${TMP}.*" 0

KEINOS marked this conversation as resolved.
Show resolved Hide resolved

# 秘密鍵が指定されていたら共通鍵が暗号化されているとみなし復号する
# --------------------
if [ -n "$PRIVATEKEYFILE" ]; then
dec $PRIVATEKEYFILE $PASSWORDFILE $DECRYPTED_PASSWORDFILE
KEINOS marked this conversation as resolved.
Show resolved Hide resolved
KEINOS marked this conversation as resolved.
Show resolved Hide resolved
PASSWORD=`cat ${DECRYPTED_PASSWORDFILE}`
else
PASSWORD=`cat ${PASSWORDFILE}`
fi
KEINOS marked this conversation as resolved.
Show resolved Hide resolved

# ファイルの復号テスト
# --------------------
echo -n "- 共通鍵でファイルを復号しています ... "

if ! openssl enc \
-d -aes-256-cbc \
-salt \
-k $PASSWORD \
-in "${INPUTFILE}" \
-out "${TEMPFILE}"; then
echo "NG:ファイルを復号できませんでした。"
exit 1
fi

tar -xf "$TEMPFILE" -C `dirname ${OUTPUTFILE}`
KEINOS marked this conversation as resolved.
Show resolved Hide resolved

echo "OK"