рдореИрдВ рд╣реИрдмрд░ рдкрд░ рдкрд╣рд▓рд╛ рд▓реЗрдЦ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдПрдХ рджрд┐рди рдХрд╛рдо рдкрд░ рдореМрдЬреВрдж рд╕рд╣рдХрд░реНрдореА рдиреЗ рднреНрд░рдорд┐рдд рд╣реЛрдиреЗ рдФрд░ "рдЯрд╛рдЗрдорд┐рдВрдЧ рд╣рдорд▓реЗ" рдХреЗ рдЦрд┐рд▓рд╛рдл рд╕реБрд░рдХреНрд╖рд╛ рдмрдирд╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рд╡рд┐рднрд┐рдиреНрди рд╕рд╛рдордЧреНрд░рд┐рдпреЛрдВ рдХреЛ рд╕рдордЭрдиреЗ рдореЗрдВ рджреЗрд░ рди рд▓рдЧреА, рдореИрдВрдиреЗ рдЖрдЧ рдкрдХрдбрд╝реА рдФрд░ рдкреНрд░рдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рдмрд╛рдЗрдХ рд▓рд┐рдЦрдиреЗ рдФрд░
рдкреНрд░рдпреЛрдЧрд╢рд╛рд▓рд╛ рдореЗрдВ рд╕рд╡рд╛рд░реА рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред

