ç»åã§ãã¡ã€ã«ãæå·åããŠã¿ãã
æšä»ãéèæ å ±ãå人æ å ±ãªã©ãæ©å¯éèŠããŒã¿ãWebäžã§ãããšããããããã«ãªããæå·åã®éèŠæ§ã¯å¢ããŠããããããŠãããŸããŸãªææ³ã§æå·ååŠçãè¡ãããŠãããä»åã¯ãèªäœã®æå·åããŒã«ãäœã£ãŠããŒã¿æå·åã®é°å²æ°ã楜ããã§ã¿ãããèªäœãªãã§ã¯ã®ã¢ã€ãã¢ãšããŠãç»åãã¡ã€ã«ãå©çšããŠæå·åããããŒã«ãäœã£ãŠã¿ããã
æåŒ·ã®æå·ææ³ - äœ¿ãæšãŠãããã«ã€ããŠ
éåžžã«ç°¡åãªæå·åææ³ã§ãããªãããè§£èªãé£ããææ³ã«ãäœ¿ãæšãŠããã(One Time Pad)ãããããããã¯ãæå·å察象ã®ãã¡ã€ã«ãšåãé·ãã®ä¹±æ°è¡šãçšããŠæå·ãè¡ããæå·åã®æ¹æ³ã¯ãéåžžã«ç°¡åã§ãå ããŒã¿ãšä¹±æ°è¡šãXORæŒç®ãçšããŠèšç®ãè¡ãã
äŸãã°ããtestããšããããŒã¿ããä¹±æ°è¡šã1234ãã§æå·åããŠã¿ãããPythonã§ãããXORæŒç®ãè¡ãã«ã¯ããa ^ bãã®ããã«èšè¿°ãããæåã«ãPythonã®å®è¡ç°å¢ColaboratoryãçšããŠãã¹ãããŠã¿ããã
a = 'test' # ããŒã¿
b = '1234' # ä¹±æ°è¡š
# æå·å
c = []
for aa, bb in zip(a, b):
cc = chr(ord(aa) ^ ord(bb))
c += [cc]
print("".join(c))
ãã®ããã°ã©ã ãå®è¡ããŠã¿ããããããšãæå·æãšããŠãEW@@ããšããå€ãåŸããããããã§ãord()ãæåããæ°å€ã«å€æãã颿°ã§ãchr()ãæ°å€ããæåã«å€æãã颿°ã ãæåå士ã¯XORæŒç®ã§ããªãã®ã§ãord()ãšchr()ã䜿ãããšã§ãæåãšæ°å€ã倿ããŠããã
ãããŠãå ã»ã©ãšåãä¹±æ°è¡šã1234ãããããã°ãäœæããæå·æãEW@@ããè§£èªïŒåŸ©å·ïŒããããšãã§ãããããã§ã¯ã埩å·ããŠã¿ãããæå·åã®æãšåãããã«ã3è¡ã»ã©ã®ããã°ã©ã ã§åŸ©å·ã§ããã
c = "EW@@"
b = "1234"
# 埩å·å
a = []
for bb, cc in zip(b, c):
aa = chr(ord(bb) ^ ord(cc))
a += [aa]
print("".join(a))
ãã®ããã°ã©ã ãå®è¡ãããšãæ£ããå ã®ããŒã¿ãtestããåŸãããããšãåããã ããã
ãã®ããã«ãXORæŒç®ã䜿ããšãä¹±æ°è¡šããããã°ãå ã®ããŒã¿ãæå·åãããã埩å·åãããããããšãã§ãããããã¯ãXORæŒç®ã®äŸ¿å©ãªæ§è³ªã ãã€ãŸããå€Pã«å¯ŸããŠãå€KãäºåºŠXORæŒç®ãããšãå ã®å€Pãšçãããªãã
(P ^ K) ^ K = P
ãã ãããã®ãäœ¿ãæšãŠããããã广çã«äœ¿ãã«ã¯ãããã€ã泚æç¹ãããããŸããå ã®ããŒã¿ãšä¹±æ°è¡šãåããµã€ãºã§ããããšãå¿ èŠã ãããã¯ãå ããŒã¿ãæŒããªãXORããå¿ èŠãããããã ããŸããåãä¹±æ°è¡šã䜿ã£ãŠç°ãªãããŒã¿ãæå·åãããªãããããä¹±æ°è¡šãè§£èªããæããããšãªã£ãŠããŸãããäœ¿ãæšãŠãããããšããååã®éããäžåã®æå·åã«ã€ããäžã€ã®ä¹±æ°è¡šãçšããããšã§ããã®æå·åã¯æå€§ã®å¹æãçºæ®ããã
ç»åãã¡ã€ã«ãä¹±æ°è¡šãšããŠäœ¿ãã¢ã€ãã¢
ãšã¯èšããä¹±æ°è¡šãã©ã®ããã«çšæãããè¯ãã ãããããã¡ãããä¹±æ°è¡šãé©åœãªä¹±æ°ãå©çšããŠäœæããããšãã§ãããããããä¹±æ°è¡šã«ç»åãã¡ã€ã«ãçšããã®ã¯ã©ãã ããããæè¿ã®ã¹ããŒããã©ã³ã§æ®åœ±ããç»åã§ããã°ããããªãã®ãµã€ãºãããä¹±æ°è¡šãšããŠç³ãåãªãã調ã¹ãŠã¿ããšãç»åãããŒãã¡ã€ã«ãšããŠå©çšããŠãããŒã¿ãæå·åãããœãããããã€ããããããã§ã¯ãããã«å£ã£ãŠãç»åãã¡ã€ã«ãçšããŠãã¡ã€ã«ãæå·åããããŒã«ãäœã£ãŠã¿ããã
ãã ããJPEGç»åã«ã¯ãåºå®æååãæã€ãããéšåãããããã®ãŸãŸä¹±æ°è¡šãšããŠäœ¿ããªããåºå®ãããéšåã®ããŒã¿ã容æã«èªã¿åãããŠããŸãå¯èœæ§ããããããã§ãããã«ããäžå·¥å€«ããŠãããã§ã¯ãç¬èªã®æ¬äŒŒä¹±æ°ãçæãããããå ããããšã§ãããŒã¿ãæå·åããŠã¿ããã
#!/usr/bin/env python3
# ã³ãã³ãã©ã€ã³ããæž¡ããããã¡ã€ã«ãåŸã --- (*1)
import sys
if len(sys.argv) < 3:
print("USAGES:")
print("env.py targetfile keyfile")
exit
target_file = sys.argv[1]
key_file = sys.argv[2]
out_file = target_file.replace('.txt', '') + ".out.txt"
# ãã¡ã€ã«ããã€ããªã¢ãŒãã§éã --- (*2)
out_fd = open(out_file, "wb")
target = open(target_file, "rb").read()
key = open(key_file, "rb").read()
# ç¬èªã®ä¹±æ°çæé¢æ° --- (*3)
rx, ry, rz, rw = (15424343, 949583, 991234, 11223344)
def randint(n):
global rx, ry, rz, rw
t = (rx ^ (rx << 11))
rx, ry, rz = ry, rz, rw
rw = rw = (rw ^ (rw >> 19)) ^ (t ^ (t >> 8))
return rw % n
# äžãã€ããã€XORåŠç --- (*4)
res = bytearray()
for i, a in enumerate(target):
b = key[i % len(key)]
r = randint(256)
c = a ^ b ^ r
res.append(c)
# çµæãæžã蟌ã --- (*5)
out_fd.write(res)
ãŸãã¯ãäžèšã®ãã¡ã€ã«ããenc.pyããšããååãã€ããŠä¿åãããããããŠãæå·åãããããã¹ããã¡ã€ã«ïŒtest.txtïŒãšãæå·åã«äœ¿ãããŒãã¡ã€ã«ïŒimage.jpgïŒãçšæãããã
ãããŠãã³ãã³ãã©ã€ã³ïŒWindowsãªãPowerShellãmacOSãªãã¿ãŒããã«.app)ãèµ·åããŠã以äžã®ããã«ã³ãã³ããå ¥åããŠå®è¡ããŠã¿ããã
Windowsç
python enc.py test.txt image.jpg
Macç
python3 enc.py test.txt image.jpg
ãããšãtest.txtã®å 容ãæå·åãããtest.out.txtãšãããã¡ã€ã«ãçæããããå 容ã確èªãããšã次ã®ããã«ãæå·åãããŠããããšã確èªã§ããã ããã
ãããŠããã®æå·åããããã¡ã€ã«ãã埩å·åããã«ã¯ãåãããŒãã¡ã€ã«ãçšããŠã以äžã®ããã«ã³ãã³ããå®è¡ãããã
Windowsç
python enc.py test.out.txt image.jpg
Macç
python3 enc.py test.out.txt image.jpg
ã³ãã³ããå®è¡ãããšãtest.out.out.txtãšãããã¡ã€ã«ãçæãããããã®ãã¡ã€ã«ã確èªãããšãå 容ã埩å·åãããå ã®ãã¡ã€ã«ãšå šãåãå 容ã§ããããšã確èªã§ããã ããã
äœ¿ãæ¹ãåãã£ããšããã§ããã°ã©ã ã確èªããŠã¿ãããããã°ã©ã ã®(ïŒ1)ã®éšåã§ã¯ãã³ãã³ãã©ã€ã³ããæž¡ããããã¡ã€ã«åãååŸãããPythonã§ã³ãã³ãã©ã€ã³åŒæ°ãåŸãã«ã¯ãsys.argvã確èªããã°è¯ãããããŠã(ïŒ2)ã®éšåã§ã¯ããã¡ã€ã«ããã€ããªã¢ãŒãã§éãã察象ãã¡ã€ã«ãšããŒãã¡ã€ã«ã«ã€ããŠã¯ãéããã€ãã§ã«ãå šå 容ãèªã¿åãããã«ããŠããã
ããã°ã©ã ã®(ïŒ3)ã§ã¯ãç¬èªã®ä¹±æ°çæé¢æ°ãå®çŸ©ããŠããã倿°rx, ry, rz, rwã«ããããé©åœãªåæå€ãäžããŠããã®ã§ããã®å€ã倿Žããã°ãç°ãªãæå·ããŒã¿ãçæãããããã«ãªãã
ããã°ã©ã ã®(ïŒ4)ã§ã¯ãäžãã€ããã€XORæŒç®ãè¡ããããã§ã¯ãå ããŒã¿(a)ãšããŒãã¡ã€ã«ã®å 容(b)ãšç䌌乱æ°(c)ã®äžã€ãXORããŠããããããŠãXORæŒç®ãè¡ã£ãçµæã(ïŒ5)ã§ãã¡ã€ã«ã«æžãåºãã
ãŸãšã
ä»åãæ¯èŒçåçŽãªXORæŒç®ã䜿ã£ãæå·åã®ææ³ã玹ä»ããããªããäœã®å€éšã©ã€ãã©ãªã䜿ããæžããããã35è¡ã®ããã°ã©ã ã ããããŒãã¡ã€ã«ããªãç¶æ ã§ããã®å ããŒã¿ã埩å ããã®ã¯è³é£ã®æ¥ã ããããã¡ãããå®çšé¢ã§å®å šã«æå·ã䜿ãã«ã¯ãå°çšã®æå·åããŒã«ã䜿ãããšã ãããããå®éã«ãèªåã®æã§æå·åããŒã«ãäœããªããæå·åã«å¯Ÿããçè§£ãæ·±ããããšãã§ããã ãããæ¬çš¿ãåèã«ããŠããªãªãžãã«ã®æå·åããŒã«ãèæ¡ããŠã¿ãã®ãé¢çœãã ããã



