zip圧縮の利点はサイズが小さくなるだけじゃないって知っていた？

#はじめに

ファイルの圧縮で一番有名なのはzip圧縮でしょう。
他にも有名な圧縮方式として、`.rar`や、`.7z`、`.gzip`などがあります（個人的意見）
__圧縮する__と表現するのですから、圧縮する理由は__ファイルサイズを小さくする__だけだと思ったら__大間違い__です。

圧縮のほかの利点は、

1. パスワードをかけることができる
1. シーケンシャルなファイルになる
1. サイズの大きいファイルを小分けにできる

があります
この記事では、これらについて紹介しようと思います。

なお、今回は7zipというソフトを使用して圧縮していくことにします。

https://sevenzip.osdn.jp/

#利点1　パスワードをかけることができる

ファイルを圧縮する利点に、パスワードをかけることができるというものがあります。



![Inked68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3939333330332f64373662306633352d303734662d383936302d663238332d6465386333633361363333332e706e67_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/993303/84a4776b-342c-0f9f-074b-9c8a163efa12.jpeg)




このように、展開する際にパスワードを入力しなければいけなくなり、万が一外部にファイルが流出してもある程度安全にすることができます。

7zipで行う際は、暗号化の部分でできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/993303/9ba0387d-c4b0-c00b-5653-71a1817222fb.png)


しかし、zip圧縮に関しては、2つ__落とし穴が__あります。




##落とし穴1　使用するパスワード

いくらパスワードをかけても、パスワードによっては安全ではなくなります。
2021年で一番使われた危険なパスワード一覧は以下です。
「password」や「123456」などのパスワードは推測されやすく、1sでパスワード特定できるようです。

https://internet.watch.impress.co.jp/docs/column/dlis/1376907.html

https://nordpass.com/most-common-passwords-list/?utm_source=twitter&utm_medium=social&utm_campaign=top200passords2021





##落とし穴2　暗号化方式

圧縮時にパスワードをかけるとは、中身を暗号化するということです。
その暗号化の方式には複数あり、特にzip圧縮では__デフォルトで安全性が低い__という大きな落とし穴があります。

暗号化方式で有名なのは、zip圧縮でデフォルトの「ZipCrypto」と、現在最強方式の「AES256」があります。

結論から書くと、7zipなどのソフトを使ってAES256を使いましょう。

###ZipCrypto
前者のZipCryptoについては、

>ZipCryptoには様々な問題点があるが、鍵長については96ビットしかない欠点を有する。
どんなに長いパスワードを設定したところで実質的な強度は96ビット以下であり、長いパスワードを設定しても、それより短い他のパスワードで復号できてしまう可能性がある。

https://www.wdic.org/w/WDIC/ZipCrypto


という安全性が低いという問題があります。
なので、ZipCryptoでパスワードをかけてzip圧縮したファイルをメールで送ってそのあとパスワードを後から別のメールで送るというPPAPをとっても、zipファイルを総当たり攻撃で解凍することができるという問題があります。
（そもそもzipファイルを送った方法と同じ方法でパスワードを送ることがなぜ安全なのか理解できませんし、zip圧縮することでウイルスソフトをすり抜けてしまうという問題もあるみたいなので根本的な問題はあるみたいですが。）



https://anton0825.hatenablog.com/entry/2017/02/20/000000


###AES256

ではzip圧縮時にAES256で暗号化するとどうでしょうか。
7zipなどのソフトを使用すればzipファイルにAES256の暗号化をすることができます。

しかし、Unixのunzipコマンドが対応していなく、windowsの標準の展開も対応していません。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/993303/fb435342-0bb9-57fe-0d5d-aa868d3e4181.png)


そのため、7zipなどのソフトを使用しなければいけないという問題があります。





https://hep.eiz.jp/zip-password/


https://win10labo.info/win10-zip-password/


















#利点2　シーケンシャルになる

圧縮の利点として、複数ファイルをまとめて1つのファイルにするため、シーケンシャルにファイルをリード・ライトすることができて転送速度が速くなるというメリットがあります。


###ファイルの読み書きの仕組み

少し間違いがあるかもしれませんが、説明します。
パソコンではファイルはHDDかSSDに保存されます。
保存の際、ファイルが物理的に01のデータとして書き込まれている場所__A__と、その場所を記したファイル__B__の2つがあります。

