0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

USBメモリの空き領域を埋めるPythonプログラム

Last updated at Posted at 2022-12-25

USBメモリで持ち運ぶときの危険さで思うこと

 USBメモリの紛失は、ニュースになることもあります。しかし、USBメモリは便利であるためデータファイルの持ち運びに使うことが多いでしょう。
 また、USBメモリ上のファイルは、Windows等で削除をしてもファイル復活ツールを使用すれば復活できる場合が多いことを見かけますので、削除の際にはマカフィー付属等の抹消ツールを利用する場合もあるでしょう。しかしファイルシステム的に捨てられた部分も消されるかは不明です。
 USBメモリ上にファイルを置くときには、既知平文攻撃の心配がないようにZIP(ZIPcrypto)ではなく、AESで暗号化をしていれば、それも長めのパスワードを設定すれば安心とは思えますが、それでも平文をUSBメモリ上に解凍してしまうことはあり得ます。
 つまり万全を期したつもりでも、一抹の不安は残ります。

考えたこと

 そこで安心度を高めるために、USBの空き領域をファイルで埋めてしまおう、というPythonプログラムを作ってみました。
 発想としては、それなりのファイルのコピーを繰り返しおこなって空き領域を埋めれば、削除痕跡をも上書きされ、削除されたファイルの復活ができなくなるのではないかという単純なものです。USBメモリにはフラッシュメモリ素子が使われているので、ファイルで一度埋めるだけで大丈夫という期待でもあります。
 埋めることに使うファイルは、あらかじめ複数サイズ(約1Gバイト、約100Mバイト、約1kバイト等)を作っておき、大きいファイルから順に使うようにしました。

プログラム

 プログラムは、Windows 11、Python 3.11.0環境で作り、以下のものです。ファイル名は「pass_umeru.py」としました。
 埋めることに使うファイルは、Pythonプログラムと同じフォルダにあるとし、書き込み先のUSBドライブ・フォルダはコード内で指定しています。書き込む際のファイル名は処理順とエポック秒で作り、上書きを避けました。

import shutil
import time

#変数メモ
usb = 'd://'	#USBメモリドライブ【環境により変更】
fol = 'd:/space/'	#書き込み先フォルダ【環境により変更】
tmp = 0		#リストの長さ用
i = 0			#forループ用
j = 0			#forループ用
fillName = time.time()	#エポック秒でファイル名を作る
c = 0			#ファイル名付加文字用
repeat = 0		#書き込み繰り返し数用
fillFiles=[1000**3,     'sp1G.txt', #およそのファイルサイズとファイル名のリスト
          (1000**2)*100,'sp100M.txt',
          (1000**2)*10, 'sp10M.txt',
          1000**2,      'sp1M.txt',
          1000*100,     'sp100k.txt',
          1000*10,      'sp10k.txt',
          1000,         'sp1k.txt']

#ファイルのコピー
tmp = len(fillFiles)                         #リストの長さ
for i in range(0,tmp,2):
  total, used, free = shutil.disk_usage(usb) #残容量
  print(f'\n{free}バイト空き')               #残容量表示
  print(f'{fillFiles[i]}(処理サイズ)')     #ファイルサイズ表示
  repeat = int(free/fillFiles[i])            #残容量と、ファイルサイズからコピー回数を割り出す
  files = fillFiles[i+1]                     #ファイル名を取り出す
  print(f'{repeat}回{files}を書き込みます')
  for j in range(repeat):                    #書き込みループ
    c = c + 1                                #ファイル名に付加する番号を調整
    outfile = fol + str(c) + '_' + str(fillName)    #ファイル名を作る
    try:                                     #念のため例外処理をしておく
      print(outfile)
      shutil.copyfile(files, outfile)        #ファイルを書き込む
    except Exception as e:
      print(e)
      print('↑ディスクサイズとファイルサイズの関係なら問題なしと思う')

total, used, free = shutil.disk_usage(usb)#結果を表示
print(f'終了 {free}バイト空き')

です。
 結果は

C:\****\pass_umeru.py

2392489984バイト空き
1000000000(処理サイズ)
2回sp1G.txtを書き込みます
d:/space/1_1671935699.1754322
d:/space/2_1671935699.1754322

237142016バイト空き
100000000(処理サイズ)
2回sp100M.txtを書き込みます
d:/space/3_1671935699.1754322
d:/space/4_1671935699.1754322

21594112バイト空き
10000000(処理サイズ)
2回sp10M.txtを書き込みます
d:/space/5_1671935699.1754322
d:/space/6_1671935699.1754322

32768バイト空き
1000000(処理サイズ)
0回sp1M.txtを書き込みます

32768バイト空き
100000(処理サイズ)
0回sp100k.txtを書き込みます

32768バイト空き
10000(処理サイズ)
3回sp10k.txtを書き込みます
d:/space/7_1671935699.1754322
d:/space/8_1671935699.1754322
d:/space/9_1671935699.1754322
[Errno 28] No space left on device
↑ディスクサイズとファイルサイズの関係なら問題なしと思う

0バイト空き
1000(処理サイズ)
0回sp1k.txtを書き込みます
終了 0バイト空き

です。

SDカード

 USBメモリだけではなく、SDカード等にも使えるはずです。PC内蔵のハードディスクやSSDへの使用は、OSが管理作成するファイルもあるので、使用はあきらめでしょう。そもそもハードディスクの場合は廃棄時の抹消規格があるくらいなので、このプログラムでの解決は、あまり期待できないのではないかと思います。

この考えで大丈夫なのか

 実はしばらくのあいだこのようなツールをネットで探していたのですが見当たりませんでした。そのため無意味であることが分かりきっている考えであるという不安は残ります。本当のところこれでよいのかについては専門家の意見が欲しいところですが、アップしてみました。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?