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
2 changes: 1 addition & 1 deletion .github/run-lint.sh
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ SUCCESS=0
FAILURE=1

# 拡張子のないスクリプトファイル一覧(テスト対象リスト)
LIST_SCRIPT_NO_EXT="archive check dec enc keygen sign verify checkkeylength"
LIST_SCRIPT_NO_EXT="archive check dec enc keygen sign verify checkkeylength dearchive"

echo '==============================================================================='
echo ' Requirement Check for Linting and Static Analysis'
Expand Down
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,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
105 changes: 105 additions & 0 deletions bin/dearchive
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
#!/usr/bin/env bash

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

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

# md5s は md5sum/md5 のラッパー関数です.
md5s() {
if type md5sum 1>/dev/null 2>/dev/null; then
echo "$1" | md5sum | awk '{ print $1 }'
return $?
fi

if type md5 1>/dev/null 2>/dev/null; then
md5 -q -s "$1"
return $?
fi

echo >&2 'MD5 ハッシュ関数がありません。'
exit 1
}

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

# 一時ファイル
# ------------
TMP=$(md5s $RANDOM)
TEMPFILE="/tmp/QiiCipher_${TMP}.tar.gz"
DECRYPTED_PASSWORDFILE="/tmp/QiiCipher_${TMP}.passwd"

# trap の設定
# -----------
# スクリプト終了後一時ファイルを削除します。
# - 参考URL : https://qiita.com/m-yamashita/items/889c116b92dc0bf4ea7d
trap "rm -rf /tmp/QiiCipher_${TMP}"'.*' 0
# 秘密鍵が指定されていたら共通鍵が暗号化されているとみなし復号する
# --------------------
if [ -n "$PRIVATEKEYFILE" ]; then
PATH_DIR_BIN="$(cd "$(dirname "${BASH_SOURCE:-$0}")" && pwd)"
"${PATH_DIR_BIN}"/dec "$PRIVATEKEYFILE" "$PASSWORDFILE" "$DECRYPTED_PASSWORDFILE"
PASSWORD=$(cat "${DECRYPTED_PASSWORDFILE}")
else
PASSWORD=$(cat "${PASSWORDFILE}")
fi

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

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

if ! tar -xf "$TEMPFILE" -C "${OUTPUTPATH}"; then
echo >&2 'NG: ファイルを解凍できませんでした。'
exit 1
fi

echo "OK"