ãã¡ã€ã«ãæå·åããã®ã«ãZIPå§çž®ã®æå·åæ©èœã䜿ã£ãŠãããšããæ¹ã¯å€ãããšã ããããšã¯èšããZIPãã¡ã€ã«ã®æå·åã«ZipCrypto圢åŒã䜿ã£ãŠãããªããå®å šãšã¯èšããªããããããªãããšããã®ããæšä»ã®ã³ã³ãã¥ãŒã¿ãŒã䜿ãã°8æå(è±å°æåïŒæ°å)ã®ãã¹ã¯ãŒããªã©æ°å以å ã«è§£æã§ããŠããŸããããã§ãä»åã¯æå·åããŒã«ãäœã£ãŠå®å šã«ãã¡ã€ã«ãæå·åããæ¹æ³ãèããŠã¿ããã
ZIPãã¡ã€ã«å§çž®ã®åé¡ç¹ã確èªããã
ãŸããä»åã®ããã°ã©ã ãäœãåã«ãçŸåšãZIPãã¡ã€ã«ã®æå·åã§åé¡ãšãªã£ãŠããç¹ã確èªããããäžè¬çã«ãZIPãã¡ã€ã«ã®æå·åã«äœ¿ããã®ã¯ãZipCryptoãšAES-256ã®2ã€ã®æ¹åŒãšãªã£ãŠãããããããWindows10ã®ãšã¯ã¹ãããŒã©ãŒã§ãè§£åã§ããã®ã¯åè ã®ZipCryptoã®ã¿ã ããã®ãããå©äŸ¿æ§ããZIPãã¡ã€ã«ã®æå·åã«ã¯ãZipCryptoæ¹åŒã奜ãŸããŠäœ¿ãããããšãå€ãã
ããããZipCryptoã®æå·åã¯ããã»ã©åŒ·åã§ãããšã¯èšããªãããããZIPãã¡ã€ã«ã®æå·åã«ãZipCryptoã䜿ã£ãäžã«8æå以äžã®ãã¹ã¯ãŒããå©çšãããšããããããããæ°åã§ãã¹ã¯ãŒããè§£èªãããŠããŸãããšã«ãªãã ããããããããã®æ¹åŒã§èšå®ã§ãããã¹ã¯ãŒãã®æå€§æåæ°ã¯12æåãŸã§ãšããæ¬ ç¹ãããã
詊ãã«ã€ã³ã¿ãŒãããã§ããã¹ã¯ãŒããå¿ããZIPãã¡ã€ã«ãéããã§æ€çŽ¢ããŠã¿ãããããããã®æå·è§£é€ããŒã«ãèŠã€ããã ããããŸãããã¹ã¯ãŒãç¹å®ãŸã§ã«ããã£ãæéã瀺ããŠãããã®ããããããããæ å ±ãèŠããšçããã¹ã¯ãŒãã§ã®ZIPãã¡ã€ã«æå·åã®æå³ãå šããªãããšãåããã ããã
ããã«å¯ŸããŠãZIPæå·åã§ãAES-256æ¹åŒã¯ãé«åºŠæå·åæšæºããšåŒã°ããæå·åæ¹åŒãæ¡çšãããŠããããã®æ¹åŒã§ååãªé·ãã®ãã¹ã¯ãŒãã䜿ãããšã§ãç°¡åã«è§£èªãããããšã¯ãªãã
ZIPãã¡ã€ã«ã®æå·åã®ãã¹ããã©ã¯ãã£ã¹ã¯ãWindows10ã®æšæºæ©èœã§ã¯è§£åã§ããªã£ãŠããŸããå§çž®åœ¢åŒã«AES-256ã䜿ãããšããããŠããã¹ã¯ãŒãã«è±æ°èšå·ããŸãã¹ããªã䜿ã£ã10æ¡ä»¥äžã®ãã¹ã¯ãŒãã䜿ãããšã ãããïŒãã ãããã·ã³ã®æ§èœã¯æ¥ã åäžããŠããããã€ãã¯10æ¡ã®ãã¹ã¯ãŒãã§ãå®å šãšã¯èšããªããšããæä»£ãæ¥ãã ãããïŒ
ç¬èªããŒã«ãäœãéã®æ³šæç¹
ãšããã§ãZIPãã¡ã€ã«ã®æå·åZipCryptoãå±éºãªã®ã§ããã°ãç¬èªã®æå·åã¢ã«ãŽãªãºã ãäœãããšã§åé¡ã解決ã§ãããããããªããšæãã ãããããããç¬èªã®æå·åããŒã«ãäœãäžã§æ³šæãå¿ èŠãªç¹ãããããŸããæãã€ãã§å®è£ ããæå·æ¹åŒãå¿ ãããå®å šãšã¯èšããªããšããç¹ã ã
äŸãã°ãæå·ã®æãå€å žçãªææ³ã«ã·ãŒã¶ãŒæå·ããã(ã·ãŒã¶ãŒæå·ã«ã€ããŠè©³ãã解説ã¯ãã¡ã)ãç°¡åã«èšãã°ãæåãæå®æåæ°ã ãã¢ã«ãã¡ãããé ã«ãããã ããšããæå·ã ãäŸãã°ãAããªããCãã«ãBããªããDãã«ãEããªããGãã«ãããšãããã®ããããæå·åããåŸã®ããŒã¿ãèŠãã ãã§ã¯ãèŠããã«ãã£ãŠã¯å®å šã«æå·åãããŠããããã«èŠããããšãããã
å®éã®ãšãããæå·åã®åŒ·åºŠã¯æå·ååŸã®ããŒã¿ãèŠãã ãã§ã¯åãããªããããæ£ããæå·åãããŠãããã©ããã®å€æã¯é£ãããããã¯å€§ããªèœãšã穎ã§ãããçŽ äººãäœã£ãç¬èªåœ¢åŒã®æå·åãããåè¿°ã®ZipCryptoã®æ¹ããŸã ãŸãã ã£ããšããããšã«ãªããããªãã
ããã§ãç¬èªããŒã«ãäœãããšæã£ãæã«ãããã£ãœã©èªèº«ãããã®ã§ãªãéããå®éã«è§£èªãé£ããå®å šã ãšèšãããŠããæå·å圢åŒã䜿ããšè¯ãã ããããããŠãæ¬çš¿ã§ãæè»œã«è©Šããå ç¢ãªæå·åæ¹åŒã§ããAES-256ã䜿ãäºã«ããã
å¿ èŠã©ã€ãã©ãªã®ã€ã³ã¹ããŒã«
Pythonã§AESãªã©ã®æå·åãè¡ãã«ã¯ãpycryptodomeãšããã©ã€ãã©ãªã䜿ããã³ãã³ãã©ã€ã³(WindowsãªãPowerShellãmacOSãªãã¿ãŒããã«.app)ã§ä»¥äžã®ã³ãã³ããå®è¡ããŠã©ã€ãã©ãªãã€ã³ã¹ããŒã«ãããããŸããGUIãå©çšããã®ã§ãã€ãã§ã«PySimpleGUIãäžç·ã«ã€ã³ã¹ããŒã«ãããã
python3 -m pip install pycryptodome pysimplegui
æå·åã»åŸ©å·åã®ããã°ã©ã
ãããŠãä»åã以äžã®ãããªããã°ã©ã ãäœæãããããã¹ããšãã£ã¿ã«ä»¥äžã®ããã°ã©ã ã貌ãä»ããŠãangou.pyããšããååã§ä¿åãããã
import PySimpleGUI as sg
import Crypto
from Crypto.Cipher import AES
# AES-256ã®ãªããžã§ã¯ããäœæ --- (*1)
def aes_new(password, iv):
sha = Crypto.Hash.SHA256.new()
sha.update(password.encode())
return AES.new(sha.digest(), AES.MODE_CFB, iv)
# æå·å --- (*2)
def encrypt(data, password):
iv = Crypto.Random.new().read(AES.block_size)
return iv + aes_new(password, iv).encrypt(data)
# 埩å·å --- (*3)
def decrypt(data, password):
iv, cipher = data[:AES.block_size], data[AES.block_size:]
return aes_new(password, iv).decrypt(cipher)
# ãã€ã¢ãã°ã§è³ªå --- (*4)
password = sg.popup_get_text('ãã¹ã¯ãŒãã¯?', password_char='*')
password2 = sg.popup_get_text('ãã¹ã¯ãŒã(確èª)', password_char='*')
if password != password2: sg.popup_ok('ãã¹ã¯ãŒããäžèŽããŸãã'); quit()
# å
¥åãã¡ã€ã«ãéžæ --- (*5)
infile = sg.popup_get_file('å
¥åãã¡ã€ã«ãæå®')
if infile is None: quit()
data = open(infile, 'rb').read()
# æå·å/埩å·å --- (*6)
t = sg.popup_yes_no('æå·åãªã[Yes]ã埩å·åãªã[No]')
if t == 'Yes':
savedata = encrypt(data, password)
else:
savedata = decrypt(data, password)
# åºåãã¡ã€ã«ãéžæ --- (*7)
outfile = sg.popup_get_file('åºåãã¡ã€ã«ãæå®', save_as=True)
if outfile is None: quit()
open(outfile, 'wb').write(savedata)
sg.popup_ok('ä¿åããŸãã')
ããã°ã©ã ãå®è¡ããã«ã¯ãã³ãã³ãã©ã€ã³ã§ä»¥äžãå®è¡ãããã
python3 angou.py
ãããšã次ã ãšãã€ã¢ãã°ãåºãã®ã§è³ªåã«çããŠãããšæå·åã»åŸ©å·åãã§ããã
ããã§ã¯ãããã°ã©ã ã確èªããŠã¿ããã(ïŒ1)ãã(ïŒ3)ã®éšåã§ã¯ãAES-256æå·åã»åŸ©å·åã®ããã®æé ã颿°ã«ãŸãšãããã®ã ãAESæå·åã§ã¯ããã¹ã¯ãŒãã«å ããŠIV(åæåãã¯ãã«)ãæå®ããããšã«ãªã£ãŠãããåæãã¯ãã«ãæå®ããããšã«ãããåããã¹ã¯ãŒãã§æå·åãããšããç°ãªãããŒã¿ã«ãªããä»åããã®åæãã¯ãã«ã¯æå·åæžã¿ã®ãã¡ã€ã«ã«åã蟌ãã§ããããšã«ããã(ïŒ2)ã§ã¯æå·åãè¡ãã(ïŒ3)ã§ã¯åŸ©å·åãè¡ãã
ãããŠã(ïŒ4)ã§ã¯ãã€ã¢ãã°ã衚瀺ããŠãŠãŒã¶ãŒã«ãã¹ã¯ãŒãã質åããã(ïŒ5)ã§ã¯å ¥åãã¡ã€ã«ãã€ã¢ãã°ãåºããŠããŠãŒã¶ãŒããã¡ã€ã«ãéžã¶ãšãã¡ã€ã«ãèªã¿èŸŒãã(ïŒ6)ã§ã¯æå·åã»åŸ©å·åã®ã©ã¡ããè¡ãã®ãå°ããŠãæå·åã»åŸ©å·åã®åŠçãè¡ãããããŠã(ïŒ7)ã§ã¯åºåãã¡ã€ã«ãã€ã¢ãã°ãåºããŠãŠãŒã¶ãŒãä¿åå ãæå®ãããããã¡ã€ã«ãä¿åããã
ãŸãšã
以äžãä»åã¯AES-256ãå©çšããç¬èªã®æå·åããŒã«ãäœã£ãŠã¿ããã³ã¡ã³ããå ¥ããŠã35è¡ã®ããã°ã©ã ãªã®ã§ãäžæ°ã«èªããéã®ããã°ã©ã ã ããããã ããæäœéã®æ©èœããå®è£ ããŠããªãã
ããã§ã10æ¡ä»¥äžã®ãã¹ã¯ãŒããæå®ãããããåãä»ããªãããã«ãããªã©æ¹è¯ããŠã¿ããšå®å¿ã ããããŸããæå·åæžã¿ã®ããŒã¿ã®æ¡åŒµåãæ±ºãæã¡ã«ããŠããã®ããŒã¿ãéžã°ãããæå·åã»åŸ©å·åãéžã°ãªããŠãè¯ãããã«ãããšå©äŸ¿æ§ãé«ãŸãããã®éãWindowsã®é¢é£ã¥ãã«å¯Ÿå¿ãããšãããã«äœ¿ãåæãåäžããã ããã
ãããŠããã£ããã®GUI察å¿ããã°ã©ã ãªã®ã§ãpyinstallerãªã©ãå©çšããŠãå®è¡ãã¡ã€ã«(EXEãã¡ã€ã«)ã«ããŠé åžããã°ãèªå以å€ã®äººã«ãã€ãã£ãŠããããã ããã
ãªããã¡ãŒã«ã§ãã¹ã¯ãŒããšãã¡ã€ã«ãéä¿¡ããæ¹æ³ã¯ãããã«æå·åã®æ¹æ³ã匷åãããšããŠãå®å šãšã¯èšããªãããããããã¡ãŒã«ãããã¡ã€ã«ãèªã¿åºããã®ã§ããã°ãåäžçµè·¯ã§åãæž¡ããããã¹ã¯ãŒããç°¡åã«èªã¿åºããŠããŸããšããã®ãçç±ã ããã®ããããã¡ã€ã«ã®åãæž¡ãã«ã¯ãDropboxãOneDriveãGoogleãã©ã€ããªã©ã¯ã©ãŠãã¹ãã¬ãŒãžã䜿ã£ãŠãã¡ã€ã«ãåãæž¡ãæ¹æ³ãæšå¥šãããŠãããåèã«ãããã
èªç±åããã°ã©ããŒããããã¯ãã©ã«ãŠãããã°ã©ãã³ã°ã®æ¥œãããäŒããæŽ»åãããŠããã代衚äœã«ãæ¥æ¬èªããã°ã©ãã³ã°èšèªããªã§ããã ãããã¹ã鳿¥œããµã¯ã©ããªã©ã2001幎ãªã³ã©ã€ã³ãœãã倧è³å ¥è³ã2004幎床æªèžãŠãŒã¹ ã¹ãŒããŒã¯ãªãšãŒã¿èªå®ã2010幎 OSSè²¢ç®è ç« åè³ãæè¡æžãå€ãå·çããŠãããçŽè¿ã§ã¯ããã·ãŽããã¯ãã©ã PythonèªååŠçã®æç§æž(ãã€ããåºç)ããããã«äœ¿ãã!æ¥åã§å®è·µã§ãã! Pythonã«ããAIã»æ©æ¢°åŠç¿ã»æ·±å±€åŠç¿ã¢ããªã®ã€ããæ¹ TensorFlow2察å¿(ãœã·ã )ãããã³ã¬ã§ãã£ããåŠã¶Python(ãã€ããåºç)ããªã©ã

