1つ以上のファイルの全ビット反転
複数のファイルといった、1つ以上のファイルの全ビットを反転させます。
例えば、センシティブな画像や動画をクラウドにアップロードすると、グーグルのクラウドの場合はファイルを削除されたりアカウントを削除されたりするそうです。
パソコンで画像や動画を全ビット反転させてからアンドロイド スマホやタブレットにコピーすれば、画像や動画がアンドロイド システムに勝手にクラウドに保存されるのを予防できます。
ただし、原因は不明ですが動画には全ビット反転すると元に戻してもブラウザがエラーを発生させてしまう物が有りますし、サイズが大き過ぎる動画はブラウザーがメモリー不足エラーを発生させてしまいます。
後は、USBメモリーで保存したい他人に見られたくない小説などのデータをすぐには見られないようにできます。
ただし、全ビット反転は暗号化ではありません。
さらに、AIなどの最近のデータ解析の進歩で全ビット反転はすぐに見破られるかもしれません。
しかし、「『全ビット反転されているファイルである』と知られなければデータを視聴されないのでは」と思いました。
そして、「『全ビット反転しているだけである』と知っていれば、プログラムの知識や技術が有れば、最悪の場合でも、検索して全ビット反転し直すプログラムを自作できる」と考えました。
全ビット反転してもファイルのサイズは変わりません。
全ビット反転を悪用しないでください。
全ビット反転した画像や動画をクラウドにアップロードして、クラウドの運営に全ビット反転を見破られて画像や動画を検閲されてアカウントを削除されても自己責任です。
不具合が有るかもしれないので利用は自己責任でお願いいたします。
コピーする場合は、2文字の全角空白を4文字の半角空白に置換してください。
UTF-8という文字コードで、Pythonの.pyファイルを保存してください。
tkinterはPythonに標準で含まれているはずですが、Linux Mintに無い場合は、ソフトウェアマネージャでPython3-tkをインストールする必要が有ります。
import tkinter
from tkinter import messagebox
from tkinter import filedialog
import os
import re
root = tkinter.Tk()
root.geometry("800x300")
root.title("ビット反転")
in_file_paths = ()
in_file_string_var = tkinter.StringVar()
in_file_string_var.set("")
in_file_label = tkinter.Label(root, textvariable=in_file_string_var)
in_file_label.place(x=10, y=40)
# 入力ファイル選択ボタンが押された時の処理
def select_in_file():
try:
global in_file_paths
in_file_paths = filedialog.askopenfilename(initialdir=os.path.expanduser("~"), multiple=True, filetypes=[("全ての種類のファイル", "*")])
in_file_string_var.set(" ".join(in_file_paths))
except Exception as exception:
messagebox.showerror(exception.__class__.__name__, str(exception))
raise
in_file_select_button = tkinter.Button(root, text="入力ファイル選択", command=select_in_file)
in_file_select_button.place(x=10, y=10)
out_dir_string_var = tkinter.StringVar()
out_dir_string_var.set("")
out_dir_label = tkinter.Label(root, textvariable=out_dir_string_var)
out_dir_label.place(x=10, y=110)
# 出力ディレクトリ選択ボタンが押された時の処理
def select_out_dir():
try:
out_dir_string_var.set(filedialog.askdirectory(initialdir=os.path.expanduser("~")))
except Exception as exception:
messagebox.showerror(exception.__class__.__name__, str(exception))
raise
out_dir_select_button = tkinter.Button(root, text="出力ディレクトリ選択", command=select_out_dir)
out_dir_select_button.place(x=10, y=80)
message_string_var = tkinter.StringVar()
message_string_var.set("")
message_label = tkinter.Label(root, textvariable=message_string_var)
message_label.place(x=10, y=180)
# ビット反転ボタンが押された時の処理
def flip_bit():
try:
out_dir = out_dir_string_var.get()
if len(in_file_paths) == 0:
message_string_var.set("入力ファイルを1つ以上、選択してください。")
return
if out_dir == "":
message_string_var.set("出力ディレクトリを選択してください。")
return
message_string_var.set("ビット反転中です……。")
out_file_paths = []
for in_file_path in in_file_paths:
in_file_name = os.path.basename(in_file_path)
out_file_name = ""
if re.match("^.+\\.[bB][iI][nN]$", in_file_name):
out_file_name = re.sub("\\.[bB][iI][nN]$", "", in_file_name)
else:
out_file_name = in_file_name + ".bin"
with open(os.path.join(out_dir, out_file_name), "wb") as file:
with open(in_file_path, "rb") as f:
while True:
bytes = f.read(1024)
read_byte_size = len(bytes)
if read_byte_size == 0:
break
# ビットを反転
integer = ~ int.from_bytes(bytes, byteorder="little", signed=True)
file.write(integer.to_bytes(read_byte_size, byteorder="little", signed=True))
out_file_paths.append(os.path.join(out_dir, out_file_name))
message_string_var.set("ビット反転が完了しました。" + " ".join(out_file_paths))
except Exception as exception:
messagebox.showerror(exception.__class__.__name__, str(exception))
raise
flip_bit_button = tkinter.Button(root, text="ビットを反転", command=flip_bit)
flip_bit_button.place(x=10, y=150)
root.mainloop()