macOS catalinaでAutomatorのサービスでAES256暗号強度なパスワードZipファイルを作る（しかもWindowsで開く想定）

#目的
Windows環境な人にMacからファイルを送る為に、AES256で暗号化してパスワードつけたZipファイルを作りたい。しかも手軽に。

![イメージ-2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116534/f0a25254-6dc4-6a1e-3a66-868447f47d71.gif)



#Step概要
1. 7zを入れる
2. Finderにフルディスクアクセスをつける
3. Automatorで暗号化サービスを作成する

#では早速
## 1. 7zを入れる

以下でインストールします。簡単ですね。

```
brew install p7zip
```

（brewが入っていない人は適宜入れておいてください）

## 2. Finderにフルディスクアクセスをつける
**`Operation not permitted`** エラーで動かない原因がこれだと気付くまで何気にハマった箇所でした。Catalinaは中々厳しいです。

ではまず最初に、`システム環境設定` を開きます。
<img width="125" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116534/4ee266d3-87c8-5c06-bec3-b8e83514f67e.png">
 `セキュリティとプライバシー` を開きます。
<img width="88" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116534/10303012-d0fc-f738-bace-75fa9d7815d3.png">

ここで`変更するにはカギをクリックします`の横のカギマークをクリックして編集可能にします。
<img width="249" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116534/35c0e983-195e-16f2-bdf3-09928ba89098.png">
が
<img width="345" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116534/466f647f-d71d-d95b-38eb-42257ce831df.png">
のようになればOK。

`フルディスクアクセス` を選択し右側のペインに`Finder`が入っていない場合は`+` マークを押します。
アプリケーション選択ダイアログが出てくるので、`Command + ↑`などで最上位階層まで上がり、
`Macintosh HD` → `システム` → `ライブラリ` → `CoreServices`と辿ると`Finder.app`が見えるはずですので、それを選択して`OK`してください。
以下のようになればOK。
<img width="665" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116534/446e052e-7cd2-400c-1ebe-999ac243d0e8.png">

