$("#ray_9004").html("\n
1<\/a>
2<\/a>
3<\/a>
4<\/a>
5<\/a>
6<\/a>
7<\/a>
8<\/a>
9<\/a>
10<\/a><\/strong>
11<\/a>
12<\/a>
13<\/a>
14<\/a>
15<\/a>
16<\/a>
17<\/a>
18<\/a>
19<\/a>
20<\/a><\/strong>
21<\/a>
22<\/a>
23<\/a>
24<\/a>
25<\/a>
26<\/a>
27<\/a>
28<\/a>
29<\/a>
30<\/a><\/strong>
31<\/a>
32<\/a>
33<\/a>
34<\/a>
35<\/a>
36<\/a>
37<\/a>
38<\/a>
39<\/a>
40<\/a><\/strong>
41<\/a>
42<\/a>
43<\/a>
44<\/a>
45<\/a>
46<\/a>
47<\/a>
48<\/a><\/pre><\/td>\n  
#!/usr/bin/env ruby<\/span>
<\/span>require<\/span> <\/span>\'<\/span>securerandom<\/span>\'<\/span><\/span>
<\/span>## Parameters<\/span>
<\/span>P<\/span> <\/span>=<\/span> <\/span>115792089237316195423570985008687907853269984665640564039457584007913129639747<\/span>
<\/span>N<\/span> <\/span>=<\/span> <\/span>100<\/span>
<\/span>K<\/span> <\/span>=<\/span> <\/span>25<\/span>
<\/span>L<\/span> <\/span>=<\/span> <\/span>38<\/span> <\/span># The number of liars<\/span>
<\/span>
<\/span>def<\/span> <\/span>apply_polynomial<\/span>(<\/span>coeffs<\/span>,<\/span> <\/span>x<\/span>)<\/span>
<\/span>    <\/span>r<\/span> <\/span>=<\/span> <\/span>0<\/span>
<\/span>    <\/span>coeffs<\/span>.<\/span>inject<\/span>(<\/span>0<\/span>)<\/span> <\/span>do<\/span> <\/span>|<\/span>r<\/span>,<\/span> <\/span>c<\/span>|<\/span>
<\/span>        <\/span>r<\/span> <\/span>=<\/span> <\/span>(<\/span>r<\/span> <\/span>*<\/span> <\/span>x<\/span> <\/span>+<\/span> <\/span>c<\/span>)<\/span> <\/span>%<\/span> <\/span>P<\/span>
<\/span>    <\/span>end<\/span>
<\/span>end<\/span>
<\/span>
<\/span>def<\/span> <\/span>create_polynomial<\/span>
<\/span>    <\/span>coeff<\/span> <\/span>=<\/span> <\/span>SecureRandom<\/span>.<\/span>hex<\/span>(<\/span>64<\/span> <\/span>*<\/span> <\/span>K<\/span>)<\/span>
<\/span>    <\/span>coeff<\/span>.<\/span>chars<\/span>.<\/span>each_slice<\/span>(<\/span>128<\/span>)<\/span>.<\/span>map<\/span>{<\/span>|<\/span>a<\/span>|<\/span>a<\/span>.<\/span>join<\/span>.<\/span>to_i<\/span>(<\/span>16<\/span>)<\/span> <\/span>%<\/span> <\/span>P<\/span>}<\/span>
<\/span>end<\/span>
<\/span>
<\/span>secret<\/span> <\/span>=<\/span> <\/span>SecureRandom<\/span>.<\/span>hex<\/span>(<\/span>64<\/span>)<\/span>.<\/span>to_i<\/span>(<\/span>16<\/span>)<\/span> <\/span>%<\/span> <\/span>P<\/span>
<\/span>polynomial<\/span> <\/span>=<\/span> <\/span>create_polynomial<\/span>
<\/span>polynomial<\/span>[<\/span>-1<\/span>]<\/span> <\/span>=<\/span> <\/span>secret<\/span>
<\/span>
<\/span># Distribute Secret<\/span>
<\/span>user<\/span> <\/span>=<\/span> <\/span>Array<\/span>.<\/span>new<\/span>(<\/span>N<\/span>)<\/span> <\/span>{<\/span>|<\/span>i<\/span>|<\/span> <\/span>apply_polynomial<\/span>(<\/span>polynomial<\/span>,<\/span> <\/span>i<\/span> <\/span>+<\/span> <\/span>1<\/span>)<\/span>  <\/span>}<\/span>
<\/span>
<\/span># Some user are liars<\/span>
<\/span>[<\/span>*<\/span>0<\/span>...<\/span>N<\/span>]<\/span>.<\/span>shuffle<\/span>[<\/span>0<\/span>,<\/span> <\/span>L<\/span>]<\/span>.<\/span>each<\/span>{<\/span>|<\/span>i<\/span>|<\/span> <\/span>user<\/span>[<\/span>i<\/span>]<\/span> <\/span>=<\/span> <\/span>rand<\/span>(<\/span>P<\/span>)<\/span> <\/span>}<\/span>
<\/span>
<\/span>STDOUT<\/span>.<\/span>puts<\/span> <\/span>"<\/span>--- Distributed Secret ---<\/span>"<\/span><\/span>
<\/span>N<\/span>.<\/span>times<\/span> <\/span>do<\/span> <\/span>|<\/span>i<\/span>|<\/span>
<\/span>    <\/span>STDOUT<\/span>.<\/span>puts<\/span> <\/span>"<\/span>User <\/span>#{<\/span>i<\/span>}<\/span><\/span>: <\/span>#{<\/span>user<\/span>[<\/span>i<\/span>]<\/span>}<\/span><\/span>"<\/span><\/span>
<\/span>end<\/span>
<\/span>STDOUT<\/span>.<\/span>flush<\/span>
<\/span>STDOUT<\/span>.<\/span>puts<\/span>
<\/span>
<\/span>STDOUT<\/span>.<\/span>puts<\/span> <\/span>"<\/span>What\'s secret? <\/span>"<\/span><\/span>
<\/span>STDOUT<\/span>.<\/span>flush<\/span>
<\/span>input_secret<\/span> <\/span>=<\/span> <\/span>STDIN<\/span>.<\/span>gets<\/span>.<\/span>to_i<\/span>
<\/span>if<\/span> <\/span>input_secret<\/span> <\/span>==<\/span> <\/span>secret<\/span>
<\/span>    <\/span>STDOUT<\/span>.<\/span>puts<\/span> <\/span>"<\/span>OK. I\'ll give you the flag<\/span>"<\/span><\/span>
<\/span>    <\/span>STDOUT<\/span>.<\/span>puts<\/span> <\/span>File<\/span>.<\/span>read<\/span>(<\/span>"<\/span>flag<\/span>"<\/span><\/span>)<\/span>.<\/span>chomp<\/span>
<\/span>else<\/span>
<\/span>    <\/span>STDOUT<\/span>.<\/span>puts<\/span> <\/span>"<\/span>Wrong<\/span>"<\/span><\/span>
<\/span>end<\/span>
<\/span>STDOUT<\/span>.<\/span>flush<\/span>
<\/span>STDOUT<\/span>.<\/span>close<\/span><\/pre><\/td>\n<\/tr><\/table>\n\n");