データを読み込んだり書き込む際には、まず__B__にアクセスして保存場所を知り、その後__A__の場所で物理的にデータを読み書きします。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/993303/1470cd81-045d-d904-356e-5d321252e74e.png)


BUFFALOより引用

https://www.buffalo.jp/topics/trouble/detail/recovery_0039.html


###アクセス方法


大きなファイルを読み書きする際は、物理的に連続した場所でデータを読み書き書き込みます。これを__シーケンシャルアクセス__といいます。

対して複数ファイルを読み書きする際は、ばらばらの場所にあるファイルを読み書きします。これを__ランダムアクセス__といいます。

画像を見てもわかるように、シーケンシャルアクセスでは一回場所を知れば連続して読み書きできるので速度が速いです。
対してランダムアクセスでは、ファイルごとに場所を探し、ファイルを読み書きし、またファイルを探して…としなければいけないため、速度が遅いです。

![id8150_Random_vs_sequential_access.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/993303/52a6c3be-8786-af48-3249-be120984665c.png)

sandiskより引用

https://kb-jp.sandisk.com/app/answers/detail/a_id/8980/~/%E3%82%B7%E3%83%BC%E3%82%B1%E3%83%B3%E3%82%B7%E3%83%A3%E3%83%AB%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%81%A8%E3%83%A9%E3%83%B3%E3%83%80%E3%83%A0%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%81%AE%E6%93%8D%E4%BD%9C%E3%81%AE%E9%81%95%E3%81%84



###HDD、SSDの速度

SSD、HDDはシーケンシャルアクセスとランダムアクセスで速度の差が大きく、特にHDDで顕著です。

下の画像はHDD、SataSSD、NVMeSSDの順で表示しています。
見方は、画像内の上1行がシーケンシャル、下3行がランダムアクセスで下に行くほどファイルサイズが小さくランダムアクセス性能が試されます。そして左の列がリード、右の列がウライトに対応しています。
HDDではシーケンシャルアクセスはランダムアクセスの170~340倍速いことが分かります。
比較的早いSSDでも10倍以上速いです。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/993303/d7ff3c1a-88f6-14a6-b1d4-ba6d013abea4.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/993303/84717e54-3bd8-3e00-6e33-d6b4691b7301.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/993303/a834ff03-90b1-c179-e902-1cd91ca155da.png)


詳しくはこちらの記事をご覧ください。


https://qiita.com/yuki_2020/items/c233d903fe41d98bfff3#ssdhdd


###まとめ

よって、ファイルのバックアップなどで大量のファイルを転送する際は、7zipなどの圧縮ソフトを使用し、元のHDDのファイルをまとめて__無圧縮__で圧縮し、転送先のHDDに__直接保存__することで高速にファイルを転送できます。
（もっとも、保存先で中身を見る際には解凍に時間がかかりますが。）











#利点3　サイズの大きいファイルを小分けにできる

メールで大きなファイルを送るときなどに、1回に遅れる容量制限に引っかかってしまうことがありますよね。
そんな時に、zip圧縮で分割圧縮することでファイルサイズが小さい複数ファイルに分割することができます。

分割された一つ一つのzipファイルだけでは一部しか展開できませんが、全部集めて展開することで元のファイルに戻すことが可能です。

容量が限られているDVDやBDなどに記録する際にも有効です。

7zipでは分割ボリュームサイズを指定することで分割圧縮することができます。



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/993303/83b3b25e-46c0-0be7-7c8c-847674bd52d8.png)





https://sevenzip.osdn.jp/howto/split-compress.html



#注意　圧縮してもファイルサイズが変わらないことある

zip圧縮してもほとんどファイルサイズが変わらないことがあります。
その原因は圧縮するファイルが既に圧縮されているからです。

###非可逆圧縮

画像だったら`jpg`、動画だったら`mp4`、音楽なら`mp3`などのファイルは、すでに元のファイルを非可逆圧縮したものなので、zip圧縮しても小さくなりません。


https://airscarlet.com/pc-jpeg_zip_compression/

http://tennensui.sakura.ne.jp/pcrikai/category2/entry17.html