これをやらないと、後で7zコマンドを叩いた時に権限不足でエラーになるのです。(7z入れてみたりAutomatorを追加してみたりしましたがダメでした。）

不安な方は一度この後の実装をやってエラーが出ることを確認してから、この`フルディスクアクセス`への権限追加を実施してもらってもOKです。Finderの再起動を求められますので、実施してもらってOKです。（その際、開いているFinderが一度全部閉じてしまいますので、作業途中のものがある場合は注意してください。）

また、不要になったらFinderのチェックを外すか、`-`ボタンでエントリーを消してしまえば元に戻ります。

## 3. Automatorで暗号化サービスを作成する

LaunchpadからAutomatorを起動します。
<img width="124" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116534/7bf99474-11a3-a87a-0090-cefb020d91c7.png">
こんなアイコンです。

起動したら`クイックアクション`を選択して`選択`ボタンを押します。
<img width="520" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116534/6f88bde6-0cea-9856-a154-936a6823f4d8.png">

次に実行時のオプションは以下のようにします。
<img width="817" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116534/727f149d-4f6b-f996-fcf1-cd07082163e5.png">
`イメージ`や`カラー`は好きにいじってください。（どこに反映されるのかよくわかってませんが問題ないです。）

その後、以下の図の`名前`という検索窓があるのでそこにカーソルを合わせ、
<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116534/1130b535-6bfe-5624-26f8-aa9c6f400f1c.png">

「シェルスクリプト」と打つと`シェルスクリプトを実行`というアクションが出てきます。これを右側の開いた箇所にドラッグすると
<img width="417" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116534/f3c01f71-0158-c359-b123-62adb52f201e.png">

以下のようになりますので`入力の引き渡し方法`を`引数として`を選択しておきます。
<img width="817" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116534/ef127735-e91b-988e-c90a-ed423e8a6b7a.png">


エディタ部分に以下のソースをコピペしてください。

```
password=$(osascript -e ' text returned of (display dialog "Enter password:" with title "AES256 ZIP" default answer "" buttons {"OK"} default button 1) ')
if [ "$password" != "" ];then
  password="-p"${password}
fi

/usr/local/bin/7z a -ssw -mem=AES256 -tzip ${password} -scsWIN -xr\!.DS_Store "$1".zip "$@"
```

最終的に以下のようになっていればOK。
<img width="811" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116534/94296c5b-2fe8-8283-b181-654eca5f5034.png">

あとは適当な名前で保存（`command + s`）したら完成です。
ちなみに、この際の名前が後でサービスメニューに表示されるので、わかりやすい名前にしておくと良いと思います。私はAES256ZIP4WINというものにしました。

#使い方
##フォルダごと圧縮する場合
Finderから圧縮したいフォルダ選択し、`歯車マーク`もしくは`副ボタンのクリック`（私の場合は指二本クリック）すると、最下部にサービスというのが見えるので今回作成したサービス`AES256ZIP4WIN`をクリックします。
<img width="623" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116534/edd05667-bf76-9e07-976a-127c74bc75d2.png">

するとパスワード入力ダイアログが表示されますので、パスワードを設定する場合は入力してください。設定しない場合は空欄でOKしてください。
<img width="422" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116534/33afbb59-99d6-862e-da82-de55217f0d52.png">

すると、選択したフォルダと同じ場所に`フォルダ名.zip`というファイルが作成されます。
<img width="505" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116534/dbc00356-88ca-b133-a425-9a49dfa4d6b3.png">

##1つまたは複数のファイルを圧縮する場合
基本的には同じで、Finderから圧縮したいファイルを選択し、`歯車マーク`もしくは`副ボタンのクリック`すると、今度は直接先ほどのサービスが選択できます。あとは同じです。
<img width="443" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116534/b3af0b96-987b-24bb-067c-8cec0c5a1f4e.png">


#以上
これでお手軽にパスワード付き暗号化Zipが作成できるようになりました。👏
これまでわざわざWindowsのVM立ち上げて7Zipでやっていたのがだいぶ楽になりました。🙌

皆様のお役に立てれば幸いです。


##appendix: ソース解説

### パスワードの入力
```
password=$(osascript -e ' text returned of (display dialog "Enter password:" with title "AES256 ZIP" default answer "" buttons {"OK"} default button 1) ')
```
パスワードのハードコードとかさすがに出来ませんので、Applescriptのダイアログを使って結果を変数に代入しています。


### パスワードに-pをつけてオプションとして動くようにする
```
if [ "$password" != "" ];then
  password="-p"${password}
fi
```

入力されたパスワードがある場合（空白じゃない場合）に、頭に`-p`を付与することで7zで有効なオプションにしています。

### 7zコマンド
```
/usr/local/bin/7z a -ssw -mem=AES256 -tzip ${password} -scsWIN -xr\!.DS_Store "$1".zip "$@"
```

- 7zの後の`a`は圧縮（add）の意味。
- `-ssw`で、他のアプリケーションが対象ファイルを開いてても圧縮する。
- `-mem=AES256`は圧縮メソッドの暗号強度指定。
- `-tzip`はZIP形式の指定。AES256の指定はZIP用のオプションらしい。（というか7z形式だとそもそもそも基本がAES256とのこと）
- `${password}`は、ダイアログでのパスワードがある場合（例えばhogehoge）は`-phogehoge`となる。
- `-scsWIN`で、ファイル名をWIN形式(SJIS）にする。（らしい）
- `-xr\!.DS_Store`で、Macによくある隠しファイル`.DS_Store`を除外する。
- 圧縮ファイル名は最初のファイルもしくはフォルダ名に.zipを付与したものとしている。（ここはもっとこだわれる箇所でもあるけれど、手で直しても良いレベルなので今はそうしてます）