рдХрдЯ рдХреЗ рддрд╣рдд рдЗрд╕ рдЫреЛрдЯреЗ рд╕реЗ рдкреНрд░рдпреЛрдЧ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИред
рд╣рдорд▓реЗ рдХрд╛ рд╕рд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣рдорд▓рд╛рд╡рд░ рдЬрд╛рдирддрд╛ рд╣реИ, рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рддрд╛ рд╣реИ, рдзреАрд░реЗ-рдзреАрд░реЗ рдХреБрдВрдЬреА рдХреЛ рд▓реЗрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИред рд╡рд┐рднрд┐рдиреНрди рдореВрд▓реНрдпреЛрдВ рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рдФрд░ рд╕рддреНрдпрд╛рдкрди рд╕рдордп рдХреЛ рдорд╛рдкрдирд╛, рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдХреБрдЫ рдкреНрд░рдореБрдЦ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рд▓рд┐рдП рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп рджреВрд╕рд░реЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд▓рдВрдмрд╛ (рдпрд╛ рддреЗрдЬ) рд╣реИред
рд╢реБрд░реБрдЖрдд рдореЗрдВ, рдореИрдВ рдПрдХ рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рд╕рд░реНрд╡рд░ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рддрд╛рдХрд┐ рдпрд╣ рд╕рд╣реА рдорд╛рдпрдиреЗ рдореЗрдВ рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рд╣реЛ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдкрд░реЗрд╢рд╛рдиреА рдХреЗ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдЦреБрдж рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдХрд┐ рдкреНрд░рдпреЛрдЧрд╢рд╛рд▓рд╛ рдХреА рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рднреА рдпрд╣ рдХрд┐рддрдирд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдкреНрд░рдпреЛрдЧ рдХреЗ рд▓рд┐рдП, рдПрдХ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рд╕рдорд╛рд░реЛрд╣ рдХрд╛ рдЙрдкрдпреЛрдЧ рдкрд░реАрдХреНрд╖рдг рд╡рд┐рд╖рдп рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдХреЗрд╡рд▓ рджреЛ рдХреБрдВрдЬреА рддрддреНрд╡ рдХреА рддреБрд▓рдирд╛ рдХрд░реЗрдВрдЧреЗред
static bool check_secret_key(int[] key) { for (int i = 0; i < _secret_key.Length && i < key.Length; i++) if (key[i] != _secret_key[i]) return false; return _secret_key.Length == key.Length; }
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЬрдм рдХреБрдВрдЬреА рддрддреНрд╡ рдХреЗ рдкрд╣рд▓реЗ рддрддреНрд╡, рдСрдкрд░реЗрд╢рди рдореЗрдВ рдЕрдзрд┐рдХ рд╕рдордп рд▓рдЧрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддрддреНрд╡реЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рддрд╛ рд╣реИред рдЪрдпрди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ: рдкрд╣рд▓реЗ рдирдВрдмрд░ рдкрд░ рдкреБрдирд░рд╛рд╡реГрддрд┐, рд╕рдмрд╕реЗ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЪрд▓рдиреЗ рд╡рд╛рд▓рд╛ рд╡рд┐рдХрд▓реНрдк - рдЫреБрдЯреНрдЯреА, рдлрд┐рд░ рджреВрд╕рд░рд╛ ... рдФрд░ рдЗрд╕реА рддрд░рд╣ред
рдЖрдк рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдкрд░ рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЬреЛ рд▓реЛрдЧ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рд╡реЗ рднреА рдЦреЗрд▓ рд╕рдХрддреЗ рд╣реИрдВред
рдкрд╣рд▓реЗ рд▓реЙрдиреНрдЪ рдореЗрдВ рдореБрдЭреЗ рд▓рдЧрднрдЧ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдкрд░рд┐рдгрд╛рдо рдорд┐рд▓рд╛ред рдЙрдиреНрд╣реЛрдВрдиреЗ рдзреАрд░реЗ-рдзреАрд░реЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╡реГрджреНрдзрд┐ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рддреАрд╕рд░реЗ рд▓реЙрдиреНрдЪ рдкрд░ рдЙрдиреНрд╣реЗрдВ рд╕рд╣реА рдХреНрд░рдо рдкреНрд░рд╛рдкреНрдд рд╣реБрдЖред рдФрд░ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдкреНрд░рдпреЛрдЧрд╢рд╛рд▓рд╛ рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ, рд╡рд┐рдзрд┐ рдХрд╛рдо рдХрд░рддреА рд╣реИ рдФрд░ рдХрд╛рдлреА рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИред
рдХреБрдЫ рдЕрд╡рд▓реЛрдХрди рдХреЗ рдмрд╛рдж рдХреНрдпрд╛ рд╕реБрдзрд╛рд░ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ:
1) рдпрджрд┐ рдкрд┐рдЫрд▓реА рд╕рдВрдЦреНрдпрд╛ рдХреА рдЦреЛрдЬ рдкрд┐рдЫрд▓реЗ рдПрдХ рдХреЗ рд╕рд╛рде рддреБрд▓рдиреАрдп рд╕рдордп рдореЗрдВ рдХреА рдЬрд╛рддреА рд╣реИ, рддреЛ рдпрд╣ рдПрдХ рдХрджрдо рд╡рд╛рдкрд╕ рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рд╡реЗ рдЧрд▓рдд рдереЗ;
2) рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреА рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдмрд╛рдж рдЕрдЧрд▓рд╛ рдирдВрдмрд░ рдирд╣реАрдВ рдЪреБрдиреЗрдВ, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рднреА рддрд░рд╣ рдмреМрджреНрдзрд┐рдХ рд░реВрдк рд╕реЗ рдЕрдзрд┐рдХ, рдХреНрдпреЛрдВрдХрд┐ рд╕рд╣реА рддрддреНрд╡реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╡реГрджреНрдзрд┐ рдХреЗ рд╕рд╛рде, рд╕рддреНрдпрд╛рдкрди рдХрд╛ рд╕рдордп рдмрдврд╝рддрд╛ рд╣реИ рдФрд░ рдЕрдВрддрд░ рдХрдо рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдореЗрдВ рд╕рд╣реА рдкрд░рд┐рдгрд╛рдо рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджрд┐рдЦрд╛рдИ рджреЗ рд░рд╣рд╛ рд╣реИред
рдпрд╣рд╛рдВ рд╣рдореЗрдВ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдХреНрдпрд╛ рдорд┐рд▓рддрд╛ рд╣реИ (рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рдкрд░ рдЧреБрдкреНрдд рдХреБрдВрдЬреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХреА рдЧрдИ рд╣реИ):
21,87,70,6,40,46,49,4,25,68 21 21,87 21,87,70 21,87,70,6 21,87,70,6,40 21,87,70,6,40,46 21,87,70,6,40,46,49 21,87,70,6,40,46,49,4 21,87,70,6,40,46,49,4,25 Found: 21,87,70,6,40,46,49,4,25,68
рдпрд╣ рдмрд╣реБрдд рд╣реА рд╕рдорд╛рди рд╣реИ рдХрд┐ рдлрд┐рд▓реНрдореЛрдВ рдореЗрдВ рдкрд╛рд╕рд╡рд░реНрдб рдХреИрд╕реЗ рдЪреБрдиреЗ рдЬрд╛рддреЗ рд╣реИрдВ, рдФрд░ рдореИрдВрдиреЗ рд╣рдореЗрд╢рд╛ рд╕реЛрдЪрд╛ рдерд╛ рдХрд┐ рдпрд╣ рдЬрдирддрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЦреЗрд▓ рдерд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдЗрд╕рдореЗрдВ рд╕рдЪреНрдЪрд╛рдИ рдХрд╛ рдПрдХ рджрд╛рдирд╛ рд╣реИред
рдирд┐рд╖реНрдХрд░реНрд╖ рдореЗрдВ
рд╢рд╛рдпрдж рд╣рдорд▓реЗ рдХреА рдпрд╣ рд╡рд┐рдзрд┐ рдЕрдм рдХрд╛рдлреА рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдирд╣реАрдВ рд╣реИ (рдиреЗрдЯрд╡рд░реНрдХ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдиреЛрдб рд╣реИрдВ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдореВрд▓реНрдп рдХрд╛ рдпреЛрдЧрджрд╛рди рджреЗрддрд╛ рд╣реИ), рдФрд░ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рдЦрд┐рд▓рд╛рдл рдмрдЪрд╛рд╡ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ, рдпрд╣ рдХреБрдЫ рдореБрд╢реНрдХрд┐рд▓реЛрдВ рд╕реЗ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдЧрд╛, рд╣реИрд╢рд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдФрд░ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдкреНрд░рдпреЛрдЬрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣рдорд▓рд╛рд╡рд░ рджреНрд╡рд╛рд░рд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдСрдлрд╝рд▓рд╛рдЗрди рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЗ рд▓рд┐рдП рд╕реАрд░рд┐рдпрд▓ рдирдВрдмрд░ рдХреЗ рдЪрдпрди рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!
рдпреВрдкреАрдбреА: рдЗрд╕ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рдВрдкреВрд░реНрдг рдЦреЛрдЬ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╡рд┐рдзрд┐ рдХрд┐рддрдирд╛ рдкреНрд░рднрд╛рд╡реА рд╣реИ, рдЗрд╕ рд╕рдордп рдХреА рдЧрдгрдирд╛ред
рдХреБрдВрдЬреА 0 рд╕реЗ 99 (m = 100) рд╕рдорд╛рд╡реЗрд╢реА рдорд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде n = 10 рддрддреНрд╡реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреА рдПрдХ рд╕рд░рдгреА рд╣реИред
рддрдм:
рд╕рдВрдкреВрд░реНрдг рдЦреЛрдЬ рдХреЗ рд▓рд┐рдП, рдЪреЗрдХреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ m ^ n = 100 ^ 10 = 10 ^ 20 рд╣реИ;
рд▓рд╛рдЧреВ рд╕рдордп рд╣рдорд▓реЗ рдХреЗ рд▓рд┐рдП n * a * m * b, рдЬрд╣рд╛рдВ a рдФрд░ b рдЕрдиреБрднрд╡рдЬрдиреНрдп рд╕реНрдерд┐рд░рд╛рдВрдХ рд╣реИрдВ рдФрд░ 1500 рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИрдВ, рд╣рдореЗрдВ 10 * 1500 * 100 * 1500 = 2.25 * 10 ^ 9 рдорд┐рд▓рддреЗ рд╣реИрдВ
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ,
рдЗрд╕ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ рдореЗрдВ , рдкрд░рд┐рдгрд╛рдо
рдкрд░рд┐рдорд╛рдг рдХреЗ 10 рд╕реЗ рдЕрдзрд┐рдХ
рдЖрджреЗрд╢реЛрдВ рд╕реЗ рднрд┐рдиреНрди рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рд╕рдВрдкреВрд░реНрдг рдЦреЛрдЬ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЗрд╕рдХреА рдкреНрд░рднрд╛рд╡рд╢реАрд▓рддрд╛ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред
рд╡рд┐рдХреА рд▓рд┐рдВрдХ
рез)
рдЯрд╛рдЗрдо рдЕрдЯреИрдХ2)
рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдЪреИрдирд▓реЛрдВ рдкрд░ рд╣рдорд▓рд╛рд╡рд┐рд╖рдп рдХреА рдкреВрд░реА рд╕реВрдЪреА using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Diagnostics; namespace timing_attack { class Program { const int _max_value = 100; static int[] _secret_key = new int[10]; static void generate_secret_key() { var rand = new Random(); for (int i = 0; i < _secret_key.Length; i++) _secret_key[i] = rand.Next(_max_value); } static bool check_secret_key(int[] key) { for (int i = 0; i < _secret_key.Length && i < key.Length; i++) if (key[i] != _secret_key[i]) return false; return _secret_key.Length == key.Length; } static void print_key(int[] key) { Console.WriteLine(string.Join(",", key.Select(it => it.ToString()))); } private static void crack_key() { int n = 1500; List<int> key0 = new List<int>(); while (key0.Count <= _secret_key.Length) { TimeSpan[] times = new TimeSpan[_max_value]; for (int j = 0; j < n; j++) { for (int i = 0; i < _max_value; i++) { int[] key1 = key0.Concat(new int[] { i }).ToArray(); Stopwatch stop = new Stopwatch(); stop.Start(); for (int k = 0; k < n; k++) { if (check_secret_key(key1)) { Console.WriteLine("Found:"); print_key(key1); return; } } stop.Stop(); times[i] = times[i] + stop.Elapsed; } } int index_max = times .Select((value, index) => new { Value = value, Index = index }) .Aggregate((a, b) => (a.Value > b.Value) ? a : b) .Index; key0.Add(index_max); print_key(key0.ToArray()); } } static void Main(string[] args) { while (true) { generate_secret_key(); print_key(_secret_key); crack_key(); } } } }