https://jp.quora.com/%E7%94%BB%E5%83%8F%E3%82%84%E5%8B%95%E7%94%BB%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E5%9C%A7%E7%B8%AE%E3%81%97%E3%81%A6%E3%82%82%E3%81%82%E3%81%BE%E3%82%8A%E5%B0%8F%E3%81%95%E3%81%8F%E3%81%AA%E3%82%89

###可逆圧縮

@ayatty さんの指摘がありましたが、
可逆圧縮したファイル、例えば画像では`png`、音楽なら`flac`などのファイルも、圧縮済みなのでzip圧縮をしてもほとんどサイズは変わりません。

https://www.webtech.co.jp/blog/optpix_labs/format/6657/

https://www-creators.com/archives/1031

###非圧縮

逆に非圧縮の`bmp`や`avi`、`wav`、テキストファイルの`txt`、`exe`ファイル、などはzip圧縮することでファイルサイズを半分以下にすることが可能です。

https://aviutl.info/kagyaku-hikagyaku-assyuku/

@ayatty さんの指摘がありましたが、
`.avi`ファイルは未圧縮のものと、コーデックによって可逆圧縮、非可逆圧縮したものがあります。
もちろん、未圧縮のものに関してはzip圧縮でファイルが小さくなると考えられます。
しかし、私の環境で可逆圧縮コーデックの一つである`Ut Video Codec`で保存された`avi`ファイルをzip圧縮したところ、約半分のサイズになりました。
これはおそらく、`Ut Video Codec`での圧縮時に`圧縮率優先(Predict median)`と`デコード速度優先(Predict left)`の設定があるため、後者の設定のファイルだったと考えられます。
未圧縮、可逆圧縮、非可逆圧縮の`avi`ファイルのどれかなのかはわからないため、とりあえず`avi`フィルはzip圧縮をしてみることをおすすめします。

https://aviutl.info/murekka/

https://www.gigafree.net/media/codec/utvideocodecsuite.html

https://aviutl.info/ut-video-codec/


###office

@ayatty さんの指摘で気が付きましたが、
officeのファイルに関しては、古い`doc`、`xls`、`ppt`に関しては非圧縮ファイルなのでzip圧縮することでファイルサイズを小さくすることができます。

しかし、比較的新しく、現行の`docs`、`xlsx`、`pptx`に関しては、すでに内部ではzip圧縮をしたファイルなので、新たにzip圧縮してもファイルサイズはほとんど変わりません。

https://study-z.net/100184224/2#h212

https://oshiete.goo.ne.jp/qa/8184832.html

https://e-words.jp/w/PPTX%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB.html#:~:text=PPTX%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%A8%E3%81%AF%E3%80%81%E7%B1%B3,%E3%81%9F%E3%82%81%E3%81%93%E3%81%AE%E3%82%88%E3%81%86%E3%81%AB%E5%91%BC%E3%81%B0%E3%82%8C%E3%82%8B%E3%80%82

#圧縮方法の種類

今までzipファイルについて主に説明してきました。
しかし圧縮方法は他にも山ほどあり、選ぶ際には__圧縮率__と__普及率__の2つが重要になってきます。

個人的には`zip`以外には`.rar`、`7z`、`gzip`をよく見かけるかなと思います。

`.zip`は普及しているのでどこでも展開圧縮できるけれど、圧縮率が低く、4GB以上のファイルは圧縮できず、安全性に難ありというイメージ。

`.rar`はよく配布されていて、圧縮率が高いですが、圧縮には有料ソフトWinRAR（実質無料）が必要という問題があります。（展開は7zipなどほかの無料ソフトで可能）

`.7z`は圧縮率が高く、圧縮展開は無料ソフト（7zip）でできて、個人的によく使っています。

`.gzip`はlinuxで標準の圧縮方式で、圧縮率等はzipとあまり変わらないそうです。

他にも`.lzh`や`.cab`など様々な圧縮方法がありますが、詳しくはこちらの記事をご覧ください。


https://qiita.com/shotets/items/b210e19b0b05513513da



#まとめ

圧縮に関する意外なメリットや種類について紹介してきました。
個人的にまとめると、

* 安全性は低くていいから、簡単に展開してほしいなら`.zip`
* それ以外ならとりあえず`.7z`
* 圧縮ソフトは7zip

という感じです。