現行のmacOSで使えるデータの圧縮・暗号

# 圧縮と暗号は大事

匿名化に加えてこれら3つは3大PCリテラシーだと思います




## パスワード付きPDF

ちょっとした書類ならコレで良いと思う

+ プレビューで何らかをpdfを保存するときに
+ 「アクセス権」→「書類を開くときにパスワードを要求」にチェック
+ 専用パスワードを確実に打ちこむ
+ 「アクセス権」の設定でさらに改竄防止を見込める
  + 例外的な許可を出さずにパスワード設定すればおk

PDFの仕様なんてそうそう変わらんし，深くは追求しません，汎用性も低いでしょうし…




## パスワード付きで圧縮・暗号

ちょっとしたデータならコレで良いと思う<br>
基本的にFInderからGUI経由で行うことが無理な（オプションが呼び出せない）上に，macOSにデフォルトで入ってるアプリやコマンドは更新性や追従性に乏しく，これはhomebrew経由で外部のツールを導入した方が良いと思う



### 準備
とりあえずは基本の`zip`・`rar`・`tar`を抑えておきたい

[https://formulae.brew.sh/formula/zip:embed:cite]

[https://formulae.brew.sh/formula/unzip:embed:cite]

[https://formulae.brew.sh/cask/rar:embed:cite]

えっ`unrar`ってつい最近ライセンス問題で公式から消えたらしいですよ

[https://qiita.com/shimizumasaru/items/7e57bb5c506c0ae4eb80:embed:cite]

[https://formulae.brew.sh/formula/gnu-tar:embed:cite]
※`untar` は存在しない，動作は全部コマンドで決め打ちしているらしい

+ 通常の`brew`環境が構築されてるintel macが前提
  + apple siliconでのhomebrewは色々とパスが違ってくるらしいけど知らん
    + とりあえずRosetta2でやればいいんじゃないのか？
+ コマンド設定
  + 以下の順番を守って取得
    1. `brew install zip`
    1. `brew install unzip`
    1. `brew install rar`
    1. `brew install carlocab/personal/unrar`
    1. `brew install gnu-tar`
+ パスを設定
  + `rar`・`unrar`はデフォルトで`/usr/local/bin`にエイリアスが発生する
  + `tar`は`gtar`として`/usr/local/bin`にエイリアスがある
  + `zip`・`unzip`はmacデフォルトと衝突すると厄介なことになるらしくエイリアスが生成されていない
    + `gzip`は`gzip`として別にあるせいで名前が被ってるせいかもしれんね
  + なので`/usr/local/opt/bin`を作ってパスに通した上で`/usr/local/opt/[cask name]/bin/[cask command]`のシンボリックリンクを置く
    + ついでに同じように`tar`も置いとこう
    1. `mkdir /usr/local/opt/bin`
    1. `ln -s /usr/local/opt/zip/bin/zip /usr/local/opt/bin/zip`
    1. `ln -s /usr/local/opt/unzip/bin/unzip /usr/local/opt/bin/unzip`
    1. `ln -s /usr/local/opt/gnu-tar/bin/gtar /usr/local/opt/bin/tar`
    1.  `echo export PATH='/usr/local/opt/bin:$PATH' >> ~/.bashrc`
  + 私は`PATH = [application path]/usr/local/bin:/usr/local/opt/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin`みたいにしてる
  + 各自のシェルの設定ファイルに合わせること，`zsh`なら`~/zprofile`と`~/.zshrc`になる
    + `bash`と`zsh`の間なら複製して名前を変えるだけでも割と行けるっぽい…？



### 実行


#### `zip`の場合

+ 暗号
  + `zip -A -o -r -n .zip:.bz2:.7z:.rar:.gz:.tgz -X -y -8 -e [zipped file path] [source file path]`
    + 例：`zip -A -o -r -n .zip:.bz2:.7z:.rar:.gz:.tgz -X -y -8 -e ~/Documents/Private/data.zip ~/Download/list`
  + パスワード設定はダブルチェックされる
  + オプションはそれぞれ，
    + `-A`でWindows用の自己解凍`.exe`ファイルが生成
      + つまりmacOSには関係ねぇ
    + `-o`で出てくる`.zip`の日付がディレクトリ内の日付の最新版に
    + `-r`で再帰処理にしてディレクトリに対応
    + `-n [.extension 1]:[.extension num]`で2重圧縮を回避
    + `-X`でファイルシステムの余計な情報を削除
    + `-y`で参照先の外部ファイルの混入を阻止
    + `-8`で圧縮強度を最大化
    + `-e`で本体を暗号化
  + `[zipped file path]`のファイル名はそのまま出てくるので末尾に`.zip`を忘れないように
+ 分割
  + `zip -s [num][kmgt] [source file path] -O [zipped file path]`
    + 例：`zip -s 64k ~/Documents/Private/data.zip -O ~/Documents/Private/spirit.zip`
  + 1発目の`.zip`生成の段階で分割しようとするとエラーを吐くのでNG
  + `[source file path]`ファイル名は`.zip`じゃないと認識してくれないので注意
  + パスワードチェックなし
  + オプションはそれぞれ，
    + `-s [num][k,m,g,t]`で分割サイズを指定，最低でも`64kbyte`以上
+ 結合
  + `zip -s 0 [source file path] -O [zipped file path]`
    + 例：`zip -s 0 ~/Documents/Private/spirit.zip -O ~/Documents/Private/data2.zip`
  + `-s 0`で1つの`.zip`に還元される
    + 分割と結合を繰り返すとデータがバグるかもしれん
  + パスワードチェックなし
  + `[source file path]`には分割時の代表ファイル（`.z[num]`じゃないもの）を指定する
    + もちろん例に漏れず`.zip`じゃないと認識してくれない
+ 復号
  + `unzip [source file path]`
    + 例：`unzip ~/Documents/Private/data2.zip`
    + 特定のファイル1つを解凍する場合は`unzip -p [source file path] > [unzipped file path]`で名前指定も可能
      + `-p`で出力を`stdout`に指定してパイプ化しただけ
    + 別のディレクトリに入れる場合は`unzip [source file path] -d [any directory path]`で押し込める
      + `-d`とその引数は必ず最後に置くこと
  + パスワードチェック必須
  + `.zip`じゃなくても読み込んでくれる（中身がダメならダメと言ってくれる）
  + 名前がダブったファイルの強制上書き許可は`-o`・強制上書き禁止は`-n`
    + `unzip -B [source file path]`すると上書きはせずにバージョン別（拡張子を含むファイル名の末尾に`~[num]`）のバックアップが追加される
      + 解凍ファイルの内部の処理ではなく，解凍された中身が生成される該当のディレクトリに
    + これ自体にバージョン管理機能はなく，やりたいなら番号をワイルドカードで全検索して抽出しろって感じか？
    + `-o`するとそのバックアップすらも上書きできるので注意
  + 先の通りmacOSでは自己解凍はできない
    + アーカイブユーティリティがあるので心配ない

ここでは単純に圧縮と展開のやり方を示したが，本来はアーカイブ更新機能の側面が強く，元ディレクトリとのファイルの差分をとって更新して保存するやり方が一般的かもしれない．基本的に`.zip`にはロックをかけずアップデートをかけ続ける，それを自動化して低リソースな環境で実行する…みたいな雰囲気を感じる．<br>
そこらが関係するのか軽い気持ちで調べてたら想像以上に複雑だったし，私が望む「使える・壊れない・明かされない」という観点でも`zip`より`rar`の方が良かったりする，そのためアーカイブ更新機能として使いこなすのはまた別の機会にしたい．


#### `rar`の場合

+ 暗号
  + `rar a -k -r -ts- -s -ds -sfx -ma5 -m5 -hp [rarred file path] [source file path]`
  + 例`rar a -k -r -ts- -s -ds -sfx -ma5 -m5 -hp ~/Documents/Private/data.sfx ~/Download/list`
  + パスワード設定はダブルチェックされる
  + オプションはそれぞれ，
    + `a`でアーカイブ生成モードを指定
    + `-k`でロックして再編集を不可能に
    + `-r`で再起処理にしてディレクトリに対応
    + `-ts-`で時間系の情報を削除
    + `-s`でソリッド圧縮を指定
    + `-ds`で内部の名前順ソートを無効化
    + `-sfx`で自己解凍実行ファイルを添付
    + `-ma5`で新しい`.rar`規格を使用
    + `-m5`で圧縮強度を最大化
    + `-hp`でヘッダごと本体を暗号化
  + `-sfx`の場合は拡張子`.sfx`が必ずつくが，ない場合は`[rarred file path]`がそのまま出てくる
+ 復号
  + `unrar x [source file path]`
    + 自己解凍させたい場合は`./[source file path]`すると起動する，手順は変わらない
    + 特定のファイル1つを解凍する場合は`unrar p -iunl [source file path] > [unrarred file path]`で名前指定も可能
      + `-p`で出力を`stdout`に指定した上で`-inul`でデフォの出力を消さないとダメ
    + 別のディレクトリに入れる場合は`unrar x [source file path] [any directory path+/]`で押し込める
      + パスの最後に`/`が入ってない場合は`[source file path]`と見なされて処理されないので注意
  + パスワードチェック必須
  + `.rar`じゃなくても読み込んでくれる（中身がダメならダメと言ってくれる）
  + 名前がダブったファイルの強制上書き許可は`-o+`・強制上書き禁止は`-o-`

ロックと暗号化が行えるのが強みで，圧縮性・耐破性・暗号性も`zip`より上，導入も楽で自爆解凍もできる，しかも文法が簡単で覚えやすい．現実では特に欧州で流行ってるらしく，実際に使っている人間は自分の周りでこそほぼ見たことがないものの，割と積極的に使いたい印象を受けた．もうこれだけでよくね？と言える程度には簡潔に完結していると思う．


#### zipに関する補記

`homebrew`で入ってくる`zip`は「16 June 2008 (v3.0)」かつ`unzip`は「unzip20 April 2009 (v6.0)」が最新版となっている．macOSにデフォルトで入っている`zip`・`unzip`も全く同じであり，要するにわざわざディレクトリを分けて管理しようとしたのは徒労であったということになる．さらに`-Zb`は`zip`できるが`unzip`できない（以下の通りなら`.zip`規格の対応が0.1だけ`unzip`の方が遅れているせいだと思われる）などのドボン選択肢もある．

```
% zip -rZb arc.zip test
% unzip arc.zip
... need PK compat. v4.6 (can do v4.5)

```

また`zip`における「エントリ」とは「`.zip`内にあるファイルもしくはディレクトリ」を指す．「エントリには65535個の制限があるほか，アーカイブのサイズにも4GBの制限がある」なる昔話があったらしいが．これはかつての`zip`が32bit動作をしているからであり，それを改善したzip64はその制限を超えられるようになった．<br>
自分の`zip`・`unzip`がそれに対応しているかどうかについて，以下のように表示されれば対応の確認が取れる．

```
% zip -v | grep 64
... ZIP64_SUPPORT
% zip -v | grep 64
... ZIP64_SUPPORT
```

現在は`/usr/bin/unzip`もzip64に対応しているようだが，アーカイブユーティリティ.appについてはmacOS Catalinaになるまで実装されなかったという目撃情報がある．

[https://taiyakon.com/2021/01/macos-version-zip64.html:embed:cite]

そもそも`zip`・`unzip`の公式サイトを見ても最新版が`homebrew`上の最新版やmacOSのデフォルト版と一致しており，

[http://infozip.sourceforge.net/:embed:cite]

これらは`Info-zip`という形で2009年までOSSで開発されていた，今後ここから新しくなることはないと考えて良さそう．<br>
後継としては`zlib`と`gzip`か，前者は`zip`で培われた圧縮技術を各言語・各OSで利用可能にするライブラリで，後者はGNUの開発元でGPLライセンスで提供されるファイル圧縮用のツール，という認識で合っているのだろうか？



### 準備
`rar`・`zip`の代わりに`bzip2`・`gzip`・`7zip`・`lrzip`（・`rzip`）を利用していく

[https://formulae.brew.sh/formula/gzip#default:embed:cite]

[https://formulae.brew.sh/formula/p7zip#default:embed:cite]

[https://formulae.brew.sh/formula/bzip2:embed:cite]

[https://formulae.brew.sh/formula/lrzip:embed:cite]

[https://formulae.brew.sh/formula/rzip:embed:cite]

+ コマンド設定
  + 以下を取得
    1. `brew install gzip`
    1. `brew install p7zip`
    1. `brew install bzip2`
    1. `brew install lrzip`
    1. `brew install rzip`
+ パスを設定
  + `bzip2`はmacデフォルトと衝突すると厄介なことになるらしくエイリアスが生成されていない
    + `ln -s /usr/local/opt/bzip2/bin/bzip2 /usr/local/opt/bin/bzip2`しましょうね
  + コレ以外は普通に`/usr/local/bin`に入ってくれる
  + `rzip`は使わないが，[archlinux wik](https://wiki.archlinux.org/title/lrzip)iにも載ってたので敬意を表して数字に貢献した
    + `lrzip`は`rzip`の機能を利用した上でさらに色々と工夫したらしいな？



### 実行
以下は順に追記していきます


#### `gzip`の場合

+ 圧縮
  + `gzip -k -9 -c [source file path] > [zipped file path]`
  + `[zipped file path]`のファイル名はそのまま出てくるので末尾に`.gz`を忘れないように
    + `-c`と`> [zipped file path]`がないと`[source file path]`のファイル名に勝手に`.gz`がつくけど
  + オプションはそれぞれ，
    + `-k`で元ファイルを削除しない
    + `-9`で圧縮強度を最大化
    + `-c`で`stdout`に指定
  + ディレクトリを再帰的に辿る実装はなく，`tar`（後述）でまとめてから`gzip`するのが正攻法
    + 引数に複数のファイルを並べると全て個別に`.gz`化されるのが特徴
    + `gzip -k -9 -c [source file path1] > [zipped file path1] [source file path num] > [zipped file path num]`すれば良い
      + `[source file path1] [source file path num] > [zipped file path]`すると，`.tar`同士だけなら最後に展開すればなんとかなるが，`.tar`以外のファイルが混ざってると詰む
      + `man`のADVANCED USAGEは嘘こそ言ってないが，例えば画像ファイルの2つを`gzip`して`gunzip`すると元に戻らない，フォルダ構造を失った挙句それをrescueする方法がないから当然とも言えるが
  + 名前がダブったファイルの強制上書き許可は`-f`，なければ聞かれるまでもなく上書きされない
+ 解凍
  + `gzip2 -k -c  [source file path] > [unzipped file path] `
  + オプションはそれぞれ，
    + `-k`で元ファイルを削除しない
    + `-c`で`stdout`に指定
  + どうせファイルしか出てこないのでこれで覚えた方が良い
  + 名前がダブったファイルの強制上書き許可は`-f`，なければ聞かれるまでもなく上書きされない
  + `gzip`を入れると勝手に`gunzip`もついてくる
    + というより`gzip`を使う上で`-z`で圧縮するか`-d`で解凍するかの違いしかない

調べた限りではディレクトリ統合機能もパスワード暗号化機能もなさそう，やはり別ライブラリ（後述）を使うべきだろう．

##### `--rsyncable`とは？

`tar`+`gzip`で保管されるファイルに対して，生成する際に`--rsyncable`を用いて`gzip`しておくことで，そのサーバに対して`rsync`した際に得られるデータの差分の量そのものがカットできる（2016年のv1.7で実装されたらしい）

[https://superuser.com/questions/482758/rsync-friendly-gzip:embed:cite]


[https://translate.google.com/translate?hl=ja&sl=en&u=https://superuser.com/questions/482758/rsync-friendly-gzip&prev=search&pto=aue:embed:cite]

[https://beeznest.wordpress.com/2005/02/03/rsyncable-gzip/:embed:cite]

[https://beeznest-wordpress-com.translate.goog/2005/02/03/rsyncable-gzip/?_x_tr_sl=auto&_x_tr_tl=ja&_x_tr_hl=ja&_x_tr_pto=nui:embed:cite]

`rsync -z`オプションでも圧縮が可能であるが，こちらは差分を取った後に転送するデータを圧縮するため，要するに2段構えの方が（マシンリソースあるなら）絶対に良いし，`zip`に比べても大きな利点となる

##### `gzip -r`・`gunzip -r`の動作

この`-r`は再帰的という意味を示すが，`zip -r`は渡されたパスが示すディレクトリを基準として配下のディレクトリ・ファイルをまとめて1つの`.zip`にする一方，`gzip -r`では渡されたパスが示すディレクトリもしくはその配下のディレクトリにファイルがあればその場で1つずつ`.gz`にしていく，同様に1つずつ`.gz`から戻していくのが`gunzip -r`である


#### `p7zip`の場合


#### `bzip2`の場合

+ 圧縮
  + `bzip2 -k -9 -c [source file path] > [zipped file path]`
  + `[zipped file path]`のファイル名はそのまま出てくるので末尾に`.bz2`を忘れないように
    + `-c`と`> [zipped file path]`がないと`[source file path]`のファイル名に勝手に`.bz2`がつくけど
  + オプションはそれぞれ，
    + `-k`で元ファイルを削除しない
    + `-9`で圧縮強度を最大化
    + `-c`で`stdout`に指定
  + ディレクトリを再帰的に辿る実装はなく，`tar`（後述）でまとめてから`bzip2`するのが正攻法
    + 引数に複数のファイルを並べると全て個別に`.bz2`化されるのが特徴
      + `bzip2 -k -9 -c [source file path1] > [zipped file path1] [source file path num] > [zipped file path num]`すれば良い
      + `[source file path1] [source file path num] > [zipped file path]`すると，`.tar`同士だけなら最後に展開すればなんとかなるが，`.tar`以外のファイルが混ざってると詰む
      + `gzip`とほぼ同じ理由か
  + 名前がダブったファイルの強制上書き許可は`-f`，なければ聞かれるまでもなく上書きされない
+ 解凍
  + `bunzip2 -k -c  [source file path] > [unzipped file path] `
  + オプションはそれぞれ，
    + `-k`で元ファイルを削除しない
    + `-c`で`stdout`に指定
  + どうせファイルしか出てこないのでこれで覚えた方が良い
  + 名前がダブったファイルの強制上書き許可は`-f`，なければ聞かれるまでもなく上書きされない
  + `bzip2`を入れると勝手に`bunzip2`もついてくる
    + というより`bzip2`を使う上で`-z`で圧縮するか`-d`で解凍するかの違いしかない

調べた限りではディレクトリ統合機能もパスワード暗号化機能もなさそう，やはり別ライブラリ（後述）を使うべきだろう．


#### `lrzip`の場合


### GPG


## FireVault

Mac起動ディスクだけならコレで良いと思う<br>
Windowsのbitlockerよりも優秀だと感じている

設定したら復旧キーを忘れないように必ずメモしておこう，iCloud連携は正直やりたくないなって…




## 外部のボリュームを暗号化

外付けストレージならコレで良いと思う<br>
ディスクユーティリティでexFATフォーマットされたドライブの中にも問答無用で設定できる



## veracrypt

Windows向けという印象があるがmacOSでも普通に使える<br>
OSS開発でありながらも，これを使えば暗号化はかなり万全と考えて良さそうか…？