One-time pad/Phix: Difference between revisions
m (font) |
m (→{{header|Phix}}: added syntax colouring the hard way) |
||
Line 26: | Line 26: | ||
TIP: if a message gets lost, or you quit without decrypting something, then edit |
TIP: if a message gets lost, or you quit without decrypting something, then edit |
||
the recipient's .1td file manually, so that Used matches the sender's .1te file. |
the recipient's .1td file manually, so that Used matches the sender's .1te file. |
||
<lang Phix>string default_enc = "", |
|||
default_dec = "" |
|||
<!--<lang Phix>--> |
|||
function size_used(string name, integer now_used=0) |
|||
<span style="color: #004080;">string</span> <span style="color: #000000;">default_enc</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">""</span><span style="color: #0000FF;">,</span> |
|||
object txt = read_lines(name) |
|||
<span style="color: #000000;">default_dec</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">""</span> |
|||
if sequence(txt) then |
|||
integer size, used |
|||
<span style="color: #008080;">function</span> <span style="color: #000000;">size_used</span><span style="color: #0000FF;">(</span><span style="color: #004080;">string</span> <span style="color: #000000;">name</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">integer</span> <span style="color: #000000;">now_used</span><span style="color: #0000FF;">=</span><span style="color: #000000;">0</span><span style="color: #0000FF;">)</span> |
|||
for i=1 to length(txt) do |
|||
<span style="color: #004080;">object</span> <span style="color: #000000;">txt</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">read_lines</span><span style="color: #0000FF;">(</span><span style="color: #000000;">name</span><span style="color: #0000FF;">)</span> |
|||
if match("Size",txt[i])=1 then |
|||
<span style="color: #008080;">if</span> <span style="color: #004080;">sequence</span><span style="color: #0000FF;">(</span><span style="color: #000000;">txt</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span> |
|||
{{size}} = scanf(txt[i],"Size: %d") |
|||
<span style="color: #004080;">integer</span> <span style="color: #000000;">size</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">used</span> |
|||
elsif match("Used",txt[i])=1 then |
|||
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">txt</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span> |
|||
if now_used=0 then |
|||
<span style="color: #008080;">if</span> <span style="color: #7060A8;">match</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"Size"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">txt</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">])=</span><span style="color: #000000;">1</span> <span style="color: #008080;">then</span> |
|||
{{used}} = scanf(txt[i],"Used: %d") |
|||
<span style="color: #0000FF;">{{</span><span style="color: #000000;">size</span><span style="color: #0000FF;">}}</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">scanf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">txt</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">],</span><span style="color: #008000;">"Size: %d"</span><span style="color: #0000FF;">)</span> |
|||
return {size,used} |
|||
<span style="color: #008080;">elsif</span> <span style="color: #7060A8;">match</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"Used"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">txt</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">])=</span><span style="color: #000000;">1</span> <span style="color: #008080;">then</span> |
|||
else |
|||
<span style="color: #008080;">if</span> <span style="color: #000000;">now_used</span><span style="color: #0000FF;">=</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span> |
|||
txt[i] = sprintf("Used: %d",now_used) |
|||
<span style="color: #0000FF;">{{</span><span style="color: #000000;">used</span><span style="color: #0000FF;">}}</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">scanf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">txt</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">],</span><span style="color: #008000;">"Used: %d"</span><span style="color: #0000FF;">)</span> |
|||
if not write_lines(name,txt) then |
|||
<span style="color: #008080;">return</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">size</span><span style="color: #0000FF;">,</span><span style="color: #000000;">used</span><span style="color: #0000FF;">}</span> |
|||
printf(1,"error updating %s\n",{name}) |
|||
<span style="color: #008080;">else</span> |
|||
<span style="color: #000000;">txt</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">sprintf</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"Used: %d"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">now_used</span><span style="color: #0000FF;">)</span> |
|||
return 1 |
|||
<span style="color: #008080;">if</span> <span style="color: #008080;">not</span> <span style="color: #7060A8;">write_lines</span><span style="color: #0000FF;">(</span><span style="color: #000000;">name</span><span style="color: #0000FF;">,</span><span style="color: #000000;">txt</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span> |
|||
end if |
|||
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"error updating %s\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">name</span><span style="color: #0000FF;">})</span> |
|||
end if |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
end for |
|||
<span style="color: #008080;">return</span> <span style="color: #000000;">1</span> |
|||
end if |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
return {-1,-1} |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
end function |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
<span style="color: #008080;">return</span> <span style="color: #0000FF;">{-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">}</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span> |
|||
<span style="color: #008080;">procedure</span> <span style="color: #000000;">list_one_time_pads</span><span style="color: #0000FF;">(</span><span style="color: #004080;">bool</span> <span style="color: #000000;">set_default</span><span style="color: #0000FF;">=</span><span style="color: #004600;">false</span><span style="color: #0000FF;">)</span> |
|||
<span style="color: #7060A8;">puts</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"\n"</span><span style="color: #0000FF;">)</span> |
|||
<span style="color: #004080;">sequence</span> <span style="color: #000000;">d</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">dir</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"*.1t?"</span><span style="color: #0000FF;">)</span> |
|||
<span style="color: #008080;">if</span> <span style="color: #000000;">d</span><span style="color: #0000FF;">={}</span> <span style="color: #008080;">then</span> |
|||
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"No one time pad files found.\n"</span><span style="color: #0000FF;">)</span> |
|||
<span style="color: #008080;">return</span> |
|||
<span style="color: #008080;">elsif</span> <span style="color: #000000;">set_default</span> <span style="color: #008080;">then</span> |
|||
<span style="color: #004080;">sequence</span> <span style="color: #000000;">bases</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{},</span> |
|||
<span style="color: #000000;">types</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{{},{},{}}</span> <span style="color: #000080;font-style:italic;">-- p/e/d</span> |
|||
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">d</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span> |
|||
<span style="color: #004080;">string</span> <span style="color: #000000;">name</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">d</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">][</span><span style="color: #004600;">D_NAME</span><span style="color: #0000FF;">]</span> |
|||
<span style="color: #004080;">integer</span> <span style="color: #000000;">dot</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">find</span><span style="color: #0000FF;">(</span><span style="color: #008000;">'.'</span><span style="color: #0000FF;">,</span><span style="color: #000000;">name</span><span style="color: #0000FF;">)</span> |
|||
<span style="color: #008080;">if</span> <span style="color: #000000;">dot</span><span style="color: #0000FF;">!=</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span> |
|||
<span style="color: #004080;">string</span> <span style="color: #000000;">base</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">name</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">..</span><span style="color: #000000;">dot</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">],</span> |
|||
<span style="color: #000000;">ext</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">name</span><span style="color: #0000FF;">[</span><span style="color: #000000;">dot</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">..$]</span> |
|||
<span style="color: #004080;">integer</span> <span style="color: #000000;">e</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">find</span><span style="color: #0000FF;">(</span><span style="color: #000000;">ext</span><span style="color: #0000FF;">,{</span><span style="color: #008000;">"1tp"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"1te"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"1td"</span><span style="color: #0000FF;">})</span> |
|||
<span style="color: #008080;">if</span> <span style="color: #000000;">e</span><span style="color: #0000FF;">!=</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span> |
|||
<span style="color: #004080;">integer</span> <span style="color: #000000;">k</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">find</span><span style="color: #0000FF;">(</span><span style="color: #000000;">base</span><span style="color: #0000FF;">,</span><span style="color: #000000;">bases</span><span style="color: #0000FF;">)</span> |
|||
<span style="color: #008080;">if</span> <span style="color: #000000;">k</span><span style="color: #0000FF;">=</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span> |
|||
<span style="color: #000000;">bases</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">append</span><span style="color: #0000FF;">(</span><span style="color: #000000;">bases</span><span style="color: #0000FF;">,</span><span style="color: #000000;">base</span><span style="color: #0000FF;">)</span> |
|||
<span style="color: #000000;">k</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">bases</span><span style="color: #0000FF;">)</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
<span style="color: #000000;">types</span><span style="color: #0000FF;">[</span><span style="color: #000000;">e</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">&=</span> <span style="color: #000000;">k</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span> |
|||
<span style="color: #000000;">default_enc</span> <span style="color: #0000FF;">=</span> <span style="color: #008080;">iff</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">types</span><span style="color: #0000FF;">[</span><span style="color: #000000;">2</span><span style="color: #0000FF;">])=</span><span style="color: #000000;">1</span><span style="color: #0000FF;">?</span><span style="color: #000000;">bases</span><span style="color: #0000FF;">[</span><span style="color: #000000;">types</span><span style="color: #0000FF;">[</span><span style="color: #000000;">2</span><span style="color: #0000FF;">][</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]]&</span><span style="color: #008000;">".1te"</span><span style="color: #0000FF;">:</span><span style="color: #008000;">""</span><span style="color: #0000FF;">)</span> |
|||
<span style="color: #000000;">default_dec</span> <span style="color: #0000FF;">=</span> <span style="color: #008080;">iff</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">types</span><span style="color: #0000FF;">[</span><span style="color: #000000;">3</span><span style="color: #0000FF;">])=</span><span style="color: #000000;">1</span><span style="color: #0000FF;">?</span><span style="color: #000000;">bases</span><span style="color: #0000FF;">[</span><span style="color: #000000;">types</span><span style="color: #0000FF;">[</span><span style="color: #000000;">3</span><span style="color: #0000FF;">][</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]]&</span><span style="color: #008000;">".1td"</span><span style="color: #0000FF;">:</span><span style="color: #008000;">""</span><span style="color: #0000FF;">)</span> |
|||
<span style="color: #008080;">else</span> |
|||
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">d</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span> |
|||
<span style="color: #004080;">sequence</span> <span style="color: #000000;">di</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">d</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span> |
|||
<span style="color: #004080;">string</span> <span style="color: #000000;">name</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">di</span><span style="color: #0000FF;">[</span><span style="color: #004600;">D_NAME</span><span style="color: #0000FF;">],</span> |
|||
<span style="color: #000000;">info</span> <span style="color: #0000FF;">=</span> <span style="color: #008080;">iff</span><span style="color: #0000FF;">(</span><span style="color: #000000;">name</span><span style="color: #0000FF;">[$]=</span><span style="color: #008000;">'p'</span><span style="color: #0000FF;">?</span><span style="color: #7060A8;">sprintf</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"Size: %d"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">di</span><span style="color: #0000FF;">[</span><span style="color: #004600;">D_SIZE</span><span style="color: #0000FF;">])</span> |
|||
<span style="color: #0000FF;">:</span><span style="color: #7060A8;">sprintf</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"Size: %d, Used: %d"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">size_used</span><span style="color: #0000FF;">(</span><span style="color: #000000;">name</span><span style="color: #0000FF;">)))</span> |
|||
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"%s Created: %02d/%02d/%04d, %s\n"</span><span style="color: #0000FF;">,</span> |
|||
<span style="color: #0000FF;">{</span><span style="color: #000000;">name</span><span style="color: #0000FF;">,</span><span style="color: #000000;">di</span><span style="color: #0000FF;">[</span><span style="color: #004600;">D_DAY</span><span style="color: #0000FF;">],</span><span style="color: #000000;">di</span><span style="color: #0000FF;">[</span><span style="color: #004600;">D_MONTH</span><span style="color: #0000FF;">],</span><span style="color: #000000;">di</span><span style="color: #0000FF;">[</span><span style="color: #004600;">D_YEAR</span><span style="color: #0000FF;">],</span><span style="color: #000000;">info</span><span style="color: #0000FF;">})</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">procedure</span> |
|||
<span style="color: #008080;">procedure</span> <span style="color: #000000;">dump_hex</span><span style="color: #0000FF;">(</span><span style="color: #004080;">sequence</span> <span style="color: #000000;">s</span><span style="color: #0000FF;">)</span> |
|||
<span style="color: #008080;">if</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">)=</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span> |
|||
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"{}\n"</span><span style="color: #0000FF;">)</span> |
|||
<span style="color: #008080;">else</span> |
|||
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span> |
|||
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"%02x%c"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">s</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">],</span><span style="color: #008080;">iff</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">mod</span><span style="color: #0000FF;">(</span><span style="color: #000000;">i</span><span style="color: #0000FF;">,</span><span style="color: #000000;">16</span><span style="color: #0000FF;">)=</span><span style="color: #000000;">0</span><span style="color: #0000FF;">?</span><span style="color: #008000;">'\n'</span><span style="color: #0000FF;">:</span><span style="color: #008000;">' '</span><span style="color: #0000FF;">)})</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">procedure</span> |
|||
<span style="color: #008080;">procedure</span> <span style="color: #000000;">dump_file</span><span style="color: #0000FF;">(</span><span style="color: #004080;">string</span> <span style="color: #000000;">file</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">bool</span> <span style="color: #000000;">ashex</span><span style="color: #0000FF;">=</span><span style="color: #004600;">false</span><span style="color: #0000FF;">)</span> |
|||
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"The contents of %s:\n\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">file</span><span style="color: #0000FF;">})</span> |
|||
<span style="color: #008080;">if</span> <span style="color: #7060A8;">match</span><span style="color: #0000FF;">(</span><span style="color: #008000;">".1tp"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">file</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">or</span> <span style="color: #000000;">ashex</span> <span style="color: #008080;">then</span> |
|||
<span style="color: #004080;">integer</span> <span style="color: #000000;">fn</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">open</span><span style="color: #0000FF;">(</span><span style="color: #000000;">file</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"rb"</span><span style="color: #0000FF;">)</span> |
|||
<span style="color: #000000;">dump_hex</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">get_bytes</span><span style="color: #0000FF;">(</span><span style="color: #000000;">fn</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">64</span><span style="color: #0000FF;">))</span> |
|||
<span style="color: #7060A8;">close</span><span style="color: #0000FF;">(</span><span style="color: #000000;">fn</span><span style="color: #0000FF;">)</span> |
|||
<span style="color: #7060A8;">puts</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008080;">iff</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">get_file_size</span><span style="color: #0000FF;">(</span><span style="color: #000000;">file</span><span style="color: #0000FF;">)></span><span style="color: #000000;">64</span><span style="color: #0000FF;">?</span><span style="color: #008000;">"...\n\n"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"\n"</span><span style="color: #0000FF;">))</span> |
|||
<span style="color: #008080;">else</span> |
|||
<span style="color: #7060A8;">puts</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">join</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">read_lines</span><span style="color: #0000FF;">(</span><span style="color: #000000;">file</span><span style="color: #0000FF;">),</span><span style="color: #008000;">"\n"</span><span style="color: #0000FF;">)&</span><span style="color: #008000;">"\n"</span><span style="color: #0000FF;">)</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">procedure</span> |
|||
<span style="color: #008080;">procedure</span> <span style="color: #000000;">create_one_time_pad</span><span style="color: #0000FF;">()</span> |
|||
<span style="color: #004080;">string</span> <span style="color: #000000;">filename</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">prompt_string</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"OTP file name to create (without extension):"</span><span style="color: #0000FF;">)</span> |
|||
<span style="color: #008080;">if</span> <span style="color: #7060A8;">find</span><span style="color: #0000FF;">(</span><span style="color: #008000;">'.'</span><span style="color: #0000FF;">,</span><span style="color: #000000;">filename</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span> |
|||
<span style="color: #7060A8;">puts</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"extension not allowed\n"</span><span style="color: #0000FF;">)</span> |
|||
<span style="color: #008080;">elsif</span> <span style="color: #000000;">filename</span><span style="color: #0000FF;">!=</span><span style="color: #008000;">""</span> <span style="color: #008080;">then</span> |
|||
<span style="color: #004080;">string</span> <span style="color: #000000;">pfile</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">filename</span><span style="color: #0000FF;">&</span><span style="color: #008000;">".1tp"</span><span style="color: #0000FF;">,</span> |
|||
<span style="color: #000000;">efile</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">filename</span><span style="color: #0000FF;">&</span><span style="color: #008000;">".1te"</span><span style="color: #0000FF;">,</span> |
|||
<span style="color: #000000;">dfile</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">filename</span><span style="color: #0000FF;">&</span><span style="color: #008000;">".1td"</span> |
|||
<span style="color: #008080;">if</span> <span style="color: #7060A8;">file_exists</span><span style="color: #0000FF;">(</span><span style="color: #000000;">pfile</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span> |
|||
<span style="color: #004080;">string</span> <span style="color: #000000;">del</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">lower</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">prompt_string</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"File already exists - delete?:"</span><span style="color: #0000FF;">))</span> |
|||
<span style="color: #008080;">if</span> <span style="color: #008080;">not</span> <span style="color: #7060A8;">find</span><span style="color: #0000FF;">(</span><span style="color: #000000;">del</span><span style="color: #0000FF;">,{</span><span style="color: #008000;">"y"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"yes"</span><span style="color: #0000FF;">})</span> <span style="color: #008080;">then</span> <span style="color: #008080;">return</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
<span style="color: #008080;">if</span> <span style="color: #008080;">not</span> <span style="color: #7060A8;">delete_file</span><span style="color: #0000FF;">(</span><span style="color: #000000;">pfile</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span> |
|||
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"error deleting %s\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">pfile</span><span style="color: #0000FF;">})</span> |
|||
<span style="color: #008080;">return</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
<span style="color: #004080;">string</span> <span style="color: #000000;">comment</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">prompt_string</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"comment (optional):"</span><span style="color: #0000FF;">)</span> |
|||
<span style="color: #004080;">integer</span> <span style="color: #000000;">filesize</span> |
|||
<span style="color: #008080;">while</span> <span style="color: #000000;">1</span> <span style="color: #008080;">do</span> |
|||
<span style="color: #004080;">string</span> <span style="color: #000000;">sizestr</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">prompt_string</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"file size (1MB):"</span><span style="color: #0000FF;">)</span> |
|||
<span style="color: #004080;">sequence</span> <span style="color: #000000;">res</span> <span style="color: #0000FF;">=</span> <span style="color: #008080;">iff</span><span style="color: #0000FF;">(</span><span style="color: #000000;">sizestr</span><span style="color: #0000FF;">=</span><span style="color: #008000;">""</span><span style="color: #0000FF;">?{{</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"MB"</span><span style="color: #0000FF;">}}:</span><span style="color: #7060A8;">scanf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">sizestr</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"%d%s"</span><span style="color: #0000FF;">))</span> |
|||
<span style="color: #008080;">if</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">res</span><span style="color: #0000FF;">)=</span><span style="color: #000000;">1</span> <span style="color: #008080;">then</span> |
|||
<span style="color: #004080;">integer</span> <span style="color: #000000;">k</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">find</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">upper</span><span style="color: #0000FF;">(</span><span style="color: #000000;">res</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">][</span><span style="color: #000000;">2</span><span style="color: #0000FF;">]),{</span><span style="color: #008000;">""</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"K"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"KB"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"M"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"MB"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"G"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"GB"</span><span style="color: #0000FF;">})</span> |
|||
<span style="color: #008080;">if</span> <span style="color: #000000;">k</span><span style="color: #0000FF;">!=</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span> |
|||
<span style="color: #000000;">k</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1024</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1024</span><span style="color: #0000FF;">*</span><span style="color: #000000;">1024</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1024</span><span style="color: #0000FF;">*</span><span style="color: #000000;">1204</span><span style="color: #0000FF;">}[</span><span style="color: #7060A8;">floor</span><span style="color: #0000FF;">(</span><span style="color: #000000;">k</span><span style="color: #0000FF;">/</span><span style="color: #000000;">2</span><span style="color: #0000FF;">)+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span> |
|||
<span style="color: #000000;">filesize</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">res</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">][</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]*</span><span style="color: #000000;">k</span> |
|||
<span style="color: #008080;">exit</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"unknown suffix:%s - use K|M|G or KB|MB|GB\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">res</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">][</span><span style="color: #000000;">2</span><span style="color: #0000FF;">]})</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">while</span> |
|||
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"Creating %s (%d bytes)\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">pfile</span><span style="color: #0000FF;">,</span><span style="color: #000000;">filesize</span><span style="color: #0000FF;">})</span> |
|||
<span style="color: #004080;">integer</span> <span style="color: #000000;">fn</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">open</span><span style="color: #0000FF;">(</span><span style="color: #000000;">pfile</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"wb"</span><span style="color: #0000FF;">)</span> |
|||
<span style="color: #008080;">if</span> <span style="color: #000000;">fn</span><span style="color: #0000FF;">=-</span><span style="color: #000000;">1</span> <span style="color: #008080;">then</span> |
|||
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"error opening %s\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">pfile</span><span style="color: #0000FF;">})</span> |
|||
<span style="color: #008080;">return</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #000000;">filesize</span> <span style="color: #008080;">do</span> |
|||
<span style="color: #7060A8;">puts</span><span style="color: #0000FF;">(</span><span style="color: #000000;">fn</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">rand</span><span style="color: #0000FF;">(</span><span style="color: #000000;">256</span><span style="color: #0000FF;">)-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">)</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span> |
|||
<span style="color: #7060A8;">close</span><span style="color: #0000FF;">(</span><span style="color: #000000;">fn</span><span style="color: #0000FF;">)</span> |
|||
<span style="color: #000000;">fn</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">open</span><span style="color: #0000FF;">(</span><span style="color: #000000;">efile</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"w"</span><span style="color: #0000FF;">)</span> |
|||
<span style="color: #008080;">if</span> <span style="color: #000000;">fn</span><span style="color: #0000FF;">=-</span><span style="color: #000000;">1</span> <span style="color: #008080;">then</span> |
|||
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"error opening %s\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">efile</span><span style="color: #0000FF;">})</span> |
|||
<span style="color: #008080;">return</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">fn</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"# OTP file\n# %s\nSize: %d\nUsed: 0\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">comment</span><span style="color: #0000FF;">,</span><span style="color: #000000;">filesize</span><span style="color: #0000FF;">})</span> |
|||
<span style="color: #7060A8;">close</span><span style="color: #0000FF;">(</span><span style="color: #000000;">fn</span><span style="color: #0000FF;">)</span> |
|||
<span style="color: #008080;">if</span> <span style="color: #008080;">not</span> <span style="color: #7060A8;">copy_file</span><span style="color: #0000FF;">(</span><span style="color: #000000;">efile</span><span style="color: #0000FF;">,</span><span style="color: #000000;">dfile</span><span style="color: #0000FF;">,</span><span style="color: #004600;">true</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span> |
|||
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"error copying %s to %s\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">efile</span><span style="color: #0000FF;">,</span><span style="color: #000000;">dfile</span><span style="color: #0000FF;">})</span> |
|||
<span style="color: #008080;">return</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"\n%s and %s and %s have been created in the current directory.\n\n"</span><span style="color: #0000FF;">,</span> |
|||
<span style="color: #0000FF;">{</span><span style="color: #000000;">pfile</span><span style="color: #0000FF;">,</span><span style="color: #000000;">efile</span><span style="color: #0000FF;">,</span><span style="color: #000000;">dfile</span><span style="color: #0000FF;">})</span> |
|||
<span style="color: #000000;">dump_file</span><span style="color: #0000FF;">(</span><span style="color: #000000;">pfile</span><span style="color: #0000FF;">)</span> |
|||
<span style="color: #000000;">dump_file</span><span style="color: #0000FF;">(</span><span style="color: #000000;">efile</span><span style="color: #0000FF;">)</span> |
|||
<span style="color: #000000;">default_enc</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">efile</span> |
|||
<span style="color: #000000;">default_dec</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">dfile</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">procedure</span> |
|||
<span style="color: #008080;">procedure</span> <span style="color: #000000;">delete_one_time_pad</span><span style="color: #0000FF;">()</span> |
|||
<span style="color: #004080;">string</span> <span style="color: #000000;">filename</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">prompt_string</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"OTP file name to delete (without extension):"</span><span style="color: #0000FF;">)</span> |
|||
<span style="color: #008080;">if</span> <span style="color: #7060A8;">find</span><span style="color: #0000FF;">(</span><span style="color: #008000;">'.'</span><span style="color: #0000FF;">,</span><span style="color: #000000;">filename</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span> |
|||
<span style="color: #7060A8;">puts</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"extension not allowed\n"</span><span style="color: #0000FF;">)</span> |
|||
<span style="color: #008080;">elsif</span> <span style="color: #000000;">filename</span><span style="color: #0000FF;">!=</span><span style="color: #008000;">""</span> <span style="color: #008080;">then</span> |
|||
<span style="color: #004080;">string</span> <span style="color: #000000;">efile</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">filename</span><span style="color: #0000FF;">&</span><span style="color: #008000;">".1te"</span><span style="color: #0000FF;">,</span> |
|||
<span style="color: #000000;">dfile</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">filename</span><span style="color: #0000FF;">&</span><span style="color: #008000;">".1td"</span> |
|||
<span style="color: #000000;">filename</span> <span style="color: #0000FF;">&=</span> <span style="color: #008000;">".1tp"</span> |
|||
<span style="color: #008080;">if</span> <span style="color: #008080;">not</span> <span style="color: #7060A8;">file_exists</span><span style="color: #0000FF;">(</span><span style="color: #000000;">filename</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span> |
|||
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"file %s found\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">filename</span><span style="color: #0000FF;">})</span> |
|||
<span style="color: #008080;">return</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
<span style="color: #004080;">string</span> <span style="color: #000000;">del</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">lower</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">prompt_string</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"Delete file - are you sure?:"</span><span style="color: #0000FF;">))</span> |
|||
<span style="color: #008080;">if</span> <span style="color: #008080;">not</span> <span style="color: #7060A8;">find</span><span style="color: #0000FF;">(</span><span style="color: #000000;">del</span><span style="color: #0000FF;">,{</span><span style="color: #008000;">"y"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"yes"</span><span style="color: #0000FF;">})</span> <span style="color: #008080;">then</span> |
|||
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"file not deleted\n"</span><span style="color: #0000FF;">)</span> |
|||
<span style="color: #008080;">return</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
<span style="color: #008080;">if</span> <span style="color: #008080;">not</span> <span style="color: #7060A8;">delete_file</span><span style="color: #0000FF;">(</span><span style="color: #000000;">filename</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span> |
|||
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"error deleting %s\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">filename</span><span style="color: #0000FF;">})</span> |
|||
<span style="color: #008080;">return</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
<span style="color: #004080;">integer</span> <span style="color: #000000;">c</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">1</span> |
|||
<span style="color: #000000;">c</span> <span style="color: #0000FF;">+=</span> <span style="color: #7060A8;">delete_file</span><span style="color: #0000FF;">(</span><span style="color: #000000;">efile</span><span style="color: #0000FF;">)</span> |
|||
<span style="color: #000000;">c</span> <span style="color: #0000FF;">+=</span> <span style="color: #7060A8;">delete_file</span><span style="color: #0000FF;">(</span><span style="color: #000000;">dfile</span><span style="color: #0000FF;">)</span> |
|||
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"%d file%s successfully deleted.\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">c</span><span style="color: #0000FF;">,</span><span style="color: #008080;">iff</span><span style="color: #0000FF;">(</span><span style="color: #000000;">c</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span><span style="color: #0000FF;">?</span><span style="color: #008000;">""</span><span style="color: #0000FF;">:</span><span style="color: #008000;">"s"</span><span style="color: #0000FF;">)})</span> |
|||
<span style="color: #008080;">if</span> <span style="color: #000000;">default_enc</span><span style="color: #0000FF;">=</span><span style="color: #000000;">efile</span> <span style="color: #008080;">then</span> <span style="color: #000000;">default_enc</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">""</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
<span style="color: #008080;">if</span> <span style="color: #000000;">default_dec</span><span style="color: #0000FF;">=</span><span style="color: #000000;">dfile</span> <span style="color: #008080;">then</span> <span style="color: #000000;">default_dec</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">""</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">procedure</span> |
|||
<span style="color: #004080;">sequence</span> <span style="color: #000000;">msg</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{}</span> |
|||
<span style="color: #008080;">procedure</span> <span style="color: #000000;">crypt_text</span><span style="color: #0000FF;">(</span><span style="color: #004080;">integer</span> <span style="color: #000000;">de</span><span style="color: #0000FF;">)</span> |
|||
<span style="color: #004080;">sequence</span> <span style="color: #000000;">text</span> <span style="color: #0000FF;">=</span> <span style="color: #008080;">iff</span><span style="color: #0000FF;">(</span><span style="color: #000000;">de</span><span style="color: #0000FF;">=</span><span style="color: #008000;">'d'</span><span style="color: #0000FF;">?</span><span style="color: #000000;">msg</span><span style="color: #0000FF;">:</span><span style="color: #7060A8;">prompt_string</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"message:"</span><span style="color: #0000FF;">))</span> |
|||
<span style="color: #004080;">string</span> <span style="color: #000000;">dflt</span> <span style="color: #0000FF;">=</span> <span style="color: #008080;">iff</span><span style="color: #0000FF;">(</span><span style="color: #000000;">de</span><span style="color: #0000FF;">=</span><span style="color: #008000;">'d'</span><span style="color: #0000FF;">?</span><span style="color: #000000;">default_dec</span><span style="color: #0000FF;">:</span><span style="color: #000000;">default_enc</span><span style="color: #0000FF;">),</span> |
|||
<span style="color: #000000;">otp</span> <span style="color: #0000FF;">=</span> <span style="color: #008080;">iff</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">dflt</span><span style="color: #0000FF;">)?</span><span style="color: #008000;">"OTP ("</span><span style="color: #0000FF;">&</span><span style="color: #000000;">dflt</span><span style="color: #0000FF;">&</span><span style="color: #008000;">"):"</span><span style="color: #0000FF;">:</span><span style="color: #008000;">"OTP:"</span><span style="color: #0000FF;">),</span> |
|||
<span style="color: #000000;">efile</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">prompt_string</span><span style="color: #0000FF;">(</span><span style="color: #000000;">otp</span><span style="color: #0000FF;">)</span> |
|||
<span style="color: #008080;">if</span> <span style="color: #000000;">efile</span><span style="color: #0000FF;">=</span><span style="color: #008000;">""</span> <span style="color: #008080;">then</span> <span style="color: #000000;">efile</span><span style="color: #0000FF;">=</span><span style="color: #000000;">dflt</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
<span style="color: #008080;">if</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">efile</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span> |
|||
<span style="color: #008080;">if</span> <span style="color: #008080;">not</span> <span style="color: #7060A8;">find</span><span style="color: #0000FF;">(</span><span style="color: #008000;">'.'</span><span style="color: #0000FF;">,</span><span style="color: #000000;">efile</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span> <span style="color: #000000;">efile</span> <span style="color: #0000FF;">&=</span> <span style="color: #008000;">".1t"</span><span style="color: #0000FF;">&</span><span style="color: #000000;">de</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
<span style="color: #004080;">integer</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">size</span><span style="color: #0000FF;">,</span><span style="color: #000000;">used</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">size_used</span><span style="color: #0000FF;">(</span><span style="color: #000000;">efile</span><span style="color: #0000FF;">)</span> |
|||
<span style="color: #008080;">if</span> <span style="color: #000000;">size</span><span style="color: #0000FF;">=-</span><span style="color: #000000;">1</span> <span style="color: #008080;">or</span> <span style="color: #000000;">used</span><span style="color: #0000FF;">=-</span><span style="color: #000000;">1</span> <span style="color: #008080;">then</span> |
|||
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"File %s cannot be opened\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">efile</span><span style="color: #0000FF;">})</span> |
|||
<span style="color: #008080;">elsif</span> <span style="color: #000000;">used</span><span style="color: #0000FF;">+</span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">text</span><span style="color: #0000FF;">)></span><span style="color: #000000;">size</span> <span style="color: #008080;">then</span> |
|||
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"OTP exhausted (%d>%d)\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">used</span><span style="color: #0000FF;">+</span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">text</span><span style="color: #0000FF;">),</span><span style="color: #000000;">size</span><span style="color: #0000FF;">})</span> |
|||
<span style="color: #008080;">else</span> |
|||
<span style="color: #000000;">efile</span><span style="color: #0000FF;">[$]</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">'p'</span> |
|||
<span style="color: #004080;">integer</span> <span style="color: #000000;">fn</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">open</span><span style="color: #0000FF;">(</span><span style="color: #000000;">efile</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"rb"</span><span style="color: #0000FF;">)</span> |
|||
<span style="color: #008080;">if</span> <span style="color: #7060A8;">seek</span><span style="color: #0000FF;">(</span><span style="color: #000000;">fn</span><span style="color: #0000FF;">,</span><span style="color: #000000;">used</span><span style="color: #0000FF;">)!=</span><span style="color: #004600;">SEEK_OK</span> <span style="color: #008080;">then</span> |
|||
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"Error in seek(%s,%d)\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">efile</span><span style="color: #0000FF;">,</span><span style="color: #000000;">fn</span><span style="color: #0000FF;">})</span> |
|||
<span style="color: #000000;">text</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">""</span> |
|||
<span style="color: #008080;">else</span> |
|||
<span style="color: #000000;">msg</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">get_bytes</span><span style="color: #0000FF;">(</span><span style="color: #000000;">fn</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">text</span><span style="color: #0000FF;">))</span> |
|||
<span style="color: #000000;">msg</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">sq_xor_bits</span><span style="color: #0000FF;">(</span><span style="color: #000000;">msg</span><span style="color: #0000FF;">,</span><span style="color: #000000;">text</span><span style="color: #0000FF;">)</span> |
|||
<span style="color: #008080;">if</span> <span style="color: #000000;">de</span><span style="color: #0000FF;">=</span><span style="color: #008000;">'e'</span> <span style="color: #008080;">then</span> |
|||
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"Encrypted:\n"</span><span style="color: #0000FF;">)</span> |
|||
<span style="color: #000000;">dump_hex</span><span style="color: #0000FF;">(</span><span style="color: #000000;">msg</span><span style="color: #0000FF;">)</span> |
|||
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"\n\n"</span><span style="color: #0000FF;">)</span> |
|||
<span style="color: #008080;">else</span> |
|||
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"Decrypted: %s\n\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">msg</span><span style="color: #0000FF;">})</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
<span style="color: #7060A8;">close</span><span style="color: #0000FF;">(</span><span style="color: #000000;">fn</span><span style="color: #0000FF;">)</span> |
|||
<span style="color: #000000;">efile</span><span style="color: #0000FF;">[$]</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">de</span> |
|||
<span style="color: #008080;">if</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">text</span><span style="color: #0000FF;">)!=</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span> |
|||
<span style="color: #0000FF;">{}</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">size_used</span><span style="color: #0000FF;">(</span><span style="color: #000000;">efile</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">used</span><span style="color: #0000FF;">+</span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">text</span><span style="color: #0000FF;">))</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
<span style="color: #000000;">dump_file</span><span style="color: #0000FF;">(</span><span style="color: #000000;">efile</span><span style="color: #0000FF;">)</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">procedure</span> |
|||
<span style="color: #004080;">string</span> <span style="color: #000000;">last_file</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">""</span> |
|||
<span style="color: #008080;">procedure</span> <span style="color: #000000;">crypt_file</span><span style="color: #0000FF;">(</span><span style="color: #004080;">integer</span> <span style="color: #000000;">de</span><span style="color: #0000FF;">)</span> |
|||
<span style="color: #004080;">string</span> <span style="color: #000000;">file</span> <span style="color: #0000FF;">=</span> <span style="color: #008080;">iff</span><span style="color: #0000FF;">(</span><span style="color: #000000;">de</span><span style="color: #0000FF;">=</span><span style="color: #008000;">'d'</span> <span style="color: #008080;">and</span> <span style="color: #000000;">last_file</span><span style="color: #0000FF;">!=</span><span style="color: #008000;">""</span><span style="color: #0000FF;">?</span><span style="color: #008000;">"file ("</span><span style="color: #0000FF;">&</span><span style="color: #000000;">last_file</span><span style="color: #0000FF;">&</span><span style="color: #008000;">"):"</span><span style="color: #0000FF;">:</span><span style="color: #008000;">"file:"</span><span style="color: #0000FF;">),</span> |
|||
<span style="color: #000000;">filename</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">prompt_string</span><span style="color: #0000FF;">(</span><span style="color: #000000;">file</span><span style="color: #0000FF;">)</span> |
|||
<span style="color: #008080;">if</span> <span style="color: #000000;">de</span><span style="color: #0000FF;">=</span><span style="color: #008000;">'d'</span> <span style="color: #008080;">and</span> <span style="color: #000000;">filename</span><span style="color: #0000FF;">=</span><span style="color: #008000;">""</span> <span style="color: #008080;">then</span> <span style="color: #000000;">filename</span><span style="color: #0000FF;">=</span><span style="color: #000000;">last_file</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
<span style="color: #008080;">if</span> <span style="color: #000000;">filename</span><span style="color: #0000FF;">=</span><span style="color: #008000;">""</span> <span style="color: #008080;">then</span> <span style="color: #008080;">return</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
<span style="color: #008080;">if</span> <span style="color: #008080;">not</span> <span style="color: #7060A8;">file_exists</span><span style="color: #0000FF;">(</span><span style="color: #000000;">filename</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span> |
|||
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"The file %s does not exist\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">filename</span><span style="color: #0000FF;">})</span> |
|||
<span style="color: #008080;">return</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
<span style="color: #004080;">atom</span> <span style="color: #000000;">filesize</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">get_file_size</span><span style="color: #0000FF;">(</span><span style="color: #000000;">filename</span><span style="color: #0000FF;">)</span> |
|||
<span style="color: #004080;">integer</span> <span style="color: #000000;">fn</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">open</span><span style="color: #0000FF;">(</span><span style="color: #000000;">filename</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"rb"</span><span style="color: #0000FF;">)</span> |
|||
<span style="color: #008080;">if</span> <span style="color: #000000;">fn</span><span style="color: #0000FF;">=-</span><span style="color: #000000;">1</span> <span style="color: #008080;">then</span> |
|||
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"error opening %s\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">filename</span><span style="color: #0000FF;">})</span> |
|||
<span style="color: #008080;">return</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
<span style="color: #004080;">sequence</span> <span style="color: #000000;">bytes</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">get_bytes</span><span style="color: #0000FF;">(</span><span style="color: #000000;">fn</span><span style="color: #0000FF;">,</span><span style="color: #000000;">filesize</span><span style="color: #0000FF;">)</span> |
|||
<span style="color: #7060A8;">close</span><span style="color: #0000FF;">(</span><span style="color: #000000;">fn</span><span style="color: #0000FF;">)</span> |
|||
<span style="color: #008080;">if</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">bytes</span><span style="color: #0000FF;">)!=</span><span style="color: #000000;">filesize</span> <span style="color: #008080;">then</span> <span style="color: #0000FF;">?</span><span style="color: #000000;">9</span><span style="color: #0000FF;">/</span><span style="color: #000000;">0</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span> <span style="color: #000080;font-style:italic;">-- uh?</span> |
|||
<span style="color: #008080;">if</span> <span style="color: #000000;">de</span><span style="color: #0000FF;">=</span><span style="color: #008000;">'e'</span> <span style="color: #008080;">then</span> |
|||
<span style="color: #000000;">dump_file</span><span style="color: #0000FF;">(</span><span style="color: #000000;">filename</span><span style="color: #0000FF;">,</span> <span style="color: #004600;">true</span><span style="color: #0000FF;">)</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
<span style="color: #004080;">string</span> <span style="color: #000000;">outfile</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">prompt_string</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"output:"</span><span style="color: #0000FF;">)</span> |
|||
<span style="color: #008080;">if</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">outfile</span><span style="color: #0000FF;">)=</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span> <span style="color: #008080;">return</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
<span style="color: #004080;">integer</span> <span style="color: #000000;">outfn</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">open</span><span style="color: #0000FF;">(</span><span style="color: #000000;">outfile</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"wb"</span><span style="color: #0000FF;">)</span> |
|||
<span style="color: #008080;">if</span> <span style="color: #000000;">outfn</span><span style="color: #0000FF;">=-</span><span style="color: #000000;">1</span> <span style="color: #008080;">then</span> |
|||
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"error opening output file %s\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">outfile</span><span style="color: #0000FF;">})</span> |
|||
<span style="color: #008080;">return</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
<span style="color: #004080;">string</span> <span style="color: #000000;">dflt</span> <span style="color: #0000FF;">=</span> <span style="color: #008080;">iff</span><span style="color: #0000FF;">(</span><span style="color: #000000;">de</span><span style="color: #0000FF;">=</span><span style="color: #008000;">'d'</span><span style="color: #0000FF;">?</span><span style="color: #000000;">default_dec</span><span style="color: #0000FF;">:</span><span style="color: #000000;">default_enc</span><span style="color: #0000FF;">),</span> |
|||
<span style="color: #000000;">otp</span> <span style="color: #0000FF;">=</span> <span style="color: #008080;">iff</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">dflt</span><span style="color: #0000FF;">)?</span><span style="color: #008000;">"OTP ("</span><span style="color: #0000FF;">&</span><span style="color: #000000;">dflt</span><span style="color: #0000FF;">&</span><span style="color: #008000;">"):"</span><span style="color: #0000FF;">:</span><span style="color: #008000;">"OTP:"</span><span style="color: #0000FF;">),</span> |
|||
<span style="color: #000000;">efile</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">prompt_string</span><span style="color: #0000FF;">(</span><span style="color: #000000;">otp</span><span style="color: #0000FF;">)</span> |
|||
<span style="color: #008080;">if</span> <span style="color: #000000;">efile</span><span style="color: #0000FF;">=</span><span style="color: #008000;">""</span> <span style="color: #008080;">then</span> <span style="color: #000000;">efile</span><span style="color: #0000FF;">=</span><span style="color: #000000;">dflt</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
<span style="color: #008080;">if</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">efile</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span> |
|||
<span style="color: #008080;">if</span> <span style="color: #008080;">not</span> <span style="color: #7060A8;">find</span><span style="color: #0000FF;">(</span><span style="color: #008000;">'.'</span><span style="color: #0000FF;">,</span><span style="color: #000000;">efile</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span> <span style="color: #000000;">efile</span> <span style="color: #0000FF;">&=</span> <span style="color: #008000;">".1t"</span><span style="color: #0000FF;">&</span><span style="color: #000000;">de</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
<span style="color: #004080;">integer</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">size</span><span style="color: #0000FF;">,</span><span style="color: #000000;">used</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">size_used</span><span style="color: #0000FF;">(</span><span style="color: #000000;">efile</span><span style="color: #0000FF;">)</span> |
|||
<span style="color: #008080;">if</span> <span style="color: #000000;">size</span><span style="color: #0000FF;">=-</span><span style="color: #000000;">1</span> <span style="color: #008080;">or</span> <span style="color: #000000;">used</span><span style="color: #0000FF;">=-</span><span style="color: #000000;">1</span> <span style="color: #008080;">then</span> |
|||
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"File %s cannot be opened\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">efile</span><span style="color: #0000FF;">})</span> |
|||
<span style="color: #008080;">elsif</span> <span style="color: #000000;">used</span><span style="color: #0000FF;">+</span><span style="color: #000000;">filesize</span><span style="color: #0000FF;">></span><span style="color: #000000;">size</span> <span style="color: #008080;">then</span> |
|||
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"OTP exhausted (%d>%d)\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">used</span><span style="color: #0000FF;">+</span><span style="color: #000000;">filesize</span><span style="color: #0000FF;">,</span><span style="color: #000000;">size</span><span style="color: #0000FF;">})</span> |
|||
<span style="color: #008080;">else</span> |
|||
<span style="color: #000000;">efile</span><span style="color: #0000FF;">[$]</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">'p'</span> |
|||
<span style="color: #000000;">fn</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">open</span><span style="color: #0000FF;">(</span><span style="color: #000000;">efile</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"rb"</span><span style="color: #0000FF;">)</span> |
|||
<span style="color: #008080;">if</span> <span style="color: #7060A8;">seek</span><span style="color: #0000FF;">(</span><span style="color: #000000;">fn</span><span style="color: #0000FF;">,</span><span style="color: #000000;">used</span><span style="color: #0000FF;">)!=</span><span style="color: #004600;">SEEK_OK</span> <span style="color: #008080;">then</span> |
|||
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"Error in seek(%s,%d)\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">efile</span><span style="color: #0000FF;">,</span><span style="color: #000000;">fn</span><span style="color: #0000FF;">})</span> |
|||
<span style="color: #000000;">filesize</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span> |
|||
<span style="color: #008080;">else</span> |
|||
<span style="color: #000000;">msg</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">get_bytes</span><span style="color: #0000FF;">(</span><span style="color: #000000;">fn</span><span style="color: #0000FF;">,</span><span style="color: #000000;">filesize</span><span style="color: #0000FF;">)</span> |
|||
<span style="color: #000000;">msg</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">sq_xor_bits</span><span style="color: #0000FF;">(</span><span style="color: #000000;">msg</span><span style="color: #0000FF;">,</span><span style="color: #000000;">bytes</span><span style="color: #0000FF;">)</span> |
|||
<span style="color: #7060A8;">puts</span><span style="color: #0000FF;">(</span><span style="color: #000000;">outfn</span><span style="color: #0000FF;">,</span><span style="color: #000000;">msg</span><span style="color: #0000FF;">)</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
<span style="color: #7060A8;">close</span><span style="color: #0000FF;">(</span><span style="color: #000000;">fn</span><span style="color: #0000FF;">)</span> |
|||
<span style="color: #7060A8;">close</span><span style="color: #0000FF;">(</span><span style="color: #000000;">outfn</span><span style="color: #0000FF;">)</span> |
|||
<span style="color: #000000;">efile</span><span style="color: #0000FF;">[$]</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">de</span> |
|||
<span style="color: #008080;">if</span> <span style="color: #000000;">filesize</span><span style="color: #0000FF;">!=</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span> |
|||
<span style="color: #0000FF;">{}</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">size_used</span><span style="color: #0000FF;">(</span><span style="color: #000000;">efile</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">used</span><span style="color: #0000FF;">+</span><span style="color: #000000;">filesize</span><span style="color: #0000FF;">)</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
<span style="color: #008080;">if</span> <span style="color: #000000;">de</span><span style="color: #0000FF;">=</span><span style="color: #008000;">'d'</span> <span style="color: #008080;">then</span> |
|||
<span style="color: #000000;">dump_file</span><span style="color: #0000FF;">(</span><span style="color: #000000;">outfile</span><span style="color: #0000FF;">,</span> <span style="color: #004600;">true</span><span style="color: #0000FF;">)</span> |
|||
<span style="color: #008080;">else</span> |
|||
<span style="color: #000000;">last_file</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">outfile</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
<span style="color: #000000;">dump_file</span><span style="color: #0000FF;">(</span><span style="color: #000000;">efile</span><span style="color: #0000FF;">)</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">procedure</span> |
|||
<span style="color: #000000;">list_one_time_pads</span><span style="color: #0000FF;">(</span><span style="color: #000000;">set_default</span><span style="color: #0000FF;">:=</span><span style="color: #004600;">true</span><span style="color: #0000FF;">)</span> |
|||
<span style="color: #000080;font-style:italic;">-- note: the trailing space after the opening """ is deliberate:</span> |
|||
<span style="color: #008080;">constant</span> <span style="color: #000000;">menu_txt</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">""" |
|||
1. List one time pad files. |
|||
2. Create one time pad file. |
|||
3. Delete one time pad file. |
|||
4. Encrypt plain text. |
|||
5. Decrypt cipher text. |
|||
6. Encrypt file. |
|||
7. Decrypt file. |
|||
8. Quit program. |
|||
Your choice (1 to 8) : """</span> |
|||
<span style="color: #008080;">while</span> <span style="color: #000000;">1</span> <span style="color: #008080;">do</span> |
|||
<span style="color: #004080;">integer</span> <span style="color: #000000;">choice</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">prompt_number</span><span style="color: #0000FF;">(</span><span style="color: #000000;">menu_txt</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">8</span><span style="color: #0000FF;">})</span> |
|||
<span style="color: #008080;">switch</span> <span style="color: #000000;">choice</span> <span style="color: #008080;">do</span> |
|||
<span style="color: #008080;">case</span> <span style="color: #000000;">1</span><span style="color: #0000FF;">:</span> <span style="color: #000000;">list_one_time_pads</span><span style="color: #0000FF;">()</span> |
|||
<span style="color: #008080;">case</span> <span style="color: #000000;">2</span><span style="color: #0000FF;">:</span> <span style="color: #000000;">create_one_time_pad</span><span style="color: #0000FF;">()</span> |
|||
<span style="color: #008080;">case</span> <span style="color: #000000;">3</span><span style="color: #0000FF;">:</span> <span style="color: #000000;">delete_one_time_pad</span><span style="color: #0000FF;">()</span> |
|||
<span style="color: #008080;">case</span> <span style="color: #000000;">4</span><span style="color: #0000FF;">:</span> <span style="color: #000000;">crypt_text</span><span style="color: #0000FF;">(</span><span style="color: #008000;">'e'</span><span style="color: #0000FF;">)</span> |
|||
<span style="color: #008080;">case</span> <span style="color: #000000;">5</span><span style="color: #0000FF;">:</span> <span style="color: #000000;">crypt_text</span><span style="color: #0000FF;">(</span><span style="color: #008000;">'d'</span><span style="color: #0000FF;">)</span> |
|||
<span style="color: #008080;">case</span> <span style="color: #000000;">6</span><span style="color: #0000FF;">:</span> <span style="color: #000000;">crypt_file</span><span style="color: #0000FF;">(</span><span style="color: #008000;">'e'</span><span style="color: #0000FF;">)</span> |
|||
<span style="color: #008080;">case</span> <span style="color: #000000;">7</span><span style="color: #0000FF;">:</span> <span style="color: #000000;">crypt_file</span><span style="color: #0000FF;">(</span><span style="color: #008000;">'d'</span><span style="color: #0000FF;">)</span> |
|||
<span style="color: #008080;">case</span> <span style="color: #000000;">8</span><span style="color: #0000FF;">:</span> <span style="color: #008080;">exit</span> |
|||
<span style="color: #008080;">default</span> <span style="color: #0000FF;">:</span><span style="color: #7060A8;">puts</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"not implemented...\n"</span><span style="color: #0000FF;">)</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">switch</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">while</span> |
|||
<!--</lang>--> |
|||
procedure list_one_time_pads(bool set_default=false) |
|||
puts(1,"\n") |
|||
sequence d = dir("*.1t?") |
|||
if d={} then |
|||
printf(1,"No one time pad files found.\n") |
|||
return |
|||
elsif set_default then |
|||
sequence bases = {}, |
|||
types = {{},{},{}} -- p/e/d |
|||
for i=1 to length(d) do |
|||
string name = d[i][D_NAME] |
|||
integer dot = find('.',name) |
|||
if dot!=0 then |
|||
string base = name[1..dot-1], |
|||
ext = name[dot+1..$] |
|||
integer e = find(ext,{"1tp","1te","1td"}) |
|||
if e!=0 then |
|||
integer k = find(base,bases) |
|||
if k=0 then |
|||
bases = append(bases,base) |
|||
k = length(bases) |
|||
end if |
|||
types[e] &= k |
|||
end if |
|||
end if |
|||
end for |
|||
default_enc = iff(length(types[2])=1?bases[types[2][1]]&".1te":"") |
|||
default_dec = iff(length(types[3])=1?bases[types[3][1]]&".1td":"") |
|||
else |
|||
for i=1 to length(d) do |
|||
sequence di = d[i] |
|||
string name = di[D_NAME], |
|||
info = iff(name[$]='p'?sprintf("Size: %d",di[D_SIZE]) |
|||
:sprintf("Size: %d, Used: %d",size_used(name))) |
|||
printf(1,"%s Created: %02d/%02d/%04d, %s\n", |
|||
{name,di[D_DAY],di[D_MONTH],di[D_YEAR],info}) |
|||
end for |
|||
end if |
|||
end procedure |
|||
procedure dump_hex(sequence s) |
|||
if length(s)=0 then |
|||
printf(1,"{}\n") |
|||
else |
|||
for i=1 to length(s) do |
|||
printf(1,"%02x%c",{s[i],iff(mod(i,16)=0?'\n':' ')}) |
|||
end for |
|||
end if |
|||
end procedure |
|||
procedure dump_file(string file, bool ashex=false) |
|||
printf(1,"The contents of %s:\n\n",{file}) |
|||
if match(".1tp",file) or ashex then |
|||
integer fn = open(file,"rb") |
|||
dump_hex(get_bytes(fn, 64)) |
|||
close(fn) |
|||
puts(1,iff(get_file_size(file)>64?"...\n\n","\n")) |
|||
else |
|||
puts(1,join(read_lines(file),"\n")&"\n") |
|||
end if |
|||
end procedure |
|||
procedure create_one_time_pad() |
|||
string filename = prompt_string("OTP file name to create (without extension):") |
|||
if find('.',filename) then |
|||
puts(1,"extension not allowed\n") |
|||
elsif filename!="" then |
|||
string pfile = filename&".1tp", |
|||
efile = filename&".1te", |
|||
dfile = filename&".1td" |
|||
if file_exists(pfile) then |
|||
string del = lower(prompt_string("File already exists - delete?:")) |
|||
if not find(del,{"y","yes"}) then return end if |
|||
if not delete_file(pfile) then |
|||
printf(1,"error deleting %s\n",{pfile}) |
|||
return |
|||
end if |
|||
end if |
|||
string comment = prompt_string("comment (optional):") |
|||
integer filesize |
|||
while 1 do |
|||
string sizestr = prompt_string("file size (1MB):") |
|||
sequence res = iff(sizestr=""?{{1,"MB"}}:scanf(sizestr,"%d%s")) |
|||
if length(res)=1 then |
|||
integer k = find(upper(res[1][2]),{"","K","KB","M","MB","G","GB"}) |
|||
if k!=0 then |
|||
k = {1,1024,1024*1024,1024*1204}[floor(k/2)+1] |
|||
filesize = res[1][1]*k |
|||
exit |
|||
end if |
|||
printf(1,"unknown suffix:%s - use K|M|G or KB|MB|GB\n",{res[1][2]}) |
|||
end if |
|||
end while |
|||
printf(1,"Creating %s (%d bytes)\n",{pfile,filesize}) |
|||
integer fn = open(pfile,"wb") |
|||
if fn=-1 then |
|||
printf(1,"error opening %s\n",{pfile}) |
|||
return |
|||
end if |
|||
for i=1 to filesize do |
|||
puts(fn,rand(256)-1) |
|||
end for |
|||
close(fn) |
|||
fn = open(efile,"w") |
|||
if fn=-1 then |
|||
printf(1,"error opening %s\n",{efile}) |
|||
return |
|||
end if |
|||
printf(fn,"# OTP file\n# %s\nSize: %d\nUsed: 0\n",{comment,filesize}) |
|||
close(fn) |
|||
if not copy_file(efile,dfile,true) then |
|||
printf(1,"error copying %s to %s\n",{efile,dfile}) |
|||
return |
|||
end if |
|||
printf(1,"\n%s and %s and %s have been created in the current directory.\n\n", |
|||
{pfile,efile,dfile}) |
|||
dump_file(pfile) |
|||
dump_file(efile) |
|||
default_enc = efile |
|||
default_dec = dfile |
|||
end if |
|||
end procedure |
|||
procedure delete_one_time_pad() |
|||
string filename = prompt_string("OTP file name to delete (without extension):") |
|||
if find('.',filename) then |
|||
puts(1,"extension not allowed\n") |
|||
elsif filename!="" then |
|||
string efile = filename&".1te", |
|||
dfile = filename&".1td" |
|||
filename &= ".1tp" |
|||
if not file_exists(filename) then |
|||
printf(1,"file %s found\n",{filename}) |
|||
return |
|||
end if |
|||
string del = lower(prompt_string("Delete file - are you sure?:")) |
|||
if not find(del,{"y","yes"}) then |
|||
printf(1,"file not deleted\n") |
|||
return |
|||
end if |
|||
if not delete_file(filename) then |
|||
printf(1,"error deleting %s\n",{filename}) |
|||
return |
|||
end if |
|||
integer c = 1 |
|||
c += delete_file(efile) |
|||
c += delete_file(dfile) |
|||
printf(1,"%d file%s successfully deleted.\n",{c,iff(c=1?"":"s")}) |
|||
if default_enc=efile then default_enc = "" end if |
|||
if default_dec=dfile then default_dec = "" end if |
|||
end if |
|||
end procedure |
|||
sequence msg = {} |
|||
procedure crypt_text(integer de) |
|||
sequence text = iff(de='d'?msg:prompt_string("message:")) |
|||
string dflt = iff(de='d'?default_dec:default_enc), |
|||
otp = iff(length(dflt)?"OTP ("&dflt&"):":"OTP:"), |
|||
efile = prompt_string(otp) |
|||
if efile="" then efile=dflt end if |
|||
if length(efile) then |
|||
if not find('.',efile) then efile &= ".1t"&de end if |
|||
integer {size,used} = size_used(efile) |
|||
if size=-1 or used=-1 then |
|||
printf(1,"File %s cannot be opened\n",{efile}) |
|||
elsif used+length(text)>size then |
|||
printf(1,"OTP exhausted (%d>%d)\n",{used+length(text),size}) |
|||
else |
|||
efile[$] = 'p' |
|||
integer fn = open(efile,"rb") |
|||
if seek(fn,used)!=SEEK_OK then |
|||
printf(1,"Error in seek(%s,%d)\n",{efile,fn}) |
|||
text = "" |
|||
else |
|||
msg = get_bytes(fn,length(text)) |
|||
msg = sq_xor_bits(msg,text) |
|||
if de='e' then |
|||
printf(1,"Encrypted:\n") |
|||
dump_hex(msg) |
|||
printf(1,"\n\n") |
|||
else |
|||
printf(1,"Decrypted: %s\n\n",{msg}) |
|||
end if |
|||
end if |
|||
close(fn) |
|||
efile[$] = de |
|||
if length(text)!=0 then |
|||
{} = size_used(efile, used+length(text)) |
|||
end if |
|||
dump_file(efile) |
|||
end if |
|||
end if |
|||
end procedure |
|||
string last_file = "" |
|||
procedure crypt_file(integer de) |
|||
string file = iff(de='d' and last_file!=""?"file ("&last_file&"):":"file:"), |
|||
filename = prompt_string(file) |
|||
if de='d' and filename="" then filename=last_file end if |
|||
if filename="" then return end if |
|||
if not file_exists(filename) then |
|||
printf(1,"The file %s does not exist\n",{filename}) |
|||
return |
|||
end if |
|||
atom filesize = get_file_size(filename) |
|||
integer fn = open(filename,"rb") |
|||
if fn=-1 then |
|||
printf(1,"error opening %s\n",{filename}) |
|||
return |
|||
end if |
|||
sequence bytes = get_bytes(fn,filesize) |
|||
close(fn) |
|||
if length(bytes)!=filesize then ?9/0 end if -- uh? |
|||
if de='e' then |
|||
dump_file(filename, true) |
|||
end if |
|||
string outfile = prompt_string("output:") |
|||
if length(outfile)=0 then return end if |
|||
integer outfn = open(outfile,"wb") |
|||
if outfn=-1 then |
|||
printf(1,"error opening output file %s\n",{outfile}) |
|||
return |
|||
end if |
|||
string dflt = iff(de='d'?default_dec:default_enc), |
|||
otp = iff(length(dflt)?"OTP ("&dflt&"):":"OTP:"), |
|||
efile = prompt_string(otp) |
|||
if efile="" then efile=dflt end if |
|||
if length(efile) then |
|||
if not find('.',efile) then efile &= ".1t"&de end if |
|||
integer {size,used} = size_used(efile) |
|||
if size=-1 or used=-1 then |
|||
printf(1,"File %s cannot be opened\n",{efile}) |
|||
elsif used+filesize>size then |
|||
printf(1,"OTP exhausted (%d>%d)\n",{used+filesize,size}) |
|||
else |
|||
efile[$] = 'p' |
|||
fn = open(efile,"rb") |
|||
if seek(fn,used)!=SEEK_OK then |
|||
printf(1,"Error in seek(%s,%d)\n",{efile,fn}) |
|||
filesize = 0 |
|||
else |
|||
msg = get_bytes(fn,filesize) |
|||
msg = sq_xor_bits(msg,bytes) |
|||
puts(outfn,msg) |
|||
end if |
|||
close(fn) |
|||
close(outfn) |
|||
efile[$] = de |
|||
if filesize!=0 then |
|||
{} = size_used(efile, used+filesize) |
|||
end if |
|||
if de='d' then |
|||
dump_file(outfile, true) |
|||
else |
|||
last_file = outfile |
|||
end if |
|||
dump_file(efile) |
|||
end if |
|||
end if |
|||
end procedure |
|||
list_one_time_pads(set_default:=true) |
|||
-- note: the trailing space after the opening """ is deliberate: |
|||
constant menu_txt = """ |
|||
1. List one time pad files. |
|||
2. Create one time pad file. |
|||
3. Delete one time pad file. |
|||
4. Encrypt plain text. |
|||
5. Decrypt cipher text. |
|||
6. Encrypt file. |
|||
7. Decrypt file. |
|||
8. Quit program. |
|||
Your choice (1 to 8) : """ |
|||
while 1 do |
|||
integer choice = prompt_number(menu_txt,{1,8}) |
|||
switch choice do |
|||
case 1: list_one_time_pads() |
|||
case 2: create_one_time_pad() |
|||
case 3: delete_one_time_pad() |
|||
case 4: crypt_text('e') |
|||
case 5: crypt_text('d') |
|||
case 6: crypt_file('e') |
|||
case 7: crypt_file('d') |
|||
case 8: exit |
|||
default :puts(1,"not implemented...\n") |
|||
end switch |
|||
end while</lang> |
|||
{{out}} |
{{out}} |
||
Sample session. Similar to Kotlin, menu display/selection has been shorted to <menu N. Xxxx.><br> |
Sample session. Similar to Kotlin, menu display/selection has been shorted to <menu N. Xxxx.><br> |
Revision as of 14:20, 31 March 2021
Phix
A simple xor-based one time pad that allows any file to be encrypted and decrypted,
since it seems silly to limit this to plaintext.
The one time pad files are therefore binary rather than plain text, with comments
and used counts in separate .1te/.1td files, rather than #/- in the .1tp itself.
Uses a trivial xor rather than a Vigenere cipher, since the latter adds nothing.
Ignores the "true random numbers, eg from /dev/random" part, especially since the
wikipedia page cites /dev/random as potentially unsuitable for cryptographic use.
Instead this just uses the builtin rand(): for better security I might suggest you
replace that, possibly with several different (pseudo) random number generators.
The dump feature is only for testing, obviously, as is decrypt defaulting to the last encrypted message/file/pad. Note however that .1te/.1td handling is not: if you try to make a one time pad "bi-directional", then not only would there be some confusion and re-alignment issues should both parties send a message at the same time, but two messages encrypted with the same part of the one time pad severely weakens the security of those two messages. To prevent that, delete/do not share the .1te or .1td file, and it will not allow encryption/decryption respectively.
Note that options 4 (Encrypt plain text) and 5 (Decrypt cipher text) are also only suitable for testing: you cannot actually enter anything for option 5, it just decodes whatever was last encoded by option 4, however it would be trivial to store the output of option 4 in a file and send that, and the recipient would then decode it using option 7 (Decrypt file).
TIP: if a message gets lost, or you quit without decrypting something, then edit the recipient's .1td file manually, so that Used matches the sender's .1te file.
string default_enc = "", default_dec = "" function size_used(string name, integer now_used=0) object txt = read_lines(name) if sequence(txt) then integer size, used for i=1 to length(txt) do if match("Size",txt[i])=1 then {{size}} = scanf(txt[i],"Size: %d") elsif match("Used",txt[i])=1 then if now_used=0 then {{used}} = scanf(txt[i],"Used: %d") return {size,used} else txt[i] = sprintf("Used: %d",now_used) if not write_lines(name,txt) then printf(1,"error updating %s\n",{name}) end if return 1 end if end if end for end if return {-1,-1} end function procedure list_one_time_pads(bool set_default=false) puts(1,"\n") sequence d = dir("*.1t?") if d={} then printf(1,"No one time pad files found.\n") return elsif set_default then sequence bases = {}, types = {{},{},{}} -- p/e/d for i=1 to length(d) do string name = d[i][D_NAME] integer dot = find('.',name) if dot!=0 then string base = name[1..dot-1], ext = name[dot+1..$] integer e = find(ext,{"1tp","1te","1td"}) if e!=0 then integer k = find(base,bases) if k=0 then bases = append(bases,base) k = length(bases) end if types[e] &= k end if end if end for default_enc = iff(length(types[2])=1?bases[types[2][1]]&".1te":"") default_dec = iff(length(types[3])=1?bases[types[3][1]]&".1td":"") else for i=1 to length(d) do sequence di = d[i] string name = di[D_NAME], info = iff(name[$]='p'?sprintf("Size: %d",di[D_SIZE]) :sprintf("Size: %d, Used: %d",size_used(name))) printf(1,"%s Created: %02d/%02d/%04d, %s\n", {name,di[D_DAY],di[D_MONTH],di[D_YEAR],info}) end for end if end procedure procedure dump_hex(sequence s) if length(s)=0 then printf(1,"{}\n") else for i=1 to length(s) do printf(1,"%02x%c",{s[i],iff(mod(i,16)=0?'\n':' ')}) end for end if end procedure procedure dump_file(string file, bool ashex=false) printf(1,"The contents of %s:\n\n",{file}) if match(".1tp",file) or ashex then integer fn = open(file,"rb") dump_hex(get_bytes(fn, 64)) close(fn) puts(1,iff(get_file_size(file)>64?"...\n\n","\n")) else puts(1,join(read_lines(file),"\n")&"\n") end if end procedure procedure create_one_time_pad() string filename = prompt_string("OTP file name to create (without extension):") if find('.',filename) then puts(1,"extension not allowed\n") elsif filename!="" then string pfile = filename&".1tp", efile = filename&".1te", dfile = filename&".1td" if file_exists(pfile) then string del = lower(prompt_string("File already exists - delete?:")) if not find(del,{"y","yes"}) then return end if if not delete_file(pfile) then printf(1,"error deleting %s\n",{pfile}) return end if end if string comment = prompt_string("comment (optional):") integer filesize while 1 do string sizestr = prompt_string("file size (1MB):") sequence res = iff(sizestr=""?{{1,"MB"}}:scanf(sizestr,"%d%s")) if length(res)=1 then integer k = find(upper(res[1][2]),{"","K","KB","M","MB","G","GB"}) if k!=0 then k = {1,1024,1024*1024,1024*1204}[floor(k/2)+1] filesize = res[1][1]*k exit end if printf(1,"unknown suffix:%s - use K|M|G or KB|MB|GB\n",{res[1][2]}) end if end while printf(1,"Creating %s (%d bytes)\n",{pfile,filesize}) integer fn = open(pfile,"wb") if fn=-1 then printf(1,"error opening %s\n",{pfile}) return end if for i=1 to filesize do puts(fn,rand(256)-1) end for close(fn) fn = open(efile,"w") if fn=-1 then printf(1,"error opening %s\n",{efile}) return end if printf(fn,"# OTP file\n# %s\nSize: %d\nUsed: 0\n",{comment,filesize}) close(fn) if not copy_file(efile,dfile,true) then printf(1,"error copying %s to %s\n",{efile,dfile}) return end if printf(1,"\n%s and %s and %s have been created in the current directory.\n\n", {pfile,efile,dfile}) dump_file(pfile) dump_file(efile) default_enc = efile default_dec = dfile end if end procedure procedure delete_one_time_pad() string filename = prompt_string("OTP file name to delete (without extension):") if find('.',filename) then puts(1,"extension not allowed\n") elsif filename!="" then string efile = filename&".1te", dfile = filename&".1td" filename &= ".1tp" if not file_exists(filename) then printf(1,"file %s found\n",{filename}) return end if string del = lower(prompt_string("Delete file - are you sure?:")) if not find(del,{"y","yes"}) then printf(1,"file not deleted\n") return end if if not delete_file(filename) then printf(1,"error deleting %s\n",{filename}) return end if integer c = 1 c += delete_file(efile) c += delete_file(dfile) printf(1,"%d file%s successfully deleted.\n",{c,iff(c=1?"":"s")}) if default_enc=efile then default_enc = "" end if if default_dec=dfile then default_dec = "" end if end if end procedure sequence msg = {} procedure crypt_text(integer de) sequence text = iff(de='d'?msg:prompt_string("message:")) string dflt = iff(de='d'?default_dec:default_enc), otp = iff(length(dflt)?"OTP ("&dflt&"):":"OTP:"), efile = prompt_string(otp) if efile="" then efile=dflt end if if length(efile) then if not find('.',efile) then efile &= ".1t"&de end if integer {size,used} = size_used(efile) if size=-1 or used=-1 then printf(1,"File %s cannot be opened\n",{efile}) elsif used+length(text)>size then printf(1,"OTP exhausted (%d>%d)\n",{used+length(text),size}) else efile[$] = 'p' integer fn = open(efile,"rb") if seek(fn,used)!=SEEK_OK then printf(1,"Error in seek(%s,%d)\n",{efile,fn}) text = "" else msg = get_bytes(fn,length(text)) msg = sq_xor_bits(msg,text) if de='e' then printf(1,"Encrypted:\n") dump_hex(msg) printf(1,"\n\n") else printf(1,"Decrypted: %s\n\n",{msg}) end if end if close(fn) efile[$] = de if length(text)!=0 then {} = size_used(efile, used+length(text)) end if dump_file(efile) end if end if end procedure string last_file = "" procedure crypt_file(integer de) string file = iff(de='d' and last_file!=""?"file ("&last_file&"):":"file:"), filename = prompt_string(file) if de='d' and filename="" then filename=last_file end if if filename="" then return end if if not file_exists(filename) then printf(1,"The file %s does not exist\n",{filename}) return end if atom filesize = get_file_size(filename) integer fn = open(filename,"rb") if fn=-1 then printf(1,"error opening %s\n",{filename}) return end if sequence bytes = get_bytes(fn,filesize) close(fn) if length(bytes)!=filesize then ?9/0 end if -- uh? if de='e' then dump_file(filename, true) end if string outfile = prompt_string("output:") if length(outfile)=0 then return end if integer outfn = open(outfile,"wb") if outfn=-1 then printf(1,"error opening output file %s\n",{outfile}) return end if string dflt = iff(de='d'?default_dec:default_enc), otp = iff(length(dflt)?"OTP ("&dflt&"):":"OTP:"), efile = prompt_string(otp) if efile="" then efile=dflt end if if length(efile) then if not find('.',efile) then efile &= ".1t"&de end if integer {size,used} = size_used(efile) if size=-1 or used=-1 then printf(1,"File %s cannot be opened\n",{efile}) elsif used+filesize>size then printf(1,"OTP exhausted (%d>%d)\n",{used+filesize,size}) else efile[$] = 'p' fn = open(efile,"rb") if seek(fn,used)!=SEEK_OK then printf(1,"Error in seek(%s,%d)\n",{efile,fn}) filesize = 0 else msg = get_bytes(fn,filesize) msg = sq_xor_bits(msg,bytes) puts(outfn,msg) end if close(fn) close(outfn) efile[$] = de if filesize!=0 then {} = size_used(efile, used+filesize) end if if de='d' then dump_file(outfile, true) else last_file = outfile end if dump_file(efile) end if end if end procedure list_one_time_pads(set_default:=true) -- note: the trailing space after the opening """ is deliberate: constant menu_txt = """ 1. List one time pad files. 2. Create one time pad file. 3. Delete one time pad file. 4. Encrypt plain text. 5. Decrypt cipher text. 6. Encrypt file. 7. Decrypt file. 8. Quit program. Your choice (1 to 8) : """ while 1 do integer choice = prompt_number(menu_txt,{1,8}) switch choice do case 1: list_one_time_pads() case 2: create_one_time_pad() case 3: delete_one_time_pad() case 4: crypt_text('e') case 5: crypt_text('d') case 6: crypt_file('e') case 7: crypt_file('d') case 8: exit default :puts(1,"not implemented...\n") end switch end while
- Output:
Sample session. Similar to Kotlin, menu display/selection has been shorted to <menu N. Xxxx.>
No one time pad files found. 1. List one time pad files. 2. Create one time pad file. 3. Delete one time pad file. 4. Encrypt plain text. 5. Decrypt cipher text. 6. Encrypt file. 7. Decrypt file. 8. Quit program. Your choice (1 to 8) : 2 OTP file name to create (without extension):007 comment (optional):Pussy Galore file size (1MB): Creating 007.1tp (1048576 bytes) 007.1tp and 007.1te and 007.1td have been created in the current directory. The contents of 007.1tp: C3 A1 90 B2 70 E6 A2 DD 27 F4 3C 21 48 D1 54 1C D7 7E AA 09 40 CC 49 83 F4 E3 96 86 1D 48 15 F6 A3 C2 5F 47 00 BE D1 6B 4E 4A EA 50 DB F8 62 2F D5 66 D5 0F A9 63 E6 4D 65 BB 67 70 6F 51 34 73 ... The contents of 007.1te: # OTP file # Pussy Galore Size: 1048576 Used: 0 <menu 1. List one time pad files.> 007.1td Created: 10/11/2018, Size: 1048576, Used: 0 007.1te Created: 10/11/2018, Size: 1048576, Used: 0 007.1tp Created: 10/11/2018, Size: 1048576 <menu 4. Encrypt plain text.> message:This is message 1234 OTP (007.1te): Encrypted: 97 C9 F9 C1 50 8F D1 FD 4A 91 4F 52 29 B6 31 3C E6 4C 99 3D The contents of 007.1te: # OTP file # Pussy Galore Size: 1048576 Used: 20 <menu 5. Decrypt cipher text.> OTP (007.1td): Decrypted: This is message 1234 The contents of 007.1td: # OTP file # Pussy Galore Size: 1048576 Used: 20 <menu 8. Quit program.>