{"id":397256,"date":"2024-06-29T13:20:18","date_gmt":"2024-06-29T13:20:18","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=397256"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=397256","title":{"rendered":"<span>\u0420\u0435\u0436\u0438\u043c \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f AEAD-MGM<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0412 2017 \u0433\u043e\u0434\u0443 \u0440\u043e\u0441\u0441\u0438\u0439\u0441\u043a\u043e\u0439 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0435\u0439 \u041a\u0440\u0438\u043f\u0442\u043e\u041f\u0440\u043e \u0431\u044b\u043b \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d \u043d\u043e\u0432\u044b\u0439 AEAD \u0440\u0435\u0436\u0438\u043c \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f Multilinear Galois Mode (MGM). \u0421\u043f\u0443\u0441\u0442\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043e\u043d \u0431\u044b\u043b \u043f\u0440\u0438\u043d\u044f\u0442 \u0432 \u0440\u043e\u0441\u0441\u0438\u0439\u0441\u043a\u0438\u0435 \u0438 \u043c\u0435\u0436\u0434\u0443\u043d\u0430\u0440\u043e\u0434\u043d\u044b\u0435 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u044b. \u0422\u0430\u043a \u043a\u0430\u043a \u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435 \u044f \u0441\u043c\u043e\u0433 \u043d\u0430\u0439\u0442\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0431\u0449\u0435\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u044d\u0442\u043e\u0433\u043e \u0440\u0435\u0436\u0438\u043c\u0430 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u0435\u0437 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 (\u0441\u0441\u044b\u043b\u043a\u0438 \u0432 \u043a\u043e\u043d\u0446\u0435 \u0441\u0442\u0430\u0442\u044c\u0438), \u0442\u043e \u044f \u0440\u0435\u0448\u0438\u043b \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u0441\u0438\u043b\u044b \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0447\u0435\u043d\u044c \u0443\u043f\u0440\u043e\u0449\u0451\u043d\u043d\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u0441\u0432\u043e\u0438\u043c\u0438 \u0440\u0443\u043a\u0430\u043c\u0438&#8230;<\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0440\u0430\u0437\u0431\u0435\u0440\u0451\u043c\u0441\u044f \u0441\u043e \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c\u0438, \u043d\u043e \u0432\u0430\u0436\u043d\u044b\u043c\u0438 \u0434\u043b\u044f \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u0432\u0435\u0449\u0430\u043c\u0438.<\/p>\n<h2>\u0428\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u0435 vs \u0440\u0435\u0436\u0438\u043c \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f<\/h2>\n<p>\u0428\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u0435 &#8212; \u044d\u0442\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0432\u0438\u0434\u0430<img decoding=\"async\" class=\"formula inline\" source=\"E: P \\times K \\rightarrow C\" alt=\"E: P \\times K \\rightarrow C\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/517\/11d\/a68\/51711da68b2cbc22b115379e7c2d8d03.svg\"\/>, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0433\u043e \u0442\u0435\u043a\u0441\u0442\u0430 P \u0432 \u0448\u0438\u0444\u0440\u043e\u0442\u0435\u043a\u0441\u0442 \u0421 \u0441 \u0438c\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043a\u043b\u044e\u0447\u0430 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f K. \u041f\u0440\u0438\u043c\u0435\u0440\u043e\u043c \u0442\u0430\u043a\u043e\u0433\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u0441\u043b\u0443\u0436\u0438\u0442\u044c &#171;\u0448\u0438\u0444\u0440 \u0426\u0435\u0437\u0430\u0440\u044f&#187;, \u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0432 \u0412\u0438\u043a\u0438\u043f\u0435\u0434\u0438\u0438.<\/p>\n<p>\u0420\u0435\u0436\u0438\u043c \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f &#8212; \u044d\u0442\u043e \u043f\u043e\u0434\u0445\u043e\u0434 \u043a \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044e \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0433\u043e \u0442\u0435\u043a\u0441\u0442\u0430 P, \u043f\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043e\u043d \u0440\u0430\u0437\u0431\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0431\u043b\u043e\u043a\u0438 \u0442\u0435\u043a\u0441\u0442\u0430 \u0437\u0430\u0432\u0435\u0434\u043e\u043c\u043e \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0434\u043b\u0438\u043d\u044b. \u0414\u0430\u043b\u0435\u0435 \u043a\u0430\u0436\u0434\u044b\u0439 \u0431\u043b\u043e\u043a \u0448\u0438\u0444\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043c <img decoding=\"async\" class=\"formula inline\" source=\"E_k\" alt=\"E_k\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/30c\/365\/f54\/30c365f541316e066c91ac1f22e91e57.svg\"\/>(\u043a\u043b\u044e\u0447 \u041a &#8212; \u043e\u0431\u0449\u0438\u0439 \u0438 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0432\u044b\u0431\u0440\u0430\u043d), \u0430 \u043f\u043e\u0442\u043e\u043c \u043e\u043d\u0438 \u0441\u043e\u0431\u0438\u0440\u0430\u044e\u0442\u0441\u044f \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432\u043c\u0435\u0441\u0442\u0435 \u0432 \u0448\u0438\u0444\u0440\u043e\u0442\u0435\u043a\u0441\u0442 \u0421.<\/p>\n<h2>AEAD-\u0440\u0435\u0436\u0438\u043c \u0431\u043b\u043e\u0447\u043d\u043e\u0433\u043e \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f<\/h2>\n<p>AEAD &#8212; \u044d\u0442\u043e\u00a0\u043a\u043b\u0430\u0441\u0441\u00a0\u0431\u043b\u043e\u0447\u043d\u044b\u0445\u00a0\u0440\u0435\u0436\u0438\u043c\u043e\u0432 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043f\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0447\u0430\u0441\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0448\u0438\u0444\u0440\u0443\u0435\u0442\u0441\u044f, \u0447\u0430\u0441\u0442\u044c \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0439, \u0438 \u0432\u0441\u0451 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043e. \u0418\u043d\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u0435\u0441\u043b\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u044c \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u044e \u0441 \u043f\u043e\u0447\u0442\u043e\u0432\u044b\u043c\u0438 \u043f\u0438\u0441\u044c\u043c\u0430\u043c\u0438, \u0442\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u043f\u0438\u0441\u044c\u043c\u0430 \u0432\u044b \u0448\u0438\u0444\u0440\u0443\u0435\u0442\u0435 (\u0437\u0430\u043f\u0435\u0447\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0435), \u0430\u0434\u0440\u0435\u0441 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044f \u0438 \u0430\u0434\u0440\u0435\u0441 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044f \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0435 \u0441\u043d\u0430\u0440\u0443\u0436\u0438 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0430 (\u043d\u0435 \u0437\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438), \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0447\u0442\u043e\u0432\u044b\u0435 \u0441\u043b\u0443\u0436\u0431\u044b \u0441\u043c\u043e\u0433\u043b\u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0432\u0430\u0448\u0435 \u043f\u0438\u0441\u044c\u043c\u043e, \u0438 \u0435\u0449\u0451 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u044b \u0434\u0435\u043b\u0430\u0435\u0442\u0435 \u043f\u0440\u0438\u043f\u0438\u0441\u043a\u0443, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044c \u0441\u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c (\u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c), \u0447\u0442\u043e \u0432\u0441\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043a\u0430\u043a \u0432\u043d\u0443\u0442\u0440\u0438, \u0442\u0430\u043a \u0438 \u0441\u043d\u0430\u0440\u0443\u0436\u0438 \u043f\u0438\u0441\u044c\u043c\u0430 \u0431\u044b\u043b\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u044b.<\/p>\n<h2>\u0410\u0440\u0438\u0444\u043c\u0435\u0442\u0438\u043a\u0430 \u043f\u043e\u043b\u0435\u0439 \u0413\u0430\u043b\u0443\u0430 GF(2^n)<\/h2>\n<p>\u0410\u0440\u0438\u0444\u043c\u0435\u0442\u0438\u043a\u0430 \u043f\u043e\u043b\u0435\u0439 \u0413\u0430\u043b\u0443\u0430 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0432\u0441\u0435\u043c\u0435\u0441\u0442\u043d\u043e \u0432 \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438, \u0438 \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u043e\u0432 \u0435\u0451 \u0440\u0430\u0431\u043e\u0442\u044b \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u043c \u043a\u043e\u0434\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e. \u0420\u0435\u0436\u0438\u043c \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f AEAD-MGM \u043e\u0442 \u0447\u0438\u0441\u0435\u043b \u0438\u0437 \u043f\u043e\u043b\u0435\u0439 \u0413\u0430\u043b\u0443\u0430 GF(2<sup>n<\/sup>) \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0442\u043e\u043b\u044c\u043a\u043e 2 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 &#8212; \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u044f<img decoding=\"async\" class=\"formula inline\" source=\"(\\oplus)\" alt=\"(\\oplus)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/924\/23c\/53a\/92423c53aa44927da33f065905b57ff0.svg\"\/> \u0438 \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f<img decoding=\"async\" class=\"formula inline\" source=\"(\\otimes)\" alt=\"(\\otimes)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/eac\/a88\/fee\/eaca88fee680a1f1a5b3bc84ac3e97fe.svg\"\/>.<\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0438\u0432\u043e\u0434\u044f\u0442\u0441\u044f \u0434\u0430\u043b\u044c\u0448\u0435 \u0432 \u044d\u0442\u043e\u0439 \u0447\u0430\u0441\u0442\u0438, \u044f \u0432\u0437\u044f\u043b \u0438\u0437 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439 <a href=\"https:\/\/habr.com\/ru\/post\/212095\/\" rel=\"noopener noreferrer nofollow\">\u0441\u0442\u0430\u0442\u044c\u0438<\/a>.<\/p>\n<p>\u041e\u043d\u0430 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f \u043a \u043f\u0440\u043e\u0447\u0442\u0435\u043d\u0438\u044e, \u0447\u0442\u043e\u0431\u044b \u0441\u043b\u043e\u0436\u0438\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043b\u043d\u043e\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043e\u0431 \u0430\u0440\u0438\u0444\u043c\u0435\u0442\u0438\u043a\u0435 \u043f\u043e\u043b\u0435\u0439 \u0413\u0430\u043b\u0443\u0430 GF(2<sup>n<\/sup>).<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0435\u0440\u0435\u0439\u0434\u0451\u043c \u043a \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438. \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u043a\u043b\u0430\u0441\u0441 \u0447\u0438\u0441\u0435\u043b \u0432 \u043f\u043e\u043b\u044f\u0445 \u0413\u0430\u043b\u0443\u0430 GF(2<sup>n<\/sup>):<\/p>\n<pre><code class=\"cpp\">\/\/ Galois Field Number \/\/ \u0434\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u043f\u043e\u043a\u0430\u0437\u0430 \u0438\u0434\u0435\u0439 \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0442\u0438\u043f uint32_t \u0432\u044b\u0431\u0440\u0430\u043d \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e class Number { public: Number(): value(0) {} Number(uint32_t value_): value(value_) {}  operator uint32_t() const { return value; }  public: friend Number operator+(Number left, Number right); friend Number operator*(Number left, Number right);  public: friend std::ostream&amp; operator&lt;&lt;(std::ostream&amp; os, Number number) { return os &lt;&lt; number.value; }  public: uint32_t value; };<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432 \u043f\u043e\u043b\u0435 GF(2<sup>n<\/sup>), \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e \u0441\u0443\u0442\u0438 \u0441\u0432\u043e\u0435\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0431\u044b\u0447\u043d\u043e\u0439 \u043f\u043e\u0431\u0438\u0442\u043e\u0432\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0435\u0439 XOR:<\/p>\n<pre><code class=\"cpp\">class Number { ... }  Number operator+(Number left, Number right) { return left.value ^ right.value; }<\/code><\/pre>\n<p>(\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f <img decoding=\"async\" class=\"formula inline\" source=\"-\" alt=\"-\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/97c\/a6c\/ef1\/97ca6cef1c44956104982c32c97da772.svg\"\/> \u0432 \u043f\u043e\u043b\u044f\u0445 GF(2<sup>n<\/sup>) \u0442\u0430\u043a\u0436\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0431\u0438\u0442\u043e\u0432\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0435\u0439 XOR)<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f <img decoding=\"async\" class=\"formula inline\" source=\"*\" alt=\"*\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/119\/bd7\/5de\/119bd75de87741eb03440c33b2ec3f1b.svg\"\/>, \u043d\u0430\u043c \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u044c, \u043a\u0430\u043a \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u0432 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 <img decoding=\"async\" class=\"formula inline\" source=\"+\" alt=\"+\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/86b\/11b\/805\/86b11b8052ca284e7975846e07ae5ebe.svg\"\/> \u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u043d\u0435\u0451. \u0418\u0437 \u0448\u043a\u043e\u043b\u044b \u043d\u0430\u043c \u0438\u0437\u0432\u0435\u0441\u0442\u0435\u043d \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f \u0432 \u0441\u0442\u043e\u043b\u0431\u0438\u043a:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"formula\" source=\"\\begin{array}{r} \\times \\begin{array}{r} 17\\\\ 25\\\\ \\end{array} \\\\ \\hline + \\begin{array}{r} 85\\\\ 340\\\\ \\end{array}\\\\ \\hline \\begin{array}{r} 425\\\\ \\end{array} \\end{array}\" alt=\"\\begin{array}{r} \\times \\begin{array}{r} 17\\\\ 25\\\\ \\end{array} \\\\ \\hline + \\begin{array}{r} 85\\\\ 340\\\\ \\end{array}\\\\ \\hline \\begin{array}{r} 425\\\\ \\end{array} \\end{array}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a20\/faf\/7ac\/a20faf7acca1bb9b73787b05fbdf1b73.svg\" width=\"72\" height=\"139\"\/><\/p>\n<p>\u041a\u0430\u043a \u043c\u044b \u0432\u0438\u0434\u0438\u043c, \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e <img decoding=\"async\" class=\"formula inline\" source=\"+\" alt=\"+\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/812\/e21\/25c\/812e2125c075a24bb3ab8849b4e06477.svg\"\/> \u043c\u044b \u0437\u0434\u0435\u0441\u044c \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0441\u043b\u043e\u0436\u0438\u0442\u044c \u0434\u0432\u0430 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0445 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u043e\u0442 \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f 17 \u043d\u0430 5, \u0438 17 \u043d\u0430 20. \u0415\u0441\u043b\u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u043e 25 \u043a\u0430\u043a <img decoding=\"async\" class=\"formula inline\" source=\"25 = 2 * 10^1 + 5 * 10^0\" alt=\"25 = 2 * 10^1 + 5 * 10^0\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/9b8\/770\/b4d\/9b8770b4d9c83a34bd500d421cc7b686.svg\"\/>, \u0442\u043e \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f <img decoding=\"async\" class=\"formula inline\" source=\"+\" alt=\"+\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/f57\/da4\/950\/f57da495032b0f3994a931eacda8cc93.svg\"\/> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f \u0447\u0438\u0441\u043b\u0430 17 \u043d\u0430 \u0447\u0438\u0441\u043b\u0430 \u043f\u0440\u0438 \u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u0442\u0435\u043f\u0435\u043d\u044f\u0445 10. \u0415\u0441\u043b\u0438 \u043c\u044b \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c \u0442\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0448\u0438 \u0440\u0430\u0441\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0440\u0430\u0437\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0447\u0438\u0441\u0435\u043b \u043f\u043e \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u044e 2, \u0442\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u0441\u044f.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"formula\" source=\"\\begin{array}{r} \\times \\begin{array}{r} 111(7)\\\\ 101(5)\\\\ \\end{array} \\\\ \\hline +   \\begin{array}{r} 111(7) \\\\ 0000(0) \\\\ 11100(28) \\\\ \\end{array} \\\\ \\hline \\begin{array}{r} 100011(35) \\\\ \\end{array} \\end{array}\" alt=\"\\begin{array}{r} \\times \\begin{array}{r} 111(7)\\\\ 101(5)\\\\ \\end{array} \\\\ \\hline +   \\begin{array}{r} 111(7) \\\\ 0000(0) \\\\ 11100(28) \\\\ \\end{array} \\\\ \\hline \\begin{array}{r} 100011(35) \\\\ \\end{array} \\end{array}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/e5d\/ef1\/9f8\/e5def19f86e0cb06557c57d9a669fce7.svg\" width=\"125\" height=\"172\"\/><\/p>\n<p><img decoding=\"async\" class=\"formula inline\" source=\"5 = 1*2^2 + 0*2^1 +1*2^0\" alt=\"5 = 1*2^2 + 0*2^1 +1*2^0\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ecd\/d79\/4d1\/ecdd794d13ece4e254e9291e44c251b7.svg\"\/><\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c, \u0432\u0441\u043f\u043e\u043c\u0438\u043d\u0430\u044f \u0447\u0442\u043e \u0432 \u043f\u043e\u043b\u044f\u0445 GF(2<sup>n<\/sup>) <img decoding=\"async\" class=\"formula inline\" source=\"+\" alt=\"+\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b66\/7b3\/e4f\/b667b3e4f46ff64b90f6bafad0d1626f.svg\"\/> \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f XOR, \u043f\u043e\u043b\u0443\u0447\u0438\u043c<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"formula\" source=\"\\begin{array}{r} \\otimes \\begin{array}{r} 111\\\\ 101\\\\ \\end{array} \\\\ \\hline \\oplus   \\begin{array}{r} 00111 \\\\ 00000 \\\\ 11100 \\\\ \\end{array} \\\\ \\hline \\begin{array}{r} 11011 \\\\ \\end{array} \\end{array}\" alt=\"\\begin{array}{r} \\otimes \\begin{array}{r} 111\\\\ 101\\\\ \\end{array} \\\\ \\hline \\oplus   \\begin{array}{r} 00111 \\\\ 00000 \\\\ 11100 \\\\ \\end{array} \\\\ \\hline \\begin{array}{r} 11011 \\\\ \\end{array} \\end{array}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/1d5\/852\/5b9\/1d58525b92640a501d744c2631203754.svg\" width=\"91\" height=\"166\"\/><\/p>\n<p>\u0418\u043b\u0438 <img decoding=\"async\" class=\"formula inline\" source=\"7 \\otimes 5 = 7*2^2  \\oplus 7 = 28 \\oplus 7= 27\" alt=\"7 \\otimes 5 = 7*2^2  \\oplus 7 = 28 \\oplus 7= 27\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/5f8\/ee3\/9ba\/5f8ee39bad24ffde4007cdcfbda35f6d.svg\"\/><\/p>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043f\u0435\u0440\u0432\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u043d\u0430\u0448\u0435\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430 \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f \u0432 \u043f\u043e\u043b\u044f\u0445 GF(2<sup>n<\/sup>):<\/p>\n<pre><code class=\"cpp\">\/\/ \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u044b\u0439 \u0442\u0438\u043f uint64_t \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \/\/ \u0435\u0441\u043b\u0438 a &lt; 2^32 \u0438 b &lt; 2^32, \u0442\u043e a * b &lt; 2^(32 + 32) = 2^64, \u043d\u043e \u043d\u0435 2^32 uint64_t MulMod2(uint32_t left, uint32_t right) { uint64_t result = 0; uint64_t offset = 0; while(right) { if (right &amp; 1) result ^= left &lt;&lt; offset; ++offset; right >>= 1; } return result; }<\/code><\/pre>\n<p>\u0417\u0430\u043c\u0435\u0447\u0443, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043f\u0435\u0440\u0435\u043c\u043d\u043e\u0436\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u043f\u043e\u043c\u0435\u0449\u0430\u044e\u0442\u0441\u044f \u0432 \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0435 \u0441\u043b\u043e\u0432\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, 128 \u0440\u0430\u0437\u0440\u044f\u0434\u043d\u044b\u0435), \u0442\u043e \u043d\u0430\u043c \u0441\u0442\u043e\u0438\u0442 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434. \u041d\u0430 \u044d\u0442\u043e\u0442 \u0440\u0430\u0437 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0442\u044c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0430\u0432\u043e\u0435 \u0447\u0438\u0441\u043b\u043e, \u043d\u043e \u0438 \u043b\u0435\u0432\u043e\u0435, \u0441\u0443\u043c\u043c\u0438\u0440\u0443\u044f \u043f\u043e \u043c\u043e\u0434\u0443\u043b\u044e 2 \u043a\u043e\u043b-\u0432\u043e \u0435\u0434\u0438\u043d\u0438\u0446 \u043f\u0440\u0438 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e\u0439 \u0441\u0442\u0435\u043f\u0435\u043d\u0438 2.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"formula\" source=\"\\begin{array}{} 7 = 1 * 2^2 \\oplus 1 * 2^1 \\oplus 1 * 2^0\\\\ 5=1*2^2 \\oplus0*2^1\\oplus1*2^0\\\\ 2^0: 1*1=1\\\\ 2^1:1*1\\oplus1*0=1\\\\ 2^2:1*1\\oplus1*0\\oplus1*1=0\\\\ 2^3:1*0\\oplus 1*1=1\\\\ 2^4: 1*1 = 1\\\\ 2^4 + 2^3+2^1+2^0=27\\end{array}\" alt=\"\\begin{array}{} 7 = 1 * 2^2 \\oplus 1 * 2^1 \\oplus 1 * 2^0\\\\ 5=1*2^2 \\oplus0*2^1\\oplus1*2^0\\\\ 2^0: 1*1=1\\\\ 2^1:1*1\\oplus1*0=1\\\\ 2^2:1*1\\oplus1*0\\oplus1*1=0\\\\ 2^3:1*0\\oplus 1*1=1\\\\ 2^4: 1*1 = 1\\\\ 2^4 + 2^3+2^1+2^0=27\\end{array}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/4aa\/44c\/e7c\/4aa44ce7c5fc23901ee3d0a0cbf1b6e0.svg\" width=\"236\" height=\"221\"\/><\/p>\n<pre><code class=\"cpp\">\/\/ uint128_t - \u043d\u0435\u043a\u0438\u0439 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u044b\u0439 \u0446\u0435\u043b\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0439 \u0442\u0438\u043f \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 128 \u0431\u0438\u0442 \/\/ uint256_t - 256 \u0431\u0438\u0442 bool testbit(uint256_t value, size_t offset) { return value &amp; (1 &lt;&lt; offset); }  void setbit(uint256_t&amp; value, size_t offset) { value |= 1 &lt;&lt; offset; }  uint256_t MulMod2(uint128_t left, uint128_t right) { uint256_t result = 0; for(size_t k = 0; k &lt; 256; ++k) { size_t sum = 0; for(size_t i = 0, j = k; i &lt;= k; ++i, --j) { if (testbit(left, i) &amp;&amp; testbit(right, j)) sum ^= 1; } if (sum) setbit(result, k); } return result; }<\/code><\/pre>\n<p>\u041e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u0437\u0434\u0435\u0441\u044c \u043f\u0440\u043e\u0449\u0435 \u0432 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u043b\u0435\u0433\u0447\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e\u0442\u0441\u044f.<\/p>\n<p>\u0412\u0442\u043e\u0440\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f \u0432 \u043f\u043e\u043b\u044f\u0445 \u0413\u0430\u043b\u0443\u0430 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u043a\u0430\u043a \u0431\u044b &#171;\u0432\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043e\u0431\u0440\u0430\u0442\u043d\u043e&#187; \u0447\u0438\u0441\u043b\u043e, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0435 \u043e\u0442 MulMod2 \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b [1, 2<sup>n<\/sup>). \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u0440\u043e\u0436\u0434\u0430\u044e\u0449\u0438\u0439 \u043c\u043d\u043e\u0433\u043e\u0447\u043b\u0435\u043d &#8212; \u0447\u0438\u0441\u043b\u043e \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [2<sup>n<\/sup>, 2<sup>n<\/sup> + 2<sup>n<\/sup>), \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043c\u044b \u0434\u0435\u043b\u0438\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043e\u0442 MulMod2. \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0435 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0447\u0438\u0441\u043b\u043e \u0431\u0443\u0434\u0435\u0442 \u043b\u0435\u0436\u0430\u0442\u044c \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [1, 2<sup>n<\/sup>).<\/p>\n<details class=\"spoiler\">\n<summary>\u041e\u0431 \u043e\u0441\u0442\u0430\u0442\u043a\u0435 \u043e\u0442 \u0434\u0435\u043b\u0435\u043d\u0438\u044f<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0418\u0437 \u0448\u043a\u043e\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043c\u044b \u0437\u043d\u0430\u0435\u043c, \u0447\u0442\u043e \u0434\u043b\u044f \u043e\u0431\u044b\u0447\u043d\u043e\u0439 \u0430\u0440\u0438\u0444\u043c\u0435\u0442\u0438\u043a\u0438 \u043e\u0441\u0442\u0430\u0442\u043e\u043a \u043e\u0442 \u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043d\u0430 \u0447\u0438\u0441\u043b\u043e m \u043b\u0435\u0436\u0438\u0442 \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [0, m). \u041f\u043e\u0447\u0435\u043c\u0443 \u0436\u0435 \u0442\u043e\u0433\u0434\u0430 \u0430\u0440\u0438\u0444\u043c\u0435\u0442\u0438\u043a\u0430 \u0432 \u043f\u043e\u043b\u044f\u0445 \u0413\u0430\u043b\u0443\u0430 GF(2<sup>n<\/sup>) \u0434\u043b\u044f \u043f\u043e\u0440\u043e\u0436\u0434\u0430\u044e\u0449\u0435\u0433\u043e \u043c\u043d\u043e\u0433\u043e\u0447\u043b\u0435\u043d\u0430 (2<sup>n<\/sup> + x), 0 &lt; x &lt; 2<sup>n<\/sup> \u043d\u0435 \u0434\u0430\u0451\u0442 \u043d\u0430\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043e\u0441\u0442\u0430\u0442\u043e\u043a (2<sup>n<\/sup> + y), 0 &lt; y &lt; 2<sup>n<\/sup>?<\/p>\n<p>\u041e\u0442\u0432\u0435\u0442 \u0442\u0443\u0442 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0431\u044b \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u043e\u0441\u0442\u0430\u0442\u043e\u043a (2<sup>n<\/sup> + y), \u0442\u043e \u0442\u043e\u0433\u0434\u0430 \u043c\u044b \u0431\u044b \u0441\u043c\u043e\u0433\u043b\u0438 \u0431\u044b \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"formula\" source=\"(2^n+y) \\oplus (2^n + x) = y \\oplus x=z\" alt=\"(2^n+y) \\oplus (2^n + x) = y \\oplus x=z\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/60e\/894\/d05\/60e894d0515756450a7d88ee6e5f266a.svg\" width=\"265\" height=\"22\"\/><\/p>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a 0 &lt; x &lt; 2<sup>n<\/sup> \u0438 0 &lt; y &lt; 2<sup>n<\/sup>, \u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f XOR \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0430\u0437\u0440\u044f\u0434\u043e\u0432 \u0432 \u0447\u0438\u0441\u043b\u0435, \u0442\u043e z \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0430\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0443 [0, 2<sup>n<\/sup>). \u0422\u0430\u043a \u043a\u0430\u043a 0 \u043d\u0435 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442\u0441\u044f, \u0442\u043e \u0435\u0433\u043e \u043e\u0442\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u043c, \u043f\u043e\u043b\u0443\u0447\u0430\u044f \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b [1, 2<sup>n<\/sup>). \u041f\u043e \u0438\u0442\u043e\u0433\u0443 \u043e\u0441\u0442\u0430\u0442\u043e\u043a (2<sup>n<\/sup> + y) \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043b\u0441\u044f \u0432 \u043e\u0441\u0442\u0430\u0442\u043e\u043a z, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0438\u0442 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0443 [1, 2<sup>n<\/sup>), \u0430 \u044d\u0442\u043e \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u0440\u0435\u0447\u0438\u0442 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044e, \u0447\u0442\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043e\u0441\u0442\u0430\u0442\u043e\u043a (2<sup>n<\/sup> + y)<\/p>\n<\/div>\n<\/details>\n<p>\u0412\u0441\u043f\u043e\u043c\u043d\u0438\u043c \u0448\u043a\u043e\u043b\u044c\u043d\u043e\u0435 \u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0441\u0442\u043e\u043b\u0431\u0438\u043a\u043e\u043c<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/8e9\/076\/c62\/8e9076c629ecfaa4402679df0dbcadcd.gif\" alt=\"\" title=\"\" width=\"166\" height=\"240\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/8e9\/076\/c62\/8e9076c629ecfaa4402679df0dbcadcd.gif\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0415\u0441\u043b\u0438 \u044d\u0442\u043e \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c \u0432 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0434\u0440\u0443\u0433\u043e\u043c \u0432\u0438\u0434\u0435, \u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"formula\" source=\"\\begin{array}{c} 1300\/12=13\/12*10^2=1*10^2=100 \\ (1*10^2 \\ \\text{\u0432 \u043e\u0441\u0442\u0430\u0442\u043a\u0435}) \\\\ 100 + 50=150\/12=15\/12*10^1=1*10^1=10 \\ (3*10^1 \\ \\text{\u0432 \u043e\u0441\u0442\u0430\u0442\u043a\u0435}) \\\\ 30+0=30\/12=30\/12*10^0=2*10^0=2\\ (6*10^0 \\ \\text{\u0432 \u043e\u0441\u0442\u0430\u0442\u043a\u0435}) \\\\ 100+10+2=112 \\ (6 \\ \\text{\u0432 \u043e\u0441\u0442\u0430\u0442\u043a\u0435}) \\end{array}\" alt=\"\\begin{array}{c} 1300\/12=13\/12*10^2=1*10^2=100 \\ (1*10^2 \\ \\text{\u0432 \u043e\u0441\u0442\u0430\u0442\u043a\u0435}) \\\\ 100 + 50=150\/12=15\/12*10^1=1*10^1=10 \\ (3*10^1 \\ \\text{\u0432 \u043e\u0441\u0442\u0430\u0442\u043a\u0435}) \\\\ 30+0=30\/12=30\/12*10^0=2*10^0=2\\ (6*10^0 \\ \\text{\u0432 \u043e\u0441\u0442\u0430\u0442\u043a\u0435}) \\\\ 100+10+2=112 \\ (6 \\ \\text{\u0432 \u043e\u0441\u0442\u0430\u0442\u043a\u0435}) \\end{array}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/0d7\/3ea\/e9a\/0d73eae9a30ce9e4ab232ed211532f83.svg\" width=\"559\" height=\"111\"\/><\/p>\n<p>\u041e\u0441\u0442\u0430\u0442\u043a\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u043c\u0435\u043d\u044c\u0448\u0435 12 * 10<sup>x<\/sup>, \u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0434\u0435\u043b\u0435\u043d\u0438\u0439 13\/12, 15\/12, 30\/12 \u0434\u043e\u043b\u0436\u043d\u044b \u043b\u0435\u0436\u0430\u0442\u044c \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [0, 10), \u0442\u0430\u043a \u043a\u0430\u043a 10 &#8212; \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0441\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f.<\/p>\n<p>\u0412 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0441\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432\u0441\u0451 \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435:<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/aac\/fae\/242\/aacfae242d8fd8a068aada73ee73c12f.png\" alt=\"\" title=\"\" width=\"265\" height=\"135\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/aac\/fae\/242\/aacfae242d8fd8a068aada73ee73c12f.png\"\/><figcaption><\/figcaption><\/figure>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"formula\" source=\"\\begin{array}{c} 11010_2\/1011_2= 1101_2\/1011_2 * 10_2=1*10_2=10_2 \\ (100_2 \\ \\text{\u0432 \u043e\u0441\u0442\u0430\u0442\u043a\u0435}) \\\\ 100_2 + 001_2 =  101_2\/1011_2=0 \\ (101_2 \\ \\text{\u0432 \u043e\u0441\u0442\u0430\u0442\u043a\u0435}) \\end{array}\" alt=\"\\begin{array}{c} 11010_2\/1011_2= 1101_2\/1011_2 * 10_2=1*10_2=10_2 \\ (100_2 \\ \\text{\u0432 \u043e\u0441\u0442\u0430\u0442\u043a\u0435}) \\\\ 100_2 + 001_2 =  101_2\/1011_2=0 \\ (101_2 \\ \\text{\u0432 \u043e\u0441\u0442\u0430\u0442\u043a\u0435}) \\end{array}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/dd9\/4c5\/562\/dd94c5562dfd2974ea140afb567ad21e.svg\" width=\"0\" height=\"0\"\/><\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435 \u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0432 \u0441\u0442\u043e\u043b\u0431\u0438\u043a, \u0435\u0441\u043b\u0438 \u043c\u044b \u0437\u0430\u043c\u0435\u043d\u0438\u043c <img decoding=\"async\" class=\"formula inline\" source=\"-\" alt=\"-\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/018\/876\/f1e\/018876f1ef42a2071e2019f4662210a4.svg\"\/>\u043d\u0430 <img decoding=\"async\" class=\"formula inline\" source=\"\\oplus\" alt=\"\\oplus\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/441\/030\/baa\/441030baaa970faafd8f40b7e8d11c58.svg\"\/><\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/9c7\/9c1\/32d\/9c79c132dd25731cc324ef743916a756.png\" width=\"260\" height=\"163\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/9c7\/9c1\/32d\/9c79c132dd25731cc324ef743916a756.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u043c, \u0447\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u043d\u0430\u043c\u0438 \u043e\u0442\u0432\u0435\u0442 \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u044f\u0435\u0442 MulMod2<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"formula\" source=\"\\begin{array}{r} \\otimes \\begin{array}{r} 1011\\\\ 11\\\\ \\end{array} \\\\ \\hline \\oplus \\begin{array}{r} 01011 \\\\ 10110 \\\\ \\end{array} \\\\ \\hline \\oplus \\begin{array}{r} 11101 \\\\ 00110 \\\\ \\end{array} \\\\ \\hline \\begin{array}{r} 11011 \\end{array} \\end{array}\" alt=\"\\begin{array}{r} \\otimes \\begin{array}{r} 1011\\\\ 11\\\\ \\end{array} \\\\ \\hline \\oplus \\begin{array}{r} 01011 \\\\ 10110 \\\\ \\end{array} \\\\ \\hline \\oplus \\begin{array}{r} 11101 \\\\ 00110 \\\\ \\end{array} \\\\ \\hline \\begin{array}{r} 11011 \\end{array} \\end{array}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/562\/0a4\/d2a\/5620a4d2afbaf4eb4127aa072f9073ef.svg\" width=\"91\" height=\"193\"\/><img loading=\"lazy\" decoding=\"async\" class=\"formula\" source=\"\\begin{array}{c} 1011_2 \\otimes 11_2=11101_2 \\oplus 110_2 = 11011_2 \\\\ 11_{10} \\otimes 3_{10}=29_{10} \\oplus 6_{10} = 27_{10} \\end{array}\" alt=\"\\begin{array}{c} 1011_2 \\otimes 11_2=11101_2 \\oplus 110_2 = 11011_2 \\\\ 11_{10} \\otimes 3_{10}=29_{10} \\oplus 6_{10} = 27_{10} \\end{array}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/598\/9dc\/6e0\/5989dc6e07ad9bd1b6b78692865690fe.svg\" width=\"332\" height=\"49\"\/><\/p>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e, \u043d\u0430\u0448 \u043f\u043e\u0434\u0445\u043e\u0434 \u043a \u0434\u0435\u043b\u0435\u043d\u0438\u044e \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u0432\u0435\u0440\u043d\u044b\u043c. \u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e \u0432 \u043a\u043e\u0434\u0435.<\/p>\n<p>\u0414\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u0442\u0435\u043c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e\u043c \u0430\u043b\u0433\u0435\u0431\u0440\u044b \u043f\u043e\u043b\u0435\u0439 \u0413\u0430\u043b\u0443\u0430 GF(2<sup>n<\/sup>), \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u0447\u0438\u0441\u043b\u0430<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"formula\" source=\"\\begin{array}{c} a = 2^n +x \\ (0 &lt; x &lt; 2^n) \\\\ b=2^m+y \\ (0 &lt; y&lt; 2^m) \\\\ n \\geqslant m \\end{array}\" alt=\"\\begin{array}{c} a = 2^n +x \\ (0 &lt; x &lt; 2^n) \\\\ b=2^m+y \\ (0 &lt; y&lt; 2^m) \\\\ n \\geqslant m \\end{array}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a92\/de8\/c95\/a92de8c95f52f85ab57299845069cc57.svg\" width=\"211\" height=\"78\"\/><\/p>\n<p>\u0442\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u0432\u0435\u0441\u0442\u0438<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"formula\" source=\"\\begin{array}{c} q = 2^{n-m} \\\\ b^*=b*q=2^n+y*2^{n-m} \\ (0 &lt; y * 2^{n - m} &lt; 2^n) \\\\ a \\oplus b^*=(2^n+x)\\oplus(2^n+y*2^{n-m})=x \\oplus y*2^{n-m} &lt; 2^n\\end{array}\" alt=\"\\begin{array}{c} q = 2^{n-m} \\\\ b^*=b*q=2^n+y*2^{n-m} \\ (0 &lt; y * 2^{n - m} &lt; 2^n) \\\\ a \\oplus b^*=(2^n+x)\\oplus(2^n+y*2^{n-m})=x \\oplus y*2^{n-m} &lt; 2^n\\end{array}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/0dd\/f1c\/e2e\/0ddf1ce2ee55db1b61d64f90222e53eb.svg\" width=\"480\" height=\"78\"\/><\/p>\n<p>\u0415\u0441\u043b\u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u044c \u044d\u0442\u043e \u0441 \u0434\u0435\u043b\u0435\u043d\u0438\u0435\u043c \u0441\u0442\u043e\u043b\u0431\u0438\u043a\u043e\u043c, \u0442\u043e \u0430 &#8212; \u0434\u0435\u043b\u0438\u043c\u043e\u0435, b &#8212; \u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044c, q &#8212; \u0431\u0438\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0432 \u0447\u0430\u0441\u0442\u043d\u043e\u0435, <img decoding=\"async\" class=\"formula inline\" source=\"a \\oplus b^*\" alt=\"a \\oplus b^*\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/001\/df9\/b78\/001df9b786f34b905c3f94ff27a27c6c.svg\"\/>&#8212; \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0434\u043b\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438&#8230; \u041a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e <img decoding=\"async\" class=\"formula inline\" source=\"a \\oplus b^*\" alt=\"a \\oplus b^*\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/691\/d72\/66c\/691d7266ce3c6db605114bd4ff94f0b2.svg\"\/>\u0441\u0442\u0430\u043d\u0435\u0442 \u043c\u0435\u043d\u044c\u0448\u0435 b, \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043e\u0441\u0442\u0430\u0442\u043e\u043a. \u0418\u0442\u043e\u0433\u043e \u043a\u043e\u0434 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c:<\/p>\n<pre><code class=\"cpp\">size_t maxbit(uint64_t value) { size_t retval = 0; while(value) { value >>= 1; ++retval; } return retval; }  uint32_t ModGenP(uint64_t value, uint64_t gen_polynom) { while (true) { size_t vmaxbit = maxbit(value); size_t pmaxbit = maxbit(gen_polynom);  if (vmaxbit &lt; pmaxbit) return (uint32_t) value;  size_t quotient = 1 &lt;&lt; (vmaxbit - pmaxbit); value ^= gen_polynom * quotient; } }<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0441\u043e\u0432\u043c\u0435\u0449\u0430\u044f \u0432\u0441\u0451 \u0432\u043c\u0435\u0441\u0442\u0435, \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0438\u0442\u043e\u0433\u043e\u0432\u044b\u0439 \u043a\u043e\u0434 \u0434\u043b\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f \u0432 \u043f\u043e\u043b\u044f\u0445 \u0413\u0430\u043b\u0443\u0430  GF(2<sup>n<\/sup>):<\/p>\n<pre><code class=\"cpp\">class Number { ... }  Number operator*(Number left, Number right) {   \/\/ \u043f\u043e\u0440\u043e\u0436\u0434\u0430\u044e\u0449\u0438\u0439 \u043f\u043e\u043b\u0438\u043d\u043e\u043c: x^32 + x^22 + x^2 + x^1 + 1 uint64_t gen_p = (1ULL &lt;&lt; 32) + (1 &lt;&lt; 22) + (1 &lt;&lt; 2) + (1 &lt;&lt; 1) + 1; uint64_t value = MulMod2(left.value, right.value); return ModGenP(value, gen_p); }<\/code><\/pre>\n<h3>AEAD-MGM<\/h3>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c, \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0432\u0448\u0438\u0441\u044c \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u0441\u043b\u043e\u0436\u043d\u044b\u043c\u0438, \u043d\u043e \u0432\u0430\u0436\u043d\u044b\u043c\u0438 \u043c\u043e\u043c\u0435\u043d\u0442\u0430\u043c\u0438, \u043c\u044b \u0433\u043e\u0442\u043e\u0432\u044b \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0443 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f AEAD-MGM&#8230;<\/p>\n<p>\u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0444\u0430\u0439\u043b \u0441 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f \u0431\u0443\u0434\u0443 \u043e\u043f\u0438\u0440\u0430\u0442\u044c\u0441\u044f, \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 <a href=\"https:\/\/files.stroyinf.ru\/Index2\/1\/4293727\/4293727270.htm\" rel=\"noopener noreferrer nofollow\">\u0437\u0434\u0435\u0441\u044c<\/a>:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/851\/28f\/44f\/85128f44fbd4a92e12b3fdc169026ef0.PNG\" alt=\"\" title=\"\" width=\"899\" height=\"640\"\/><figcaption><\/figcaption><\/figure>\n<p>\u041f\u043e \u0441\u0443\u0442\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439:<\/p>\n<ol>\n<li>\n<p>\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044e nonce (\u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043e\u0431\u043c\u0435\u043d\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u043c\u0438)<\/p>\n<\/li>\n<li>\n<p>\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044e <img decoding=\"async\" class=\"formula inline\" source=\"(0 \\ || \\ nonce)\" alt=\"(0 \\ || \\ nonce)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/cc5\/636\/fe2\/cc5636fe24270381c4e43407c7c405f7.svg\"\/> \u0438 <img decoding=\"async\" class=\"formula inline\" source=\"(1 \\ || \\ nonce)\" alt=\"(1 \\ || \\ nonce)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/eef\/adf\/8ee\/eefadf8ee2ba6177e5bc0d22bc8c1d35.svg\"\/><\/p>\n<\/li>\n<li>\n<p>\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044e \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432 Y, Z, H.<\/p>\n<\/li>\n<li>\n<p>\u0414\u0435\u043b\u0435\u043d\u0438\u0435 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 (A \u0438 P) \u043d\u0430 \u0431\u043b\u043e\u043a\u0438 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0433\u043e \u043d\u0430\u043c\u0438 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 (32 \u0431\u0438\u0442\u0430)<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 <img decoding=\"async\" class=\"formula inline\" source=\"P \\rightarrow C\" alt=\"P \\rightarrow C\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/2bb\/5a9\/a92\/2bb5a9a9245f49611dcbbde88fbfd872.svg\"\/> \u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044e \u0438\u043c\u0438\u0442\u043e\u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u0422<\/p>\n<\/li>\n<\/ol>\n<p>\u0414\u043b\u044f \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0432 \u043a\u043e\u0434\u0435 \u0431\u0443\u0434\u0435\u043c \u0441\u0447\u0438\u0442\u0430\u0442\u044c, \u0447\u0442\u043e<\/p>\n<ul>\n<li>\n<p>P = N \u0431\u043b\u043e\u043a\u043e\u0432 \u043f\u043e 32 \u0431\u0438\u0442\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0432 \u043a\u0430\u0436\u0434\u043e\u043c<\/p>\n<\/li>\n<li>\n<p>A = M \u0431\u043b\u043e\u043a\u043e\u0432 \u043f\u043e 32 \u0431\u0438\u0442\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0432 \u043a\u0430\u0436\u0434\u043e\u043c<\/p>\n<\/li>\n<li>\n<p>\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 <img decoding=\"async\" class=\"formula inline\" source=\"max|P| = max|A|=2^{16}\" alt=\"max|P| = max|A|=2^{16}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/2a2\/39e\/a49\/2a239ea49c81cbd0af7a86f45e0a26a8.svg\"\/><\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u043e\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c incr_l, incr_r \u0438 \u0435\u0449\u0451 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439:<\/p>\n<pre><code class=\"cpp\">uint32_t incr_l(uint32_t input) {     uint16_t L = (input &amp; 0xffff0000) >> 16;     uint16_t R = (input &amp; 0x0000ffff);          ++L;          return (L &lt;&lt; 16) + R; }  uint32_t incr_r(uint32_t input) {     uint16_t L = (input &amp; 0xffff0000) >> 16;     uint16_t R = (input &amp; 0x0000ffff);          ++R;          return (L &lt;&lt; 16) + R; }  uint32_t MSB(uint32_t number, size_t size) { return number &amp; (0xffffffff - ((1 &lt;&lt; size) - 1)); }  \/\/ nonce - \u043e\u0434\u043d\u043e\u0440\u0430\u0437\u043e\u0432\u044b\u0439 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0432\u0435\u043a\u0442\u043e\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \/\/ \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u043c \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043e\u0431\u043c\u0435\u043d\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u043c\u0438. \u0415\u0433\u043e \u0434\u043b\u0438\u043d\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c (N - 1), \/\/ \u0442.\u0435. \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 (32 - 1) = 31 \u0431\u0438\u0442. \u0412 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u044f\u0445 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u0435\u0433\u043e  \/\/ \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u0447\u0451\u0442\u0447\u0438\u043a\u0430, \u043d\u043e, \u0442\u0430\u043a \u043a\u0430\u043a \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0442\u043e\u043b\u044c\u043a\u043e 1 \u0440\u0430\u0437, \/\/ \u0442\u043e \u0432\u043e\u0437\u044c\u043c\u0451\u043c \u043f\u0440\u043e\u0441\u0442\u043e \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. constexpr uint32_t nonce() {   return 0x5678; \/\/ 0x5 = 0101 (\u043f\u0435\u0440\u0432\u044b\u0439 \u0431\u0438\u0442 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f) }  constexpr uint32_t Get0orN() { return (0 &lt;&lt; 31) + nonce(); }  constexpr uint32_t Get1orN() { return (1 &lt;&lt; 31) + nonce(); }  \/\/ \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f E_k. \u0414\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u044b \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0448\u0438\u0444\u0440\u0443\u0435\u043c. uint32_t \u0415ncrypt(uint32_t input) {     return input; }  \/\/ \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432 Y, Z, H void FillY(Number* Y, size_t count) {     Y[0] = Shifr(Get0orN());     for(size_t i = 1; i &lt; count; ++i)         Y[i] = incr_r(Y[i - 1]); }  void FillZ(Number* Z, size_t count) {     Z[0] = Shifr(Get1orN());     for(size_t i = 1; i &lt; count; ++i)         Z[i] = incr_l(Z[i - 1]); }  void FillH(Number* H, Number* Z, size_t count) {     for(size_t i = 0; i &lt; count; ++i)         H[i] = Shifr(Z[i]); }<\/code><\/pre>\n<p>\u041d\u0443 \u0438 \u043d\u0430\u043a\u043e\u043d\u0435\u0446 \u0441\u0430\u043c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c:<\/p>\n<pre><code class=\"cpp\">int main() { constexpr size_t N = 10; constexpr size_t M = 10;  Number Y[N]; Number Z[N + M + 1];  FillY(Y, N); FillZ(Z, N + M + 1);  Number P[N] = {0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0x10}; Number C[N];  for(size_t i = 0; i &lt; N; ++i) C[i] = Number(Shifr(Y[i])) + P[i];  Number A[M] = {0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0x10}; Number H[N + M + 1];  FillH(H, Z, N + M + 1);  \/\/ \u043c\u0430\u0441\u0441\u0438\u0432 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0445 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f Number V[21]; for(size_t i = 0; i &lt; M; ++i) V[i] = H[i + 0] * A[i]; for(size_t i = 0; i &lt; N; ++i) V[i] = H[i + M] * P[i];  uint16_t lenC = N * 32; uint16_t lenA = M * 32; uint32_t lenS = (lenA &lt;&lt; 16) + lenC;  V[N + M] = H[N + M] * Number(lenS);  Number sum = V[0]; for(size_t i = 1; i &lt;= N + M; ++i) sum = sum + V[i];  \/\/ \u0438\u043c\u0438\u0442\u043e\u0432\u0441\u0442\u0430\u0432\u043a\u0430 uint32_t T = MSB(Shifr(sum), 11);  for(size_t i = 0; i &lt; N; ++i) std::cout &lt;&lt; C[i] &lt;&lt; ' '; std::cout &lt;&lt; std::endl; std::cout &lt;&lt; \"T = 0x\" &lt;&lt; std::hex &lt;&lt; T &lt;&lt; std::endl; return 0; }<\/code><\/pre>\n<p>\u0411\u0435\u0437\u0443\u0441\u043b\u043e\u0432\u043d\u043e, \u0440\u0435\u0436\u0438\u043c \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f AEAD-MGM \u0432 \u0442\u0430\u043a\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0435 \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0442\u043e\u043d\u043a\u0438\u0445 \u043c\u043e\u043c\u0435\u043d\u0442\u043e\u0432, \u043d\u043e \u0434\u043b\u044f \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u0438\u0434\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0435\u0433\u043e, \u044f \u0434\u0443\u043c\u0430\u044e, \u0432\u043f\u043e\u043b\u043d\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e.<\/p>\n<p>\u041f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u0434 \u043d\u0430 \u0421++:<\/p>\n<details class=\"spoiler\">\n<summary>\u0418\u0442\u043e\u0433\u043e\u0432\u044b\u0439 \u043a\u043e\u0434<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">#include &lt;iostream> #include &lt;cstdint>  \/\/ Galois Field Number \/\/ \u0434\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u043f\u043e\u043a\u0430\u0437\u0430 \u0438\u0434\u0435\u0439 \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0442\u0438\u043f uint32_t \u0432\u044b\u0431\u0440\u0430\u043d \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e class Number { public: Number(): value(0) {} Number(uint32_t value_): value(value_) {}  operator uint32_t() const { return value; }  public: friend Number operator+(Number left, Number right); friend Number operator*(Number left, Number right);  public: friend std::ostream&amp; operator&lt;&lt;(std::ostream&amp; os, Number number) { return os &lt;&lt; number.value; }  public: uint32_t value; };  Number operator+(Number left, Number right) { return left.value ^ right.value; }  bool testbit(uint64_t value, size_t offset) { return value &amp; (1 &lt;&lt; offset); }  void setbit(uint64_t&amp; value, size_t offset) { value |= 1 &lt;&lt; offset; }  uint64_t MulMod2(uint32_t left, uint32_t right) { uint64_t result = 0; uint64_t offset = 0; while(right) { if (right &amp; 1) result ^= left &lt;&lt; offset; ++offset; right >>= 1; } return result; }  size_t maxbit(uint64_t value) { size_t retval = 0; while(value) { value >>= 1; ++retval; } return retval; }  uint32_t ModGenP(uint64_t value, uint64_t gen_polynom) { while (true) { size_t vmaxbit = maxbit(value); size_t pmaxbit = maxbit(gen_polynom);  if (vmaxbit &lt; pmaxbit) return (uint32_t) value;  size_t quotient = 1 &lt;&lt; (vmaxbit - pmaxbit); value ^= gen_polynom * quotient; } }  Number operator*(Number left, Number right) { uint64_t gen_p = (1ULL &lt;&lt; 32) + (1 &lt;&lt; 22) + (1 &lt;&lt; 2) + (1 &lt;&lt; 1) + 1; uint64_t value = MulMod2(left.value, right.value); return ModGenP(value, gen_p); }  uint32_t incr_l(uint32_t input) { uint16_t L = (input &amp; 0xffff0000) >> 16; uint16_t R = (input &amp; 0x0000ffff);  ++L;  return (L &lt;&lt; 16) + R; }  uint32_t incr_r(uint32_t input) { uint16_t L = (input &amp; 0xffff0000) >> 16; uint16_t R = (input &amp; 0x0000ffff);  ++R;  return (L &lt;&lt; 16) + R; }  uint32_t MSB(uint32_t number, size_t size) { return number &amp; (0xffffffff - ((1 &lt;&lt; size) - 1)); }  constexpr uint32_t Get0orN() { constexpr uint32_t nonce = 0x5678; constexpr uint32_t zero  = 0;  return (zero &lt;&lt; 31) + nonce; }  constexpr uint32_t Get1orN() { constexpr uint32_t nonce = 0x5678; constexpr uint32_t one   = 1;  return (one &lt;&lt; 31) + nonce; }  uint32_t Shifr(uint32_t input) { return input; }  void FillY(Number* Y, size_t count) { Y[0] = Shifr(Get0orN()); for(size_t i = 1; i &lt; count; ++i) Y[i] = incr_r(Y[i - 1]); }  void FillZ(Number* Z, size_t count) { Z[0] = Shifr(Get1orN()); for(size_t i = 1; i &lt; count; ++i) Z[i] = incr_l(Z[i - 1]); }  void FillH(Number* H, Number* Z, size_t count) { for(size_t i = 0; i &lt; count; ++i) H[i] = Shifr(Z[i]); }  int main() { constexpr size_t N = 10; constexpr size_t M = 10;  Number Y[N]; Number Z[N + M + 1];  FillY(Y, N); FillZ(Z, N + M + 1);  Number P[N] = {0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0x10}; Number C[N];  for(size_t i = 0; i &lt; N; ++i) C[i] = Number(Shifr(Y[i])) + P[i];  Number A[M] = {0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0x10}; Number H[N + M + 1];  FillH(H, Z, N + M + 1);  \/\/ \u043c\u0430\u0441\u0441\u0438\u0432 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0445 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f Number V[21]; for(size_t i = 0; i &lt; M; ++i) V[i] = H[i + 0] * A[i]; for(size_t i = 0; i &lt; N; ++i) V[i] = H[i + M] * P[i];  uint16_t lenC = N * 32; uint16_t lenA = M * 32; uint32_t lenS = (lenA &lt;&lt; 16) + lenC;  V[N + M] = H[N + M] * Number(lenS);  Number sum = V[0]; for(size_t i = 1; i &lt;= N + M; ++i) sum = sum + V[i];  \/\/ \u0438\u043c\u0438\u0442\u043e\u0432\u0441\u0442\u0430\u0432\u043a\u0430 uint32_t T = MSB(Shifr(sum), 11);  for(size_t i = 0; i &lt; N; ++i) std::cout &lt;&lt; C[i] &lt;&lt; ' '; std::cout &lt;&lt; std::endl; std::cout &lt;&lt; \"T = 0x\" &lt;&lt; std::hex &lt;&lt; T &lt;&lt; std::endl; return 0; }<\/code><\/pre>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u0421\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u0441\u0442\u0430\u0442\u044c\u0438<\/summary>\n<div class=\"spoiler__content\">\n<p>AEAD-MGM<\/p>\n<ol>\n<li>\n<p><a href=\"https:\/\/files.stroyinf.ru\/Index2\/1\/4293727\/4293727270.htm\" rel=\"noopener noreferrer nofollow\">https:\/\/files.stroyinf.ru\/Index2\/1\/4293727\/4293727270.htm<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/tc26.ru\/upload\/iblock\/b28\/%D0%A0%D0%B5%D0%B6%D0%B8%D0%BC%D1%8B%20%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B%20%D0%B1%D0%BB%D0%BE%D1%87%D0%BD%D1%8B%D1%85%20%D1%88%D0%B8%D1%84%D1%80%D0%BE%D0%B2,%20%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D1%83%D1%8E%D1%89%D0%B8%D0%B5%20%D0%B0%D1%83%D1%82%D0%B5%D0%BD%D1%82%D0%B8%D1%84%D0%B8%D1%86%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%BE%D0%B5%20%D1%88%D0%B8%D1%84%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_1%20%D1%80%D0%B5%D0%B4%D0%B0%D0%BA%D1%86%D0%B8%D1%8F.pdf\" rel=\"noopener noreferrer nofollow\">https:\/\/tc26.ru\/upload\/iblock\/b28\/\u0420\u0435\u0436\u0438\u043c\u044b \u0440\u0430\u0431\u043e\u0442\u044b \u0431\u043b\u043e\u0447\u043d\u044b\u0445 \u0448\u0438\u0444\u0440\u043e\u0432, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0438\u0435 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u0435_1 \u0440\u0435\u0434\u0430\u043a\u0446\u0438\u044f.pdf<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/eprint.iacr.org\/2019\/123.pdf\" rel=\"noopener noreferrer nofollow\">https:\/\/eprint.iacr.org\/2019\/123.pdf<\/a><\/p>\n<\/li>\n<\/ol>\n<p>\u0410\u0440\u0438\u0444\u043c\u0435\u0442\u0438\u043a\u0430 \u043f\u043e\u043b\u0435\u0439 \u0413\u0430\u043b\u0443\u0430 GF(2<sup>n<\/sup>):<\/p>\n<ol>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/post\/212095\/\" rel=\"noopener noreferrer nofollow\">https:\/\/habr.com\/ru\/post\/212095\/<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/itnan.ru\/post.php?c=1&amp;p=528142\" rel=\"noopener noreferrer nofollow\">https:\/\/itnan.ru\/post.php?c=1&amp;p=528142<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/post\/279197\/\" rel=\"noopener noreferrer nofollow\">https:\/\/habr.com\/ru\/post\/279197\/<\/a><\/p>\n<\/li>\n<\/ol>\n<\/div>\n<\/details>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/593369\/\"> https:\/\/habr.com\/ru\/articles\/593369\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0412 2017 \u0433\u043e\u0434\u0443 \u0440\u043e\u0441\u0441\u0438\u0439\u0441\u043a\u043e\u0439 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0435\u0439 \u041a\u0440\u0438\u043f\u0442\u043e\u041f\u0440\u043e \u0431\u044b\u043b \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d \u043d\u043e\u0432\u044b\u0439 AEAD \u0440\u0435\u0436\u0438\u043c \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f Multilinear Galois Mode (MGM). \u0421\u043f\u0443\u0441\u0442\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043e\u043d \u0431\u044b\u043b \u043f\u0440\u0438\u043d\u044f\u0442 \u0432 \u0440\u043e\u0441\u0441\u0438\u0439\u0441\u043a\u0438\u0435 \u0438 \u043c\u0435\u0436\u0434\u0443\u043d\u0430\u0440\u043e\u0434\u043d\u044b\u0435 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u044b. \u0422\u0430\u043a \u043a\u0430\u043a \u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435 \u044f \u0441\u043c\u043e\u0433 \u043d\u0430\u0439\u0442\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0431\u0449\u0435\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u044d\u0442\u043e\u0433\u043e \u0440\u0435\u0436\u0438\u043c\u0430 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u0435\u0437 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 (\u0441\u0441\u044b\u043b\u043a\u0438 \u0432 \u043a\u043e\u043d\u0446\u0435 \u0441\u0442\u0430\u0442\u044c\u0438), \u0442\u043e \u044f \u0440\u0435\u0448\u0438\u043b \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u0441\u0438\u043b\u044b \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0447\u0435\u043d\u044c \u0443\u043f\u0440\u043e\u0449\u0451\u043d\u043d\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u0441\u0432\u043e\u0438\u043c\u0438 \u0440\u0443\u043a\u0430\u043c\u0438&#8230;<\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0440\u0430\u0437\u0431\u0435\u0440\u0451\u043c\u0441\u044f \u0441\u043e \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c\u0438, \u043d\u043e \u0432\u0430\u0436\u043d\u044b\u043c\u0438 \u0434\u043b\u044f \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u0432\u0435\u0449\u0430\u043c\u0438.<\/p>\n<h2>\u0428\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u0435 vs \u0440\u0435\u0436\u0438\u043c \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f<\/h2>\n<p>\u0428\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u0435 &#8212; \u044d\u0442\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0432\u0438\u0434\u0430, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0433\u043e \u0442\u0435\u043a\u0441\u0442\u0430 P \u0432 \u0448\u0438\u0444\u0440\u043e\u0442\u0435\u043a\u0441\u0442 \u0421 \u0441 \u0438c\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043a\u043b\u044e\u0447\u0430 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f K. \u041f\u0440\u0438\u043c\u0435\u0440\u043e\u043c \u0442\u0430\u043a\u043e\u0433\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u0441\u043b\u0443\u0436\u0438\u0442\u044c &#171;\u0448\u0438\u0444\u0440 \u0426\u0435\u0437\u0430\u0440\u044f&#187;, \u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0432 \u0412\u0438\u043a\u0438\u043f\u0435\u0434\u0438\u0438.<\/p>\n<p>\u0420\u0435\u0436\u0438\u043c \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f &#8212; \u044d\u0442\u043e \u043f\u043e\u0434\u0445\u043e\u0434 \u043a \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044e \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0433\u043e \u0442\u0435\u043a\u0441\u0442\u0430 P, \u043f\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043e\u043d \u0440\u0430\u0437\u0431\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0431\u043b\u043e\u043a\u0438 \u0442\u0435\u043a\u0441\u0442\u0430 \u0437\u0430\u0432\u0435\u0434\u043e\u043c\u043e \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0434\u043b\u0438\u043d\u044b. \u0414\u0430\u043b\u0435\u0435 \u043a\u0430\u0436\u0434\u044b\u0439 \u0431\u043b\u043e\u043a \u0448\u0438\u0444\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043c (\u043a\u043b\u044e\u0447 \u041a &#8212; \u043e\u0431\u0449\u0438\u0439 \u0438 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0432\u044b\u0431\u0440\u0430\u043d), \u0430 \u043f\u043e\u0442\u043e\u043c \u043e\u043d\u0438 \u0441\u043e\u0431\u0438\u0440\u0430\u044e\u0442\u0441\u044f \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432\u043c\u0435\u0441\u0442\u0435 \u0432 \u0448\u0438\u0444\u0440\u043e\u0442\u0435\u043a\u0441\u0442 \u0421.<\/p>\n<h2>AEAD-\u0440\u0435\u0436\u0438\u043c \u0431\u043b\u043e\u0447\u043d\u043e\u0433\u043e \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f<\/h2>\n<p>AEAD &#8212; \u044d\u0442\u043e\u00a0\u043a\u043b\u0430\u0441\u0441\u00a0\u0431\u043b\u043e\u0447\u043d\u044b\u0445\u00a0\u0440\u0435\u0436\u0438\u043c\u043e\u0432 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043f\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0447\u0430\u0441\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0448\u0438\u0444\u0440\u0443\u0435\u0442\u0441\u044f, \u0447\u0430\u0441\u0442\u044c \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0439, \u0438 \u0432\u0441\u0451 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043e. \u0418\u043d\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u0435\u0441\u043b\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u044c \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u044e \u0441 \u043f\u043e\u0447\u0442\u043e\u0432\u044b\u043c\u0438 \u043f\u0438\u0441\u044c\u043c\u0430\u043c\u0438, \u0442\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u043f\u0438\u0441\u044c\u043c\u0430 \u0432\u044b \u0448\u0438\u0444\u0440\u0443\u0435\u0442\u0435 (\u0437\u0430\u043f\u0435\u0447\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0435), \u0430\u0434\u0440\u0435\u0441 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044f \u0438 \u0430\u0434\u0440\u0435\u0441 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044f \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0435 \u0441\u043d\u0430\u0440\u0443\u0436\u0438 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0430 (\u043d\u0435 \u0437\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438), \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0447\u0442\u043e\u0432\u044b\u0435 \u0441\u043b\u0443\u0436\u0431\u044b \u0441\u043c\u043e\u0433\u043b\u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0432\u0430\u0448\u0435 \u043f\u0438\u0441\u044c\u043c\u043e, \u0438 \u0435\u0449\u0451 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u044b \u0434\u0435\u043b\u0430\u0435\u0442\u0435 \u043f\u0440\u0438\u043f\u0438\u0441\u043a\u0443, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044c \u0441\u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c (\u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c), \u0447\u0442\u043e \u0432\u0441\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043a\u0430\u043a \u0432\u043d\u0443\u0442\u0440\u0438, \u0442\u0430\u043a \u0438 \u0441\u043d\u0430\u0440\u0443\u0436\u0438 \u043f\u0438\u0441\u044c\u043c\u0430 \u0431\u044b\u043b\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u044b.<\/p>\n<h2>\u0410\u0440\u0438\u0444\u043c\u0435\u0442\u0438\u043a\u0430 \u043f\u043e\u043b\u0435\u0439 \u0413\u0430\u043b\u0443\u0430 GF(2^n)<\/h2>\n<p>\u0410\u0440\u0438\u0444\u043c\u0435\u0442\u0438\u043a\u0430 \u043f\u043e\u043b\u0435\u0439 \u0413\u0430\u043b\u0443\u0430 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0432\u0441\u0435\u043c\u0435\u0441\u0442\u043d\u043e \u0432 \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438, \u0438 \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u043e\u0432 \u0435\u0451 \u0440\u0430\u0431\u043e\u0442\u044b \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u043c \u043a\u043e\u0434\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e. \u0420\u0435\u0436\u0438\u043c \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f AEAD-MGM \u043e\u0442 \u0447\u0438\u0441\u0435\u043b \u0438\u0437 \u043f\u043e\u043b\u0435\u0439 \u0413\u0430\u043b\u0443\u0430 GF(2<sup>n<\/sup>) \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0442\u043e\u043b\u044c\u043a\u043e 2 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 &#8212; \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0438\u0432\u043e\u0434\u044f\u0442\u0441\u044f \u0434\u0430\u043b\u044c\u0448\u0435 \u0432 \u044d\u0442\u043e\u0439 \u0447\u0430\u0441\u0442\u0438, \u044f \u0432\u0437\u044f\u043b \u0438\u0437 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439 <a href=\"https:\/\/habr.com\/ru\/post\/212095\/\" rel=\"noopener noreferrer nofollow\">\u0441\u0442\u0430\u0442\u044c\u0438<\/a>.<\/p>\n<p>\u041e\u043d\u0430 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f \u043a \u043f\u0440\u043e\u0447\u0442\u0435\u043d\u0438\u044e, \u0447\u0442\u043e\u0431\u044b \u0441\u043b\u043e\u0436\u0438\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043b\u043d\u043e\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043e\u0431 \u0430\u0440\u0438\u0444\u043c\u0435\u0442\u0438\u043a\u0435 \u043f\u043e\u043b\u0435\u0439 \u0413\u0430\u043b\u0443\u0430 GF(2<sup>n<\/sup>).<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0435\u0440\u0435\u0439\u0434\u0451\u043c \u043a \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438. \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u043a\u043b\u0430\u0441\u0441 \u0447\u0438\u0441\u0435\u043b \u0432 \u043f\u043e\u043b\u044f\u0445 \u0413\u0430\u043b\u0443\u0430 GF(2<sup>n<\/sup>):<\/p>\n<pre><code class=\"cpp\">\/\/ Galois Field Number \/\/ \u0434\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u043f\u043e\u043a\u0430\u0437\u0430 \u0438\u0434\u0435\u0439 \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0442\u0438\u043f uint32_t \u0432\u044b\u0431\u0440\u0430\u043d \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e class Number { public: Number(): value(0) {} Number(uint32_t value_): value(value_) {}  operator uint32_t() const { return value; }  public: friend Number operator+(Number left, Number right); friend Number operator*(Number left, Number right);  public: friend std::ostream&amp; operator&lt;&lt;(std::ostream&amp; os, Number number) { return os &lt;&lt; number.value; }  public: uint32_t value; };<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432 \u043f\u043e\u043b\u0435 GF(2<sup>n<\/sup>), \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e \u0441\u0443\u0442\u0438 \u0441\u0432\u043e\u0435\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0431\u044b\u0447\u043d\u043e\u0439 \u043f\u043e\u0431\u0438\u0442\u043e\u0432\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0435\u0439 XOR:<\/p>\n<pre><code class=\"cpp\">class Number { ... }  Number operator+(Number left, Number right) { return left.value ^ right.value; }<\/code><\/pre>\n<p>(\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f  \u0432 \u043f\u043e\u043b\u044f\u0445 GF(2<sup>n<\/sup>) \u0442\u0430\u043a\u0436\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0431\u0438\u0442\u043e\u0432\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0435\u0439 XOR)<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f , \u043d\u0430\u043c \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u044c, \u043a\u0430\u043a \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u0432 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438  \u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u043d\u0435\u0451. \u0418\u0437 \u0448\u043a\u043e\u043b\u044b \u043d\u0430\u043c \u0438\u0437\u0432\u0435\u0441\u0442\u0435\u043d \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f \u0432 \u0441\u0442\u043e\u043b\u0431\u0438\u043a:<\/p>\n<p>\u041a\u0430\u043a \u043c\u044b \u0432\u0438\u0434\u0438\u043c, \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e  \u043c\u044b \u0437\u0434\u0435\u0441\u044c \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0441\u043b\u043e\u0436\u0438\u0442\u044c \u0434\u0432\u0430 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0445 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u043e\u0442 \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f 17 \u043d\u0430 5, \u0438 17 \u043d\u0430 20. \u0415\u0441\u043b\u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u043e 25 \u043a\u0430\u043a , \u0442\u043e \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f  \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f \u0447\u0438\u0441\u043b\u0430 17 \u043d\u0430 \u0447\u0438\u0441\u043b\u0430 \u043f\u0440\u0438 \u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u0442\u0435\u043f\u0435\u043d\u044f\u0445 10. \u0415\u0441\u043b\u0438 \u043c\u044b \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c \u0442\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0448\u0438 \u0440\u0430\u0441\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0440\u0430\u0437\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0447\u0438\u0441\u0435\u043b \u043f\u043e \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u044e 2, \u0442\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u0441\u044f.<\/p>\n<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c, \u0432\u0441\u043f\u043e\u043c\u0438\u043d\u0430\u044f \u0447\u0442\u043e \u0432 \u043f\u043e\u043b\u044f\u0445 GF(2<sup>n<\/sup>)  \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f XOR, \u043f\u043e\u043b\u0443\u0447\u0438\u043c<\/p>\n<p>\u0418\u043b\u0438 <\/p>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043f\u0435\u0440\u0432\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u043d\u0430\u0448\u0435\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430 \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f \u0432 \u043f\u043e\u043b\u044f\u0445 GF(2<sup>n<\/sup>):<\/p>\n<pre><code class=\"cpp\">\/\/ \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u044b\u0439 \u0442\u0438\u043f uint64_t \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \/\/ \u0435\u0441\u043b\u0438 a &lt; 2^32 \u0438 b &lt; 2^32, \u0442\u043e a * b &lt; 2^(32 + 32) = 2^64, \u043d\u043e \u043d\u0435 2^32 uint64_t MulMod2(uint32_t left, uint32_t right) { uint64_t result = 0; uint64_t offset = 0; while(right) { if (right &amp; 1) result ^= left &lt;&lt; offset; ++offset; right >>= 1; } return result; }<\/code><\/pre>\n<p>\u0417\u0430\u043c\u0435\u0447\u0443, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043f\u0435\u0440\u0435\u043c\u043d\u043e\u0436\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u043f\u043e\u043c\u0435\u0449\u0430\u044e\u0442\u0441\u044f \u0432 \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0435 \u0441\u043b\u043e\u0432\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, 128 \u0440\u0430\u0437\u0440\u044f\u0434\u043d\u044b\u0435), \u0442\u043e \u043d\u0430\u043c \u0441\u0442\u043e\u0438\u0442 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434. \u041d\u0430 \u044d\u0442\u043e\u0442 \u0440\u0430\u0437 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0442\u044c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0430\u0432\u043e\u0435 \u0447\u0438\u0441\u043b\u043e, \u043d\u043e \u0438 \u043b\u0435\u0432\u043e\u0435, \u0441\u0443\u043c\u043c\u0438\u0440\u0443\u044f \u043f\u043e \u043c\u043e\u0434\u0443\u043b\u044e 2 \u043a\u043e\u043b-\u0432\u043e \u0435\u0434\u0438\u043d\u0438\u0446 \u043f\u0440\u0438 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e\u0439 \u0441\u0442\u0435\u043f\u0435\u043d\u0438 2.<\/p>\n<pre><code class=\"cpp\">\/\/ uint128_t - \u043d\u0435\u043a\u0438\u0439 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u044b\u0439 \u0446\u0435\u043b\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0439 \u0442\u0438\u043f \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 128 \u0431\u0438\u0442 \/\/ uint256_t - 256 \u0431\u0438\u0442 bool testbit(uint256_t value, size_t offset) { return value &amp; (1 &lt;&lt; offset); }  void setbit(uint256_t&amp; value, size_t offset) { value |= 1 &lt;&lt; offset; }  uint256_t MulMod2(uint128_t left, uint128_t right) { uint256_t result = 0; for(size_t k = 0; k &lt; 256; ++k) { size_t sum = 0; for(size_t i = 0, j = k; i &lt;= k; ++i, --j) { if (testbit(left, i) &amp;&amp; testbit(right, j)) sum ^= 1; } if (sum) setbit(result, k); } return result; }<\/code><\/pre>\n<p>\u041e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u0437\u0434\u0435\u0441\u044c \u043f\u0440\u043e\u0449\u0435 \u0432 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u043b\u0435\u0433\u0447\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e\u0442\u0441\u044f.<\/p>\n<p>\u0412\u0442\u043e\u0440\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f \u0432 \u043f\u043e\u043b\u044f\u0445 \u0413\u0430\u043b\u0443\u0430 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u043a\u0430\u043a \u0431\u044b &#171;\u0432\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043e\u0431\u0440\u0430\u0442\u043d\u043e&#187; \u0447\u0438\u0441\u043b\u043e, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0435 \u043e\u0442 MulMod2 \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b [1, 2<sup>n<\/sup>). \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u0440\u043e\u0436\u0434\u0430\u044e\u0449\u0438\u0439 \u043c\u043d\u043e\u0433\u043e\u0447\u043b\u0435\u043d &#8212; \u0447\u0438\u0441\u043b\u043e \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [2<sup>n<\/sup>, 2<sup>n<\/sup> + 2<sup>n<\/sup>), \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043c\u044b \u0434\u0435\u043b\u0438\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043e\u0442 MulMod2. \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0435 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0447\u0438\u0441\u043b\u043e \u0431\u0443\u0434\u0435\u0442 \u043b\u0435\u0436\u0430\u0442\u044c \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [1, 2<sup>n<\/sup>).<\/p>\n<details class=\"spoiler\">\n<summary>\u041e\u0431 \u043e\u0441\u0442\u0430\u0442\u043a\u0435 \u043e\u0442 \u0434\u0435\u043b\u0435\u043d\u0438\u044f<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0418\u0437 \u0448\u043a\u043e\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043c\u044b \u0437\u043d\u0430\u0435\u043c, \u0447\u0442\u043e \u0434\u043b\u044f \u043e\u0431\u044b\u0447\u043d\u043e\u0439 \u0430\u0440\u0438\u0444\u043c\u0435\u0442\u0438\u043a\u0438 \u043e\u0441\u0442\u0430\u0442\u043e\u043a \u043e\u0442 \u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043d\u0430 \u0447\u0438\u0441\u043b\u043e m \u043b\u0435\u0436\u0438\u0442 \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [0, m). \u041f\u043e\u0447\u0435\u043c\u0443 \u0436\u0435 \u0442\u043e\u0433\u0434\u0430 \u0430\u0440\u0438\u0444\u043c\u0435\u0442\u0438\u043a\u0430 \u0432 \u043f\u043e\u043b\u044f\u0445 \u0413\u0430\u043b\u0443\u0430 GF(2<sup>n<\/sup>) \u0434\u043b\u044f \u043f\u043e\u0440\u043e\u0436\u0434\u0430\u044e\u0449\u0435\u0433\u043e \u043c\u043d\u043e\u0433\u043e\u0447\u043b\u0435\u043d\u0430 (2<sup>n<\/sup> + x), 0 &lt; x &lt; 2<sup>n<\/sup> \u043d\u0435 \u0434\u0430\u0451\u0442 \u043d\u0430\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043e\u0441\u0442\u0430\u0442\u043e\u043a (2<sup>n<\/sup> + y), 0 &lt; y &lt; 2<sup>n<\/sup>?<\/p>\n<p>\u041e\u0442\u0432\u0435\u0442 \u0442\u0443\u0442 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0431\u044b \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u043e\u0441\u0442\u0430\u0442\u043e\u043a (2<sup>n<\/sup> + y), \u0442\u043e \u0442\u043e\u0433\u0434\u0430 \u043c\u044b \u0431\u044b \u0441\u043c\u043e\u0433\u043b\u0438 \u0431\u044b \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e<\/p>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a 0 &lt; x &lt; 2<sup>n<\/sup> \u0438 0 &lt; y &lt; 2<sup>n<\/sup>, \u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f XOR \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0430\u0437\u0440\u044f\u0434\u043e\u0432 \u0432 \u0447\u0438\u0441\u043b\u0435, \u0442\u043e z \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0430\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0443 [0, 2<sup>n<\/sup>). \u0422\u0430\u043a \u043a\u0430\u043a 0 \u043d\u0435 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442\u0441\u044f, \u0442\u043e \u0435\u0433\u043e \u043e\u0442\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u043c, \u043f\u043e\u043b\u0443\u0447\u0430\u044f \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b [1, 2<sup>n<\/sup>). \u041f\u043e \u0438\u0442\u043e\u0433\u0443 \u043e\u0441\u0442\u0430\u0442\u043e\u043a (2<sup>n<\/sup> + y) \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043b\u0441\u044f \u0432 \u043e\u0441\u0442\u0430\u0442\u043e\u043a z, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0438\u0442 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0443 [1, 2<sup>n<\/sup>), \u0430 \u044d\u0442\u043e \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u0440\u0435\u0447\u0438\u0442 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044e, \u0447\u0442\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043e\u0441\u0442\u0430\u0442\u043e\u043a (2<sup>n<\/sup> + y)<\/p>\n<\/div>\n<\/details>\n<p>\u0412\u0441\u043f\u043e\u043c\u043d\u0438\u043c \u0448\u043a\u043e\u043b\u044c\u043d\u043e\u0435 \u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0441\u0442\u043e\u043b\u0431\u0438\u043a\u043e\u043c<\/p>\n<figure class=\"\"><figcaption><\/figcaption><\/figure>\n<p>\u0415\u0441\u043b\u0438 \u044d\u0442\u043e \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c \u0432 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0434\u0440\u0443\u0433\u043e\u043c \u0432\u0438\u0434\u0435, \u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f<\/p>\n<p>\u041e\u0441\u0442\u0430\u0442\u043a\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u043c\u0435\u043d\u044c\u0448\u0435 12 * 10<sup>x<\/sup>, \u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0434\u0435\u043b\u0435\u043d\u0438\u0439 13\/12, 15\/12, 30\/12 \u0434\u043e\u043b\u0436\u043d\u044b \u043b\u0435\u0436\u0430\u0442\u044c \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [0, 10), \u0442\u0430\u043a \u043a\u0430\u043a 10 &#8212; \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0441\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f.<\/p>\n<p>\u0412 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0441\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432\u0441\u0451 \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435:<\/p>\n<figure class=\"\"><figcaption><\/figcaption><\/figure>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435 \u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0432 \u0441\u0442\u043e\u043b\u0431\u0438\u043a, \u0435\u0441\u043b\u0438 \u043c\u044b \u0437\u0430\u043c\u0435\u043d\u0438\u043c \u043d\u0430 <\/p>\n<figure class=\"\"><figcaption><\/figcaption><\/figure>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u043c, \u0447\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u043d\u0430\u043c\u0438 \u043e\u0442\u0432\u0435\u0442 \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u044f\u0435\u0442 MulMod2<\/p>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e, \u043d\u0430\u0448 \u043f\u043e\u0434\u0445\u043e\u0434 \u043a \u0434\u0435\u043b\u0435\u043d\u0438\u044e \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u0432\u0435\u0440\u043d\u044b\u043c. \u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e \u0432 \u043a\u043e\u0434\u0435.<\/p>\n<p>\u0414\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u0442\u0435\u043c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e\u043c \u0430\u043b\u0433\u0435\u0431\u0440\u044b \u043f\u043e\u043b\u0435\u0439 \u0413\u0430\u043b\u0443\u0430 GF(2<sup>n<\/sup>), \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u0447\u0438\u0441\u043b\u0430<\/p>\n<p>\u0442\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u0432\u0435\u0441\u0442\u0438<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u044c \u044d\u0442\u043e \u0441 \u0434\u0435\u043b\u0435\u043d\u0438\u0435\u043c \u0441\u0442\u043e\u043b\u0431\u0438\u043a\u043e\u043c, \u0442\u043e \u0430 &#8212; \u0434\u0435\u043b\u0438\u043c\u043e\u0435, b &#8212; \u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044c, q &#8212; \u0431\u0438\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0432 \u0447\u0430\u0441\u0442\u043d\u043e\u0435, &#8212; \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0434\u043b\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438&#8230; \u041a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0430\u043d\u0435\u0442 \u043c\u0435\u043d\u044c\u0448\u0435 b, \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043e\u0441\u0442\u0430\u0442\u043e\u043a. \u0418\u0442\u043e\u0433\u043e \u043a\u043e\u0434 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c:<\/p>\n<pre><code class=\"cpp\">size_t maxbit(uint64_t value) { size_t retval = 0; while(value) { value >>= 1; ++retval; } return retval; }  uint32_t ModGenP(uint64_t value, uint64_t gen_polynom) { while (true) { size_t vmaxbit = maxbit(value); size_t pmaxbit = maxbit(gen_polynom);  if (vmaxbit &lt; pmaxbit) return (uint32_t) value;  size_t quotient = 1 &lt;&lt; (vmaxbit - pmaxbit); value ^= gen_polynom * quotient; } }<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0441\u043e\u0432\u043c\u0435\u0449\u0430\u044f \u0432\u0441\u0451 \u0432\u043c\u0435\u0441\u0442\u0435, \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0438\u0442\u043e\u0433\u043e\u0432\u044b\u0439 \u043a\u043e\u0434 \u0434\u043b\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f \u0432 \u043f\u043e\u043b\u044f\u0445 \u0413\u0430\u043b\u0443\u0430  GF(2<sup>n<\/sup>):<\/p>\n<pre><code class=\"cpp\">class Number { ... }  Number operator*(Number left, Number right) {   \/\/ \u043f\u043e\u0440\u043e\u0436\u0434\u0430\u044e\u0449\u0438\u0439 \u043f\u043e\u043b\u0438\u043d\u043e\u043c: x^32 + x^22 + x^2 + x^1 + 1 uint64_t gen_p = (1ULL &lt;&lt; 32) + (1 &lt;&lt; 22) + (1 &lt;&lt; 2) + (1 &lt;&lt; 1) + 1; uint64_t value = MulMod2(left.value, right.value); return ModGenP(value, gen_p); }<\/code><\/pre>\n<h3>AEAD-MGM<\/h3>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c, \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0432\u0448\u0438\u0441\u044c \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u0441\u043b\u043e\u0436\u043d\u044b\u043c\u0438, \u043d\u043e \u0432\u0430\u0436\u043d\u044b\u043c\u0438 \u043c\u043e\u043c\u0435\u043d\u0442\u0430\u043c\u0438, \u043c\u044b \u0433\u043e\u0442\u043e\u0432\u044b \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0443 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f AEAD-MGM&#8230;<\/p>\n<p>\u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0444\u0430\u0439\u043b \u0441 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f \u0431\u0443\u0434\u0443 \u043e\u043f\u0438\u0440\u0430\u0442\u044c\u0441\u044f, \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 <a href=\"https:\/\/files.stroyinf.ru\/Index2\/1\/4293727\/4293727270.htm\" rel=\"noopener noreferrer nofollow\">\u0437\u0434\u0435\u0441\u044c<\/a>:<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u041f\u043e \u0441\u0443\u0442\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439:<\/p>\n<ol>\n<li>\n<p>\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044e nonce (\u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043e\u0431\u043c\u0435\u043d\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u043c\u0438)<\/p>\n<\/li>\n<li>\n<p>\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044e  \u0438 <\/p>\n<\/li>\n<li>\n<p>\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044e \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432 Y, Z, H.<\/p>\n<\/li>\n<li>\n<p>\u0414\u0435\u043b\u0435\u043d\u0438\u0435 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 (A \u0438 P) \u043d\u0430 \u0431\u043b\u043e\u043a\u0438 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0433\u043e \u043d\u0430\u043c\u0438 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 (32 \u0431\u0438\u0442\u0430)<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435  \u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044e \u0438\u043c\u0438\u0442\u043e\u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u0422<\/p>\n<\/li>\n<\/ol>\n<p>\u0414\u043b\u044f \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0432 \u043a\u043e\u0434\u0435 \u0431\u0443\u0434\u0435\u043c \u0441\u0447\u0438\u0442\u0430\u0442\u044c, \u0447\u0442\u043e<\/p>\n<ul>\n<li>\n<p>P = N \u0431\u043b\u043e\u043a\u043e\u0432 \u043f\u043e 32 \u0431\u0438\u0442\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0432 \u043a\u0430\u0436\u0434\u043e\u043c<\/p>\n<\/li>\n<li>\n<p>A = M \u0431\u043b\u043e\u043a\u043e\u0432 \u043f\u043e 32 \u0431\u0438\u0442\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0432 \u043a\u0430\u0436\u0434\u043e\u043c<\/p>\n<\/li>\n<li>\n<p>\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 <\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u043e\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c incr_l, incr_r \u0438 \u0435\u0449\u0451 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439:<\/p>\n<pre><code class=\"cpp\">uint32_t incr_l(uint32_t input) {     uint16_t L = (input &amp; 0xffff0000) >> 16;     uint16_t R = (input &amp; 0x0000ffff);          ++L;          return (L &lt;&lt; 16) + R; }  uint32_t incr_r(uint32_t input) {     uint16_t L = (input &amp; 0xffff0000) >> 16;     uint16_t R = (input &amp; 0x0000ffff);          ++R;          return (L &lt;&lt; 16) + R; }  uint32_t MSB(uint32_t number, size_t size) { return number &amp; (0xffffffff - ((1 &lt;&lt; size) - 1)); }  \/\/ nonce - \u043e\u0434\u043d\u043e\u0440\u0430\u0437\u043e\u0432\u044b\u0439 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0432\u0435\u043a\u0442\u043e\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \/\/ \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u043c \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043e\u0431\u043c\u0435\u043d\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u043c\u0438. \u0415\u0433\u043e \u0434\u043b\u0438\u043d\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c (N - 1), \/\/ \u0442.\u0435. \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 (32 - 1) = 31 \u0431\u0438\u0442. \u0412 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u044f\u0445 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u0435\u0433\u043e  \/\/ \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u0447\u0451\u0442\u0447\u0438\u043a\u0430, \u043d\u043e, \u0442\u0430\u043a \u043a\u0430\u043a \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0442\u043e\u043b\u044c\u043a\u043e 1 \u0440\u0430\u0437, \/\/ \u0442\u043e \u0432\u043e\u0437\u044c\u043c\u0451\u043c \u043f\u0440\u043e\u0441\u0442\u043e \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. constexpr uint32_t nonce() {   return 0x5678; \/\/ 0x5 = 0101 (\u043f\u0435\u0440\u0432\u044b\u0439 \u0431\u0438\u0442 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f) }  constexpr uint32_t Get0orN() { return (0 &lt;&lt; 31) + nonce(); }  constexpr uint32_t Get1orN() { return (1 &lt;&lt; 31) + nonce(); }  \/\/ \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f E_k. \u0414\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u044b \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0448\u0438\u0444\u0440\u0443\u0435\u043c. uint32_t \u0415ncrypt(uint32_t input) {     return input; }  \/\/ \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432 Y, Z, H void FillY(Number* Y, size_t count) {     Y[0] = Shifr(Get0orN());     for(size_t i = 1; i &lt; count; ++i)         Y[i] = incr_r(Y[i - 1]); }  void FillZ(Number* Z, size_t count) {     Z[0] = Shifr(Get1orN());     for(size_t i = 1; i &lt; count; ++i)         Z[i] = incr_l(Z[i - 1]); }  void FillH(Number* H, Number* Z, size_t count) {     for(size_t i = 0; i &lt; count; ++i)         H[i] = Shifr(Z[i]); }<\/code><\/pre>\n<p>\u041d\u0443 \u0438 \u043d\u0430\u043a\u043e\u043d\u0435\u0446 \u0441\u0430\u043c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c:<\/p>\n<pre><code class=\"cpp\">int main() { constexpr size_t N = 10; constexpr size_t M = 10;  Number Y[N]; Number Z[N + M + 1];  FillY(Y, N); FillZ(Z, N + M + 1);  Number P[N] =<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-397256","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/397256","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=397256"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/397256\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=397256"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=397256"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=397256"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}