{"id":33820,"date":"2019-10-31T21:54:50","date_gmt":"2019-10-31T18:54:50","guid":{"rendered":"https:\/\/prohoster.info\/blog\/gostim-p2p-f2f-e2ee-im-za-odin-vecher-s-gost-kriptografiej\/"},"modified":"2019-10-31T21:54:50","modified_gmt":"2019-10-31T18:54:50","slug":"gostim-p2p-f2f-e2ee-im-za-odin-vecher-s-gost-kriptografiej","status":"publish","type":"post","link":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/gostim-p2p-f2f-e2ee-im-za-odin-vecher-s-gost-kriptografiej","title":{"rendered":"GOSTIM: P2P F2F E2EE IM an einem Abend mit GOST-Kryptographie","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>\u0411\u0443\u0434\u0443\u0447\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u043c <noindex><a rel=\"nofollow\" href=\"http:\/\/pygost.cypherpunks.ru\/\">PyGOST<\/a><\/noindex> \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 (\u0413\u041e\u0421\u0422\u043e\u0432\u044b\u0435 \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u044b \u043d\u0430 \u0447\u0438\u0441\u0442\u043e\u043c Python), \u044f \u043d\u0435\u0440\u0435\u0434\u043a\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u044e \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u043e \u0442\u043e\u043c \u043a\u0430\u043a \u043d\u0430 \u043a\u043e\u043b\u0435\u043d\u043a\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0438\u0439 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u0439 \u043e\u0431\u043c\u0435\u043d \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u043c\u0438. \u041c\u043d\u043e\u0433\u0438\u0435 \u0441\u0447\u0438\u0442\u0430\u044e\u0442 \u043f\u0440\u0438\u043a\u043b\u0430\u0434\u043d\u0443\u044e \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u044e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0448\u0442\u0443\u043a\u043e\u0439, \u0438 .encrypt() \u0432\u044b\u0437\u043e\u0432\u0430 \u0443 \u0431\u043b\u043e\u0447\u043d\u043e\u0433\u043e \u0448\u0438\u0444\u0440\u0430 \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u043b\u044f \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0439 \u043e\u0442\u0441\u044b\u043b\u043a\u0438 \u043f\u043e \u043a\u0430\u043d\u0430\u043b\u0443 \u0441\u0432\u044f\u0437\u0438. \u0414\u0440\u0443\u0433\u0438\u0435 \u0436\u0435 \u0441\u0447\u0438\u0442\u0430\u044e\u0442, \u0447\u0442\u043e \u043f\u0440\u0438\u043a\u043b\u0430\u0434\u043d\u0430\u044f \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u044f \u2014 \u0443\u0434\u0435\u043b \u043d\u0435\u043c\u043d\u043e\u0433\u0438\u0445, \u0438 \u043f\u0440\u0438\u0435\u043c\u043b\u0435\u043c\u043e, \u0447\u0442\u043e \u0431\u043e\u0433\u0430\u0442\u044b\u0435 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u0442\u0438\u043f\u0430 Telegram \u0441 \u043e\u043b\u0438\u043c\u043f\u0438\u0430\u0434\u043d\u0438\u043a\u0430\u043c\u0438-\u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0430\u043c\u0438 <noindex><a rel=\"nofollow\" href=\"https:\/\/eprint.iacr.org\/2015\/1177.pdf\">\u043d\u0435 \u043c\u043e\u0433\u0443\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c<\/a><\/noindex> \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u0439 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b.<\/p>\n<p>\u0412\u0441\u0451 \u044d\u0442\u043e \u043f\u043e\u0431\u0443\u0434\u0438\u043b\u043e \u043c\u0435\u043d\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u0443\u044e \u0441\u0442\u0430\u0442\u044c\u044e, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u043e\u0432 \u0438 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0433\u043e IM-\u0430 \u043d\u0435 \u0442\u0430\u043a\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430. \u041e\u0434\u043d\u0430\u043a\u043e, \u0438\u0437\u043e\u0431\u0440\u0435\u0442\u0430\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u044b \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0438 \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043b\u044e\u0447\u0435\u0439 \u043d\u0435 \u0441\u0442\u043e\u0438\u0442.<\/p>\n<p><img decoding=\"async\" alt=\"GOSTIM: P2P F2F E2EE IM \u0437\u0430 \u043e\u0434\u0438\u043d \u0432\u0435\u0447\u0435\u0440 \u0441 \u0413\u041e\u0421\u0422-\u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0435\u0439\" src=\"\/wp-content\/uploads\/2019\/05\/60b00088dad119b6fd0047871e2583ac.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n\u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/Peer-to-peer\">peer-to-peer<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/Friend-to-friend\">friend-to-friend<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%A1%D0%BA%D0%B2%D0%BE%D0%B7%D0%BD%D0%BE%D0%B5_%D1%88%D0%B8%D1%84%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5\">end-to-end \u0437\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439<\/a><\/noindex> instant messenger \u0441 <noindex><a rel=\"nofollow\" href=\"http:\/\/webee.technion.ac.il\/~hugo\/sigma-pdf.pdf\">SIGMA-I<\/a><\/noindex> \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u043e\u043c \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0438 \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043b\u044e\u0447\u0435\u0439 (\u043d\u0430 \u0431\u0430\u0437\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/IKE\">IPsec IKE<\/a><\/noindex>), \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0413\u041e\u0421\u0422\u043e\u0432\u044b\u0435 \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b PyGOST \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0438 ASN.1 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u043e\u0439 <noindex><a rel=\"nofollow\" href=\"http:\/\/pyderasn.cypherpunks.ru\/\">PyDERASN<\/a><\/noindex> (\u043f\u0440\u043e \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u044f \u0443\u0436\u0435 <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/444272\/\">\u043f\u0438\u0441\u0430\u043b \u0440\u0430\u043d\u044c\u0448\u0435<\/a><\/noindex>). \u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u0435: \u043e\u043d \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0441\u0442, \u0447\u0442\u043e\u0431\u044b \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441 \u043d\u0443\u043b\u044f \u0437\u0430 \u043e\u0434\u0438\u043d \u0432\u0435\u0447\u0435\u0440 (\u0438\u043b\u0438 \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u0434\u0435\u043d\u044c), \u0438\u043d\u0430\u0447\u0435 \u044d\u0442\u043e \u0443\u0436\u0435 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430. \u0412 \u043d\u0435\u0439 \u043d\u0430\u0432\u0435\u0440\u043d\u044f\u043a\u0430 \u0435\u0441\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0438, \u0438\u0437\u043b\u0438\u0448\u043d\u0438\u0435 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438, \u043d\u0435\u0434\u043e\u0447\u0451\u0442\u044b, \u043f\u043b\u044e\u0441 \u044d\u0442\u043e \u043c\u043e\u044f \u043f\u0435\u0440\u0432\u0430\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c asyncio \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>\u0414\u0438\u0437\u0430\u0439\u043d IM<\/h2>\n<p>\n\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430, \u043d\u0430\u0434\u043e \u043f\u043e\u043d\u044f\u0442\u044c \u043a\u0430\u043a \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u043d\u0430\u0448 IM. \u0414\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u044b, \u043f\u0443\u0441\u043a\u0430\u0439 \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 peer-to-peer \u0441\u0435\u0442\u044c, \u0431\u0435\u0437 \u043a\u0430\u043a\u043e\u0433\u043e-\u043b\u0438\u0431\u043e \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u043e\u0432. \u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0440\u0443\u0447\u043d\u043e \u0431\u0443\u0434\u0435\u043c \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043a \u043a\u0430\u043a\u043e\u043c\u0443 \u0430\u0434\u0440\u0435\u0441\u0443: \u043f\u043e\u0440\u0442\u0443 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u044c\u0441\u044f \u0434\u043b\u044f \u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0441 \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043d\u0438\u043a\u043e\u043c.<\/p>\n<p>\u042f \u043f\u043e\u043d\u0438\u043c\u0430\u044e, \u0447\u0442\u043e, \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442, \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043e \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u044f\u043c\u043e\u0439 \u0441\u0432\u044f\u0437\u0438 \u043c\u0435\u0436\u0434\u0443 \u0434\u0432\u0443\u043c\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u043c\u0438 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0430\u043c\u0438 \u2014 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c\u043e\u0441\u0442\u0438 IM \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435. \u041d\u043e \u0447\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0431\u0443\u0434\u0443\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0432\u0441\u044f\u043a\u0438\u0435 NAT-traversal \u043a\u043e\u0441\u0442\u044b\u043b\u0438, \u0442\u0435\u043c \u0434\u043e\u043b\u044c\u0448\u0435 \u043c\u044b \u0442\u0430\u043a \u0438 \u0431\u0443\u0434\u0435\u043c \u043e\u0441\u0442\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u0432 IPv4 \u0418\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435, \u0441 \u0443\u0434\u0440\u0443\u0447\u0430\u044e\u0449\u0435\u0439 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c\u044e \u0441\u0432\u044f\u0437\u0438 \u043c\u0435\u0436\u0434\u0443 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u043c\u0438 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0430\u043c\u0438. \u041d\u0443 \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u043e\u0436\u043d\u043e \u0442\u0435\u0440\u043f\u0435\u0442\u044c \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 IPv6 \u0434\u043e\u043c\u0430 \u0438 \u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0435?<\/p>\n<p>\u0423 \u043d\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 friend-to-friend \u0441\u0435\u0442\u044c: \u0432\u0441\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043d\u0438\u043a\u0438 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b. \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u044d\u0442\u043e \u0441\u0438\u043b\u044c\u043d\u043e \u0432\u0441\u0451 \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442: \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043b\u0438\u0441\u044c, \u043d\u0430\u0448\u043b\u0438 \u0438\u043b\u0438 \u043d\u0435 \u043d\u0430\u0448\u043b\u0438 \u0438\u043c\u044f\/\u043a\u043b\u044e\u0447, \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u043b\u0438\u0441\u044c \u0438\u043b\u0438 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u0440\u0430\u0431\u043e\u0442\u0443, \u0437\u043d\u0430\u044f \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043d\u0438\u043a\u0430. \u0412\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u0432 \u043e\u0431\u0449\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u044d\u0442\u043e \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e \u0438 \u0438\u0441\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0430\u0442\u0430\u043a.<\/p>\n<p>\u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 IM-\u0430 \u0431\u0443\u0434\u0435\u0442 \u0431\u043b\u0438\u0437\u043e\u043a \u043a \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u044f\u043c <noindex><a rel=\"nofollow\" href=\"https:\/\/suckless.org\/\">suckless-\u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432<\/a><\/noindex>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u043d\u0440\u0430\u0432\u044f\u0442\u0441\u044f \u0441\u0432\u043e\u0438\u043c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u0438\u0437\u043c\u043e\u043c \u0438 Unix-way \u0444\u0438\u043b\u043e\u0441\u043e\u0444\u0438\u0435\u0439. IM \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043d\u0438\u043a\u0430 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e \u0441 \u0442\u0440\u0435\u043c\u044f Unix domain socket:<\/p>\n<ul>\n<li>in \u2014 \u0432 \u043d\u0435\u0433\u043e \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0435 \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043d\u0438\u043a\u0443 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f;<\/li>\n<li>out \u2014 \u0438\u0437 \u043d\u0435\u0433\u043e \u0447\u0438\u0442\u0430\u044e\u0442\u0441\u044f \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u043c\u044b\u0435 \u043e\u0442 \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043d\u0438\u043a\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f;<\/li>\n<li>state \u2014 \u0447\u0438\u0442\u0430\u044f \u0438\u0437 \u043d\u0435\u0433\u043e, \u043c\u044b \u0443\u0437\u043d\u0430\u0451\u043c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0451\u043d \u043b\u0438 \u0441\u0435\u0439\u0447\u0430\u0441 \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043d\u0438\u043a, \u0430\u0434\u0440\u0435\u0441\/\u043f\u043e\u0440\u0442 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f.<\/li>\n<\/ul>\n<p>\n\u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f conn \u0441\u043e\u043a\u0435\u0442, \u0437\u0430\u043f\u0438\u0441\u0430\u0432 \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0445\u043e\u0441\u0442 \u043f\u043e\u0440\u0442, \u043c\u044b \u0438\u043d\u0438\u0446\u0438\u0438\u0440\u0443\u0435\u043c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a \u0443\u0434\u0430\u043b\u0451\u043d\u043d\u043e\u043c\u0443 \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043d\u0438\u043a\u0443.<\/p>\n<pre><code class=\"plaintext\">|-- alice\n|   |-- in\n|   |-- out\n|   `-- state\n|-- bob\n|   |-- in\n|   |-- out\n|   `-- state\n`- conn\n<\/code><\/pre>\n<p>\n\u0422\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 IM \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\u0430 \u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430, \u0432\u0435\u0434\u044c \u043d\u0430 \u0432\u043a\u0443\u0441 \u0438 \u0446\u0432\u0435\u0442 \u0442\u043e\u0432\u0430\u0440\u0438\u0449\u0430 \u043d\u0435\u0442, \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u043d\u0435 \u0443\u0433\u043e\u0434\u0438\u0448\u044c. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tmux\/tmux\/wiki\">tmux<\/a><\/noindex> \u0438\/\u0438\u043b\u0438 <noindex><a rel=\"nofollow\" href=\"https:\/\/www.vanheusden.com\/multitail\/\">multitail<\/a><\/noindex>, \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043c\u043d\u043e\u0433\u043e\u043e\u043a\u043e\u043d\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0441 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043f\u043e\u0434\u0441\u0432\u0435\u0442\u043a\u043e\u0439. \u0410 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/hanslub42\/rlwrap\">rlwrap<\/a><\/noindex> \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c GNU Readline-\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u0434\u043b\u044f \u0432\u0432\u043e\u0434\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439.<\/p>\n<p>\u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, suckless \u043f\u0440\u043e\u0435\u043a\u0442\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 FIFO-\u0444\u0430\u0439\u043b\u044b. \u041b\u0438\u0447\u043d\u043e \u044f \u043d\u0435 \u0441\u043c\u043e\u0433 \u043f\u043e\u043d\u044f\u0442\u044c \u043a\u0430\u043a \u0432 asyncio \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0444\u0430\u0439\u043b\u0430\u043c\u0438 \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u043e \u0431\u0435\u0437 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0440\u0443\u0447\u043d\u043e\u0439 \u043f\u043e\u0434\u043b\u043e\u0436\u043a\u0438 \u0438\u0437 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0445 \u0442\u0440\u0435\u0434\u043e\u0432 (\u0434\u043b\u044f \u0442\u0430\u043a\u0438\u0445 \u0432\u0435\u0449\u0435\u0439 \u0434\u0430\u0432\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u044f\u0437\u044b\u043a <noindex><a rel=\"nofollow\" href=\"https:\/\/golang.org\/\">Go<\/a><\/noindex>). \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0440\u0435\u0448\u0438\u043b \u043e\u0431\u043e\u0439\u0442\u0438\u0441\u044c Unix domain \u0441\u043e\u043a\u0435\u0442\u0430\u043c\u0438. \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u044d\u0442\u043e \u043b\u0438\u0448\u0430\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c echo 2001:470:dead::babe 6666 &gt; conn. \u042f \u0440\u0435\u0448\u0438\u043b \u044d\u0442\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f <noindex><a rel=\"nofollow\" href=\"http:\/\/www.dest-unreach.org\/socat\/\">socat<\/a><\/noindex>: echo 2001:470:dead::babe 6666 | socat \u2014 UNIX-CONNECT:conn, socat READLINE UNIX-CONNECT:alice\/in.<\/p>\n<h2>\u041f\u0435\u0440\u0432\u043e\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0439 \u043d\u0435\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u0439 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b<\/h2>\n<p>\n\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f TCP: \u043e\u043d \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0443 \u0438 \u0435\u0451 \u043f\u043e\u0440\u044f\u0434\u043e\u043a. UDP \u043d\u0435 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442 \u043d\u0438 \u0442\u043e\u0433\u043e, \u043d\u0438 \u0434\u0440\u0443\u0433\u043e\u0433\u043e (\u0447\u0442\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u043c, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u0441\u044f \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u044f), \u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/SCTP\">SCTP<\/a><\/noindex> \u0432 Python \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438 \u043d\u0435\u0442.<\/p>\n<p>\u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u0432 TCP \u043d\u0435\u0442 \u043f\u043e\u043d\u044f\u0442\u0438\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f, \u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0442\u043e\u043a\u0430 \u0431\u0430\u0439\u0442. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u0442\u044c \u0444\u043e\u0440\u043c\u0430\u0442 \u0434\u043b\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439, \u0447\u0442\u043e\u0431\u044b \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0442\u044c \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0431\u043e\u0439 \u0432 \u044d\u0442\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u0435. \u041c\u043e\u0436\u0435\u043c \u0443\u0441\u043b\u043e\u0432\u0438\u0442\u044c\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0438\u043c\u0432\u043e\u043b \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430 \u0441\u0442\u0440\u043e\u043a\u0438. \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u043e\u0434\u043e\u0439\u0434\u0451\u0442, \u043e\u0434\u043d\u0430\u043a\u043e, \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u043d\u0430\u0447\u043d\u0451\u043c \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0448\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f, \u044d\u0442\u043e\u0442 \u0441\u0438\u043c\u0432\u043e\u043b \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u044f\u0432\u0438\u0442\u044c\u0441\u044f \u0433\u0434\u0435 \u0443\u0433\u043e\u0434\u043d\u043e \u0432 \u0448\u0438\u0444\u0440\u043e\u0442\u0435\u043a\u0441\u0442\u0435. \u0412 \u0441\u0435\u0442\u044f\u0445 \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u044b \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0435 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0434\u043b\u0438\u043d\u0443 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432 \u0431\u0430\u0439\u0442\u0430\u0445. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 Python \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438 \u0435\u0441\u0442\u044c xdrlib \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u043e\u043c <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/External_Data_Representation\">XDR<\/a><\/noindex>.<\/p>\n<p>\u041c\u044b \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 TCP \u0447\u0442\u0435\u043d\u0438\u0435\u043c \u2014 \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u043c \u043a\u043e\u0434. \u0427\u0438\u0442\u0430\u0435\u043c \u0432 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u043c \u0446\u0438\u043a\u043b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0441\u043e\u043a\u0435\u0442\u0430, \u043f\u043e\u043a\u0430 \u043d\u0435 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u0443\u0435\u043c \u043f\u043e\u043b\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u0430 \u0434\u043b\u044f \u0442\u0430\u043a\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438 JSON \u0441 XML. \u041d\u043e, \u043a\u043e\u0433\u0434\u0430 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u0441\u044f \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u044f, \u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u043f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0438 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u2014 \u0430 \u044d\u0442\u043e \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0431\u0430\u0439\u0442-\u0432-\u0431\u0430\u0439\u0442 \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u043e\u0433\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u0447\u0435\u0433\u043e \u043d\u0435 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u044e\u0442 JSON\/XML (dumps \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043c\u043e\u0436\u0435\u0442 \u043e\u0442\u043b\u0438\u0447\u0430\u0442\u044c\u0441\u044f).<\/p>\n<p>XDR \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u0442\u0430\u043a\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438, \u043e\u0434\u043d\u0430\u043a\u043e \u044f \u0432\u044b\u0431\u0438\u0440\u0430\u044e ASN.1 \u0441 DER-\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0438 <noindex><a rel=\"nofollow\" href=\"http:\/\/pyderasn.cypherpunks.ru\/\">PyDERASN<\/a><\/noindex> \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443, \u0442\u0430\u043a \u043a\u0430\u043a \u043d\u0430 \u0440\u0443\u043a\u0430\u0445 \u0443 \u043d\u0430\u0441 \u0431\u0443\u0434\u0443\u0442 \u0432\u044b\u0441\u043e\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u0447\u0430\u0441\u0442\u043e \u043f\u0440\u0438\u044f\u0442\u043d\u0435\u0435 \u0438 \u0443\u0434\u043e\u0431\u043d\u0435\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c. \u0412 \u043e\u0442\u043b\u0438\u0447\u0438\u0438 \u043e\u0442 schemaless <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/Bencode\">bencode<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/MessagePack\">MessagePack<\/a><\/noindex> \u0438\u043b\u0438 <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/CBOR\">CBOR<\/a><\/noindex>, ASN.1 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0430\u043f\u0440\u043e\u0442\u0438\u0432 \u0436\u0451\u0441\u0442\u043a\u043e \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0445\u0435\u043c\u044b.<\/p>\n<pre><code class=\"plaintext\"># Msg ::= CHOICE {\n#       text      MsgText,\n#       handshake [0] EXPLICIT MsgHandshake }\nclass Msg(Choice):\n    schema = ((\n        (\"text\", MsgText()),\n        (\"handshake\", MsgHandshake(expl=tag_ctxc(0))),\n    ))\n\n# MsgText ::= SEQUENCE {\n#       text UTF8String (SIZE(1..MaxTextLen))}\nclass MsgText(Sequence):\n    schema = ((\n        (\"text\", UTF8String(bounds=(1, MaxTextLen))),\n    ))\n\n# MsgHandshake ::= SEQUENCE {\n#       peerName UTF8String (SIZE(1..256)) }\nclass MsgHandshake(Sequence):\n    schema = ((\n        (\"peerName\", UTF8String(bounds=(1, 256))),\n    ))\n<\/code><\/pre>\n<p>\n\u041f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u043c\u044b\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435\u043c \u0431\u0443\u0434\u0435\u0442 Msg: \u043b\u0438\u0431\u043e \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0435 MsgText (\u043f\u043e\u043a\u0430 \u0441 \u043e\u0434\u043d\u0438\u043c \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u043c \u043f\u043e\u043b\u0435\u043c), \u043b\u0438\u0431\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0440\u0443\u043a\u043e\u043f\u043e\u0436\u0430\u0442\u0438\u044f MsgHandshake (\u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u0438\u043c\u044f \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043d\u0438\u043a\u0430). \u0421\u0435\u0439\u0447\u0430\u0441 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043f\u0435\u0440\u0435\u0443\u0441\u043b\u043e\u0436\u043d\u0451\u043d\u043d\u044b\u043c, \u043d\u043e \u044d\u0442\u043e \u0437\u0430\u0434\u0435\u043b \u043d\u0430 \u0431\u0443\u0434\u0443\u0449\u0435\u0435.<\/p>\n<pre>\n     \u250c\u2500\u2500\u2500\u2500\u2500\u2510            \u250c\u2500\u2500\u2500\u2500\u2500\u2510\n     \u2502PeerA\u2502            \u2502PeerB\u2502\n     \u2514\u2500\u2500\u252c\u2500\u2500\u2518            \u2514\u2500\u2500\u252c\u2500\u2500\u2518\n        \u2502MsgHandshake(IdA) \u2502\n        \u2502\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&gt;\u2502\n        \u2502                  \u2502\n        \u2502MsgHandshake(IdB) \u2502\n        \u2502&lt;\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2502\n        \u2502                  \u2502\n        \u2502    MsgText()     \u2502\n        \u2502\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&gt;\u2502\n        \u2502                  \u2502\n        \u2502    MsgText()     \u2502\n        \u2502&lt;\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2502\n        \u2502                  \u2502\n<\/pre>\n<h2>IM \u0431\u0435\u0437 \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438<\/h2>\n<p>\n\u041a\u0430\u043a \u044f \u0443\u0436\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u043b, \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0441 \u0441\u043e\u043a\u0435\u0442\u0430\u043c\u0438 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f asyncio \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430. \u041e\u0431\u044a\u044f\u0432\u0438\u043c \u0447\u0442\u043e \u043c\u044b \u043e\u0436\u0438\u0434\u0430\u0435\u043c \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430:<\/p>\n<pre><code class=\"plaintext\">parser = argparse.ArgumentParser(description=\"GOSTIM\")\nparser.add_argument(\n    \"--our-name\",\n    required=True,\n    help=\"Our peer name\",\n)\nparser.add_argument(\n    \"--their-names\",\n    required=True,\n    help=\"Their peer names, comma-separated\",\n)\nparser.add_argument(\n    \"--bind\",\n    default=\"::1\",\n    help=\"Address to listen on\",\n)\nparser.add_argument(\n    \"--port\",\n    type=int,\n    default=6666,\n    help=\"Port to listen on\",\n)\nargs = parser.parse_args()\nOUR_NAME = UTF8String(args.our_name)\nTHEIR_NAMES = set(args.their_names.split(\",\"))\n<\/code><\/pre>\n<p>\n\u0417\u0430\u0434\u0430\u0451\u0442\u0441\u044f \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u0438\u043c\u044f (&#8212;our-name alice). \u0427\u0435\u0440\u0435\u0437 \u0437\u0430\u043f\u044f\u0442\u0443\u044e \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u044f\u044e\u0442\u0441\u044f \u0432\u0441\u0435 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0435 \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043d\u0438\u043a\u0438 (&#8212;their-names bob,eve). \u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u0437 \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043d\u0438\u043a\u043e\u0432, \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f \u0441 Unix \u0441\u043e\u043a\u0435\u0442\u0430\u043c\u0438, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u043e \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u0435 \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 in, out, state:<\/p>\n<pre><code class=\"plaintext\">for peer_name in THEIR_NAMES:\n    makedirs(peer_name, mode=0o700, exist_ok=True)\n    out_queue = asyncio.Queue()\n    OUT_QUEUES[peer_name] = out_queue\n    asyncio.ensure_future(asyncio.start_unix_server(\n        partial(unixsock_out_processor, out_queue=out_queue),\n        path.join(peer_name, \"out\"),\n    ))\n    in_queue = asyncio.Queue()\n    IN_QUEUES[peer_name] = in_queue\n    asyncio.ensure_future(asyncio.start_unix_server(\n        partial(unixsock_in_processor, in_queue=in_queue),\n        path.join(peer_name, \"in\"),\n    ))\n    asyncio.ensure_future(asyncio.start_unix_server(\n        partial(unixsock_state_processor, peer_name=peer_name),\n        path.join(peer_name, \"state\"),\n    ))\nasyncio.ensure_future(asyncio.start_unix_server(unixsock_conn_processor, \"conn\"))\n<\/code><\/pre>\n<p>\n\u041f\u0440\u0438\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u043e\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0438\u0437 in \u0441\u043e\u043a\u0435\u0442\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0432 IN_QUEUES \u043e\u0447\u0435\u0440\u0435\u0434\u0438:<\/p>\n<pre><code class=\"plaintext\">async def unixsock_in_processor(reader, writer, in_queue: asyncio.Queue) -&gt; None:\n    while True:\n        text = await reader.read(MaxTextLen)\n        if text == b\"\":\n            break\n        await in_queue.put(text.decode(\"utf-8\"))\n<\/code><\/pre>\n<p>\n\u041f\u0440\u0438\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u043e\u0442 \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043d\u0438\u043a\u043e\u0432 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0432 OUT_QUEUES \u043e\u0447\u0435\u0440\u0435\u0434\u0438, \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0432 out \u0441\u043e\u043a\u0435\u0442:<\/p>\n<pre><code class=\"plaintext\">async def unixsock_out_processor(reader, writer, out_queue: asyncio.Queue) -&gt; None:\n    while True:\n        text = await out_queue.get()\n        writer.write((\"[%s] %s\" % (datetime.now(), text)).encode(\"utf-8\"))\n        await writer.drain()\n<\/code><\/pre>\n<p>\n\u041f\u0440\u0438 \u0447\u0442\u0435\u043d\u0438\u0438 \u0438\u0437 state \u0441\u043e\u043a\u0435\u0442\u0430, \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0438\u0449\u0435\u0442 \u0432 PEER_ALIVE \u0441\u043b\u043e\u0432\u0430\u0440\u0435 \u0430\u0434\u0440\u0435\u0441 \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043d\u0438\u043a\u0430. \u0415\u0441\u043b\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043d\u0438\u043a\u0443 \u0435\u0449\u0451 \u043d\u0435\u0442, \u0442\u043e \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0443\u0441\u0442\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430.<\/p>\n<pre><code class=\"plaintext\">async def unixsock_state_processor(reader, writer, peer_name: str) -&gt; None:\n    peer_writer = PEER_ALIVES.get(peer_name)\n    writer.write(\n        b\"\" if peer_writer is None else (\" \".join([\n            str(i) for i in peer_writer.get_extra_info(\"peername\")[:2]\n        ]).encode(\"utf-8\") + b\"n\")\n    )\n    await writer.drain()\n    writer.close()\n<\/code><\/pre>\n<p>\n\u041f\u0440\u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u0430\u0434\u0440\u0435\u0441\u0430 \u0432 conn \u0441\u043e\u043a\u0435\u0442, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u00ab\u0438\u043d\u0438\u0446\u0438\u0430\u0442\u043e\u0440\u0430\u00bb \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f:<\/p>\n<pre><code class=\"plaintext\">async def unixsock_conn_processor(reader, writer) -&gt; None:\n    data = await reader.read(256)\n    writer.close()\n    host, port = data.decode(\"utf-8\").split(\" \")\n    await initiator(host=host, port=int(port))\n<\/code><\/pre>\n<p>\n\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0438\u043d\u0438\u0446\u0438\u0430\u0442\u043e\u0440\u0430. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043e\u043d, \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0434\u043e \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u0445\u043e\u0441\u0442\u0430\/\u043f\u043e\u0440\u0442\u0430 \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 handshake \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0441\u043e \u0441\u0432\u043e\u0438\u043c \u0438\u043c\u0435\u043d\u0435\u043c:<\/p>\n<pre><code class=\"plaintext\"> 130 async def initiator(host, port):\n 131     _id = repr((host, port))\n 132     logging.info(\"%s: dialing\", _id)\n 133     reader, writer = await asyncio.open_connection(host, port)\n 134     # Handshake message {{{\n 135     writer.write(Msg((\"handshake\", MsgHandshake((\n 136         (\"peerName\", OUR_NAME),\n 137     )))).encode())\n 138     # }}}\n 139     await writer.drain()\n<\/code><\/pre>\n<p>\n\u0417\u0430\u0442\u0435\u043c, \u0436\u0434\u0451\u0442 \u043e\u0442\u0432\u0435\u0442\u0430 \u043e\u0442 \u0443\u0434\u0430\u043b\u0451\u043d\u043d\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b. \u041f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u0448\u0435\u0434\u0448\u0438\u0439 \u043e\u0442\u0432\u0435\u0442 \u043f\u043e Msg ASN.1 \u0441\u0445\u0435\u043c\u0435. \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u043c \u0447\u0442\u043e \u0432\u0441\u0451 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e \u043e\u0434\u043d\u0438\u043c TCP-\u0441\u0435\u0433\u043c\u0435\u043d\u0442\u043e\u043c \u0438 \u043c\u044b \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u043e \u0435\u0433\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u043f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 .read(). \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0447\u0442\u043e \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0438\u043c\u0435\u043d\u043d\u043e handshake \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435.<\/p>\n<pre><code class=\"plaintext\"> 141     # Wait for Handshake message {{{\n 142     data = await reader.read(256)\n 143     if data == b\"\":\n 144         logging.warning(\"%s: no answer, disconnecting\", _id)\n 145         writer.close()\n 146         return\n 147     try:\n 148         msg, _ = Msg().decode(data)\n 149     except ASN1Error:\n 150         logging.warning(\"%s: undecodable answer, disconnecting\", _id)\n 151         writer.close()\n 152         return\n 153     logging.info(\"%s: got %s message\", _id, msg.choice)\n 154     if msg.choice != \"handshake\":\n 155         logging.warning(\"%s: unexpected message, disconnecting\", _id)\n 156         writer.close()\n 157         return\n 158     # }}}\n<\/code><\/pre>\n<p>\n\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0447\u0442\u043e \u043f\u0440\u0438\u0448\u0435\u0434\u0448\u0435\u0435 \u0438\u043c\u044f \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043d\u0438\u043a\u0430 \u043d\u0430\u043c \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e. \u0415\u0441\u043b\u0438 \u043d\u0435\u0442, \u0442\u043e \u0440\u0432\u0451\u043c \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435. \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043d\u0435 \u0431\u044b\u043b\u043e \u043b\u0438 \u0443 \u043d\u0430\u0441 \u0443\u0436\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e \u0441 \u043d\u0438\u043c \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 (\u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043d\u0438\u043a \u0432\u043d\u043e\u0432\u044c \u0434\u0430\u043b \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u043d\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a \u043d\u0430\u043c) \u0438 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0435\u0433\u043e. \u0412 IN_QUEUES \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u043e\u043c\u0435\u0449\u0430\u044e\u0442\u0441\u044f Python-\u0441\u0442\u0440\u043e\u043a\u0438 \u0441 \u0442\u0435\u043a\u0441\u0442\u043e\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f, \u043d\u043e \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u043e\u0441\u043e\u0431\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 None, \u0441\u0438\u0433\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u044e\u0449\u0435\u0435 msg_sender \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u0443 \u043f\u0440\u0435\u043a\u0440\u0430\u0442\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0430 \u0437\u0430\u0431\u044b\u043b\u0430 \u043e \u0441\u0432\u043e\u0451\u043c writer, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u043c \u0441 \u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0438\u043c TCP-\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435\u043c.<\/p>\n<pre><code class=\"plaintext\"> 159     msg_handshake = msg.value\n 160     peer_name = str(msg_handshake[\"peerName\"])\n 161     if peer_name not in THEIR_NAMES:\n 162         logging.warning(\"unknown peer name: %s\", peer_name)\n 163         writer.close()\n 164         return\n 165     logging.info(\"%s: session established: %s\", _id, peer_name)\n 166     # Run text message sender, initialize transport decoder {{{\n 167     peer_alive = PEER_ALIVES.pop(peer_name, None)\n 168     if peer_alive is not None:\n 169         peer_alive.close()\n 170         await IN_QUEUES[peer_name].put(None)\n 171     PEER_ALIVES[peer_name] = writer\n 172     asyncio.ensure_future(msg_sender(peer_name, writer))\n 173     # }}}\n<\/code><\/pre>\n<p>\nmsg_sender \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f (\u043f\u043e\u0434\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u043c\u044b\u0435 \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0438\u0437 in \u0441\u043e\u043a\u0435\u0442\u0430), \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u0438\u0445 \u0432 MsgText \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u043e TCP-\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044e. \u041e\u043d\u043e \u043c\u043e\u0436\u0435\u0442 \u043e\u0431\u043e\u0440\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u043b\u044e\u0431\u043e\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u2014 \u044d\u0442\u043e \u043c\u044b \u044f\u0432\u043d\u043e \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0435\u043c.<\/p>\n<pre><code class=\"plaintext\">async def msg_sender(peer_name: str, writer) -&gt; None:\n    in_queue = IN_QUEUES[peer_name]\n    while True:\n        text = await in_queue.get()\n        if text is None:\n            break\n        writer.write(Msg((\"text\", MsgText((\n            (\"text\", UTF8String(text)),\n        )))).encode())\n        try:\n            await writer.drain()\n        except ConnectionResetError:\n            del PEER_ALIVES[peer_name]\n            return\n        logging.info(\"%s: sent %d characters message\", peer_name, len(text))\n<\/code><\/pre>\n<p>\n\u0412 \u043a\u043e\u043d\u0446\u0435 \u0438\u043d\u0438\u0446\u0438\u0430\u0442\u043e\u0440 \u0432\u0445\u043e\u0434\u0438\u0442 \u0432 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u0447\u0442\u0435\u043d\u0438\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0438\u0437 \u0441\u043e\u043a\u0435\u0442\u0430. \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0435 \u043b\u0438 \u044d\u0442\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0438 \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u0442 \u0432 OUT_QUEUES \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043e\u043d\u0438 \u0431\u0443\u0434\u0443\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u044b \u0432 out \u0441\u043e\u043a\u0435\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043d\u0438\u043a\u0430. \u041f\u043e\u0447\u0435\u043c\u0443 \u043d\u0435\u043b\u044c\u0437\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c .read() \u0438 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435? \u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043d\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0430 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f, \u043a\u043e\u0433\u0434\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u043e\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0431\u0443\u0434\u0443\u0442 \u0430\u0433\u0440\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0432 \u0431\u0443\u0444\u0435\u0440\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u044b \u043e\u0434\u043d\u0438\u043c TCP-\u0441\u0435\u0433\u043c\u0435\u043d\u0442\u043e\u043c. \u0414\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u043e \u043c\u044b \u0441\u043c\u043e\u0436\u0435\u043c \u043f\u0435\u0440\u0432\u043e\u0435, \u0430 \u0434\u0430\u043b\u044c\u0448\u0435 \u0432 \u0431\u0443\u0444\u0435\u0440\u0435 \u043c\u043e\u0436\u0435\u0442 \u043e\u0441\u0442\u0430\u0442\u044c\u0441\u044f \u0447\u0430\u0441\u0442\u044c \u043e\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e. \u041f\u0440\u0438 \u043b\u044e\u0431\u043e\u0439 \u043d\u0435\u0448\u0442\u0430\u0442\u043d\u043e\u0439 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438 \u043c\u044b \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u043c TCP-\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0438 \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c msg_sender \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u0443 (\u043f\u043e\u0441\u044b\u043b\u043a\u043e\u0439 None \u0432 OUT_QUEUES \u043e\u0447\u0435\u0440\u0435\u0434\u044c).<\/p>\n<pre><code class=\"plaintext\"> 174     buf = b\"\"\n 175     # Wait for test messages {{{\n 176     while True:\n 177         data = await reader.read(MaxMsgLen)\n 178         if data == b\"\":\n 179             break\n 180         buf += data\n 181         if len(buf) &gt; MaxMsgLen:\n 182             logging.warning(\"%s: max buffer size exceeded\", _id)\n 183             break\n 184         try:\n 185             msg, tail = Msg().decode(buf)\n 186         except ASN1Error:\n 187             continue\n 188         buf = tail\n 189         if msg.choice != \"text\":\n 190             logging.warning(\"%s: unexpected %s message\", _id, msg.choice)\n 191             break\n 192         try:\n 193             await msg_receiver(msg.value, peer_name)\n 194         except ValueError as err:\n 195             logging.warning(\"%s: %s\", err)\n 196             break\n 197     # }}}\n 198     logging.info(\"%s: disconnecting: %s\", _id, peer_name)\n 199     IN_QUEUES[peer_name].put(None)\n 200     writer.close()\n\n  66 async def msg_receiver(msg_text: MsgText, peer_name: str) -&gt; None:\n  67     text = str(msg_text[\"text\"])\n  68     logging.info(\"%s: received %d characters message\", peer_name, len(text))\n  69     await OUT_QUEUES[peer_name].put(text)\n<\/code><\/pre>\n<p>\n\u0412\u0435\u0440\u043d\u0451\u043c\u0441\u044f \u043a \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c\u0443 \u043a\u043e\u0434\u0443. \u041f\u043e\u0441\u043b\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u043a\u043e\u0440\u0443\u0442\u0438\u043d \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b, \u043c\u044b \u0441\u0442\u0430\u0440\u0442\u0443\u0435\u043c TCP-\u0441\u0435\u0440\u0432\u0435\u0440. \u041d\u0430 \u043a\u0430\u0436\u0434\u043e\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u043e\u043d \u0441\u043e\u0437\u0434\u0430\u0451\u0442 responder (\u043e\u0442\u0432\u0435\u0442\u0447\u0438\u043a) \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u0443.<\/p>\n<pre><code class=\"plaintext\">logging.basicConfig(\n    level=logging.INFO,\n    format=\"%(levelname)s %(asctime)s: %(funcName)s: %(message)s\",\n)\nloop = asyncio.get_event_loop()\nserver = loop.run_until_complete(asyncio.start_server(responder, args.bind, args.port))\nlogging.info(\"Listening on: %s\", server.sockets[0].getsockname())\nloop.run_forever()\n<\/code><\/pre>\n<p>\nresponder \u0441\u0445\u043e\u0436 \u0441 initiator \u0438 \u0437\u0435\u0440\u043a\u0430\u043b\u044c\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0432\u0441\u0435 \u0442\u0435 \u0436\u0435 \u0441\u0430\u043c\u044b\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f, \u043d\u043e \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u0447\u0442\u0435\u043d\u0438\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0441\u0440\u0430\u0437\u0443 \u0436\u0435, \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u044b. \u0421\u0435\u0439\u0447\u0430\u0441 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u0440\u0443\u043a\u043e\u043f\u043e\u0436\u0430\u0442\u0438\u044f \u043e\u0442\u0441\u044b\u043b\u0430\u0435\u0442 \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044e \u0441 \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u043d\u043e, \u0432 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c, \u0431\u0443\u0434\u0435\u0442 \u043f\u043e \u0434\u0432\u0430 \u043e\u0442 \u0438\u043d\u0438\u0446\u0438\u0430\u0442\u043e\u0440\u0430 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f, \u043f\u043e\u0441\u043b\u0435 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u0440\u0430\u0437\u0443 \u0436\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0445.<\/p>\n<pre><code class=\"plaintext\">  72 async def responder(reader, writer):\n  73     _id = writer.get_extra_info(\"peername\")\n  74     logging.info(\"%s: connected\", _id)\n  75     buf = b\"\"\n  76     msg_expected = \"handshake\"\n  77     peer_name = None\n  78     while True:\n  79         # Read until we get Msg message {{{\n  80         data = await reader.read(MaxMsgLen)\n  81         if data == b\"\":\n  82             logging.info(\"%s: closed connection\", _id)\n  83             break\n  84         buf += data\n  85         if len(buf) &gt; MaxMsgLen:\n  86             logging.warning(\"%s: max buffer size exceeded\", _id)\n  87             break\n  88         try:\n  89             msg, tail = Msg().decode(buf)\n  90         except ASN1Error:\n  91             continue\n  92         buf = tail\n  93         # }}}\n  94         if msg.choice != msg_expected:\n  95             logging.warning(\"%s: unexpected %s message\", _id, msg.choice)\n  96             break\n  97         if msg_expected == \"text\":\n  98             try:\n  99                 await msg_receiver(msg.value, peer_name)\n 100             except ValueError as err:\n 101                 logging.warning(\"%s: %s\", err)\n 102                 break\n 103         # Process Handshake message {{{\n 104         elif msg_expected == \"handshake\":\n 105             logging.info(\"%s: got %s message\", _id, msg_expected)\n 106             msg_handshake = msg.value\n 107             peer_name = str(msg_handshake[\"peerName\"])\n 108             if peer_name not in THEIR_NAMES:\n 109                 logging.warning(\"unknown peer name: %s\", peer_name)\n 110                 break\n 111             writer.write(Msg((\"handshake\", MsgHandshake((\n 112                 (\"peerName\", OUR_NAME),\n 113             )))).encode())\n 114             await writer.drain()\n 115             logging.info(\"%s: session established: %s\", _id, peer_name)\n 116             peer_alive = PEER_ALIVES.pop(peer_name, None)\n 117             if peer_alive is not None:\n 118                 peer_alive.close()\n 119                 await IN_QUEUES[peer_name].put(None)\n 120             PEER_ALIVES[peer_name] = writer\n 121             asyncio.ensure_future(msg_sender(peer_name, writer))\n 122             msg_expected = \"text\"\n 123         # }}}\n 124     logging.info(\"%s: disconnecting\", _id)\n 125     if msg_expected == \"text\":\n 126         IN_QUEUES[peer_name].put(None)\n 127     writer.close()\n<\/code><\/pre>\n<p><\/p>\n<h2>\u0411\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u0439 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b<\/h2>\n<p>\n\u041f\u0440\u0438\u0448\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u043e\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u0438\u0442\u044c \u043d\u0430\u0448\u0435 \u043e\u0431\u0449\u0435\u043d\u0438\u0435. \u0427\u0442\u043e \u0436\u0435 \u043c\u044b \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u043c \u043f\u043e\u0434 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c\u044e \u0438 \u0447\u0442\u043e \u0445\u043e\u0442\u0438\u043c:<\/p>\n<ul>\n<li>\u043a\u043e\u043d\u0444\u0438\u0434\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0445 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439;<\/li>\n<li>\u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0447\u043d\u043e\u0441\u0442\u044c \u0438 \u0446\u0435\u043b\u043e\u0441\u0442\u043d\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0445 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u2014 \u0438\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u043e;<\/li>\n<li>\u0437\u0430\u0449\u0438\u0442\u0430 \u043e\u0442 \u0430\u0442\u0430\u043a \u043f\u0435\u0440\u0435\u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0432\u0430\u043d\u0438\u044f (replay attack) \u2014 \u0444\u0430\u043a\u0442 \u043f\u0440\u043e\u043f\u0430\u0436\u0438 \u0438\u043b\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d (\u0438 \u043c\u044b \u0440\u0435\u0448\u0430\u0435\u043c \u043e\u0431\u0440\u044b\u0432\u0430\u0442\u044c \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435);<\/li>\n<li>\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u0438 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043d\u0438\u043a\u043e\u0432 \u043f\u043e \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0432\u0431\u0438\u0442\u044b\u043c \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u043c \u043a\u043b\u044e\u0447\u0430\u043c \u2014 \u043c\u044b \u0443\u0436\u0435 \u0440\u0435\u0448\u0438\u043b\u0438 \u0440\u0430\u043d\u0435\u0435, \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u043c friend-to-friend \u0441\u0435\u0442\u044c. \u0422\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u043c\u044b \u043f\u043e\u0439\u043c\u0451\u043c \u0441 \u043a\u0435\u043c \u043e\u0431\u0449\u0430\u0435\u043c\u0441\u044f;<\/li>\n<li>\u043d\u0430\u043b\u0438\u0447\u0438\u0435 <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/Perfect_forward_secrecy\">perfect forward secrecy<\/a><\/noindex> \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 (PFS) \u2014 \u043a\u043e\u043c\u043f\u0440\u043e\u043c\u0435\u0442\u0430\u0446\u0438\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u0434\u043e\u043b\u0433\u043e\u0436\u0438\u0432\u0443\u0449\u0435\u0433\u043e \u043a\u043b\u044e\u0447\u0430 \u043f\u043e\u0434\u043f\u0438\u0441\u0438 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u0430 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u044c \u043a \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0447\u0442\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0439 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u043a\u0438. \u0417\u0430\u043f\u0438\u0441\u044c \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u0442\u0440\u0430\u0444\u0438\u043a\u0430 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0431\u0435\u0441\u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0439;<\/li>\n<li>\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c\/\u0432\u0430\u043b\u0438\u0434\u043d\u043e\u0441\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 (\u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\u043d\u044b\u0445 \u0438 \u0440\u0443\u043a\u043e\u043f\u043e\u0436\u0430\u0442\u0438\u044f) \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 \u043e\u0434\u043d\u043e\u0439 TCP-\u0441\u0435\u0441\u0441\u0438\u0438. \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445\/\u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0438\u0437 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0435\u0441\u0441\u0438\u0438 (\u0434\u0430\u0436\u0435 \u0441 \u044d\u0442\u0438\u043c \u0436\u0435 \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043d\u0438\u043a\u043e\u043c) \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0439;<\/li>\n<li>\u043f\u0430\u0441\u0441\u0438\u0432\u043d\u044b\u0439 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u0435\u043b\u044c \u043d\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u0438\u0434\u0435\u0442\u044c \u043d\u0438 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u0432 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439, \u043d\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0445 \u0434\u043e\u043b\u0433\u043e\u0436\u0438\u0432\u0443\u0449\u0438\u0445 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0445 \u043a\u043b\u044e\u0447\u0435\u0439, \u043d\u0438 \u0445\u044d\u0448\u0435\u0439 \u043e\u0442 \u043d\u0438\u0445. \u041d\u0435\u043a\u0430\u044f \u0430\u043d\u043e\u043d\u0438\u043c\u043d\u043e\u0441\u0442\u044c \u043e\u0442 \u043f\u0430\u0441\u0441\u0438\u0432\u043d\u043e\u0433\u043e \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u0435\u043b\u044f.<\/li>\n<\/ul>\n<p>\n\u0423\u0434\u0438\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u043d\u043e \u044d\u0442\u043e\u0442 \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u0441\u0435 \u0445\u043e\u0442\u044f\u0442 \u0438\u043c\u0435\u0442\u044c \u0432 \u043b\u044e\u0431\u043e\u043c \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0435 \u0440\u0443\u043a\u043e\u043f\u043e\u0436\u0430\u0442\u0438\u044f, \u0438 \u043a\u0440\u0430\u0439\u043d\u0435 \u043c\u0430\u043b\u043e \u0438\u0437 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0432 \u0438\u0442\u043e\u0433\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u00ab\u0434\u043e\u043c\u043e\u0440\u043e\u0449\u0435\u043d\u043d\u044b\u0445\u00bb \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u043e\u0432. \u0412\u043e\u0442 \u0438 \u0441\u0435\u0439\u0447\u0430\u0441 \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u0438\u0437\u043e\u0431\u0440\u0435\u0442\u0430\u0442\u044c \u043d\u043e\u0432\u043e\u0433\u043e. \u042f \u0431\u044b \u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u043e\u0432\u0430\u043b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <noindex><a rel=\"nofollow\" href=\"http:\/\/noiseprotocol.org\/\">Noise framework<\/a><\/noindex> \u0434\u043b\u044f \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u043e\u0432, \u043d\u043e \u0432\u044b\u0431\u0435\u0440\u0435\u043c \u0447\u0442\u043e-\u0442\u043e \u043f\u043e\u043f\u0440\u043e\u0449\u0435.<\/p>\n<p>\u041d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b \u0434\u0432\u0430 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/TLS\">TLS<\/a><\/noindex> \u2014 \u0441\u043b\u043e\u0436\u043d\u0435\u0439\u0448\u0438\u0439 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u0441 \u0434\u043b\u0438\u043d\u043d\u043e\u0439 \u0438\u0441\u0442\u043e\u0440\u0438\u0435\u0439 \u0431\u0430\u0433\u043e\u0432, \u043a\u043e\u0441\u044f\u043a\u043e\u0432, \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0435\u0439, \u043f\u043b\u043e\u0445\u043e\u0439 \u043f\u0440\u043e\u0434\u0443\u043c\u0430\u043d\u043d\u043e\u0441\u0442\u0438, \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0438 \u043d\u0435\u0434\u043e\u0447\u0451\u0442\u043e\u0432 (\u0432\u043f\u0440\u043e\u0447\u0435\u043c, \u043a TLS 1.3 \u044d\u0442\u043e \u043c\u0430\u043b\u043e \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f). \u041d\u043e \u043d\u0435 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u043c \u0435\u0433\u043e \u0438\u0437-\u0437\u0430 \u043f\u0435\u0440\u0435\u0443\u0441\u043b\u043e\u0436\u043d\u0451\u043d\u043d\u043e\u0441\u0442\u0438.<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/IPsec\">IPsec<\/a><\/noindex> \u0441 <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/IKE\">IKE<\/a><\/noindex> \u2014 \u043d\u0435 \u0438\u043c\u0435\u044e\u0442 \u0441\u0435\u0440\u044c\u0451\u0437\u043d\u044b\u0445 \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c, \u0445\u043e\u0442\u044f \u0442\u043e\u0436\u0435 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u044b. \u0415\u0441\u043b\u0438 \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u043f\u0440\u043e IKEv1 \u0438 IKEv2, \u0442\u043e \u0438\u0445 \u0438\u0441\u0442\u043e\u043a\u043e\u043c \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/STS_(%D0%BF%D1%80%D0%BE%D1%82%D0%BE%D0%BA%D0%BE%D0%BB)\">STS<\/a><\/noindex>, ISO\/IEC IS 9798-3 \u0438 SIGMA (SIGn-and-MAc) \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u044b \u2014 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u044b\u043c\u0438 \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0437\u0430 \u043e\u0434\u0438\u043d \u0432\u0435\u0447\u0435\u0440.<\/li>\n<\/ul>\n<p>\n\u0427\u0435\u043c SIGMA, \u043a\u0430\u043a \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u0437\u0432\u0435\u043d\u043e \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u044f STS\/ISO \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u043e\u0432, \u0445\u043e\u0440\u043e\u0448? \u041e\u043d \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u044f\u0435\u0442 \u0432\u0441\u0435\u043c \u043d\u0430\u0448\u0438\u043c \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f\u043c (\u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u00ab\u0441\u043a\u0440\u044b\u0442\u0438\u044f\u00bb \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u0432 \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043d\u0438\u043a\u043e\u0432), \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0445 \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c. \u041e\u043d \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u0438\u0441\u0442\u0438\u0447\u0435\u043d \u2014 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0445\u043e\u0442\u044f \u0431\u044b \u043e\u0434\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438\u0437 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u0442 \u043a \u0435\u0433\u043e \u043d\u0435\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438.<\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u0440\u043e\u0439\u0434\u0451\u043c\u0441\u044f \u043e\u0442 \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0435\u0433\u043e \u0434\u043e\u043c\u043e\u0440\u043e\u0449\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 \u0434\u043e SIGMA. \u0421\u0430\u043c\u0430\u044f \u0431\u0430\u0437\u043e\u0432\u0430\u044f \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0449\u0430\u044f \u043d\u0430\u0441 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u044d\u0442\u043e <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%94%D0%B8%D1%84%D1%84%D0%B8-%D0%A5%D0%B5%D0%BB%D0%BB%D0%BC%D0%B0%D0%BD\">\u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043b\u044e\u0447\u0435\u0439<\/a><\/noindex>: \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043e\u0431\u0430 \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0442 \u043e\u0434\u043d\u043e \u0438 \u0442\u043e \u0436\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u043e\u0433\u043e \u043a\u043b\u044e\u0447\u0430. \u041d\u0435 \u0432\u0434\u0430\u0432\u0430\u044f\u0441\u044c \u0432 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438: \u043a\u0430\u0436\u0434\u0430\u044f \u0438\u0437 \u0441\u0442\u043e\u0440\u043e\u043d \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u044d\u0444\u0435\u043c\u0435\u0440\u043d\u0443\u044e (\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0443\u044e\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 \u043e\u0434\u043d\u043e\u0439 \u0441\u0435\u0441\u0441\u0438\u0438) \u043a\u043b\u044e\u0447\u0435\u0432\u0443\u044e \u043f\u0430\u0440\u0443 (\u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 \u0438 \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0439 \u043a\u043b\u044e\u0447\u0438), \u043e\u0431\u043c\u0435\u043d\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u043a\u043b\u044e\u0447\u0430\u043c\u0438, \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u0438\u044f, \u043d\u0430 \u0432\u0445\u043e\u0434 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442 \u0441\u0432\u043e\u0439 \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 \u0438 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043d\u0438\u043a\u0430.<\/p>\n<pre>\n\u250c\u2500\u2500\u2500\u2500\u2500\u2510          \u250c\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502PeerA\u2502          \u2502PeerB\u2502\n\u2514\u2500\u2500\u252c\u2500\u2500\u2518          \u2514\u2500\u2500\u252c\u2500\u2500\u2518\n   \u2502   IdA, PubA    \u2502 \u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557\n   \u2502\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&gt;\u2502 \u2551PrvA, PubA = DHgen()\u2551\n   \u2502                \u2502 \u255a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255d\n   \u2502   IdB, PubB    \u2502 \u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557\n   \u2502&lt;\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2502 \u2551PrvB, PubB = DHgen()\u2551\n   \u2502                \u2502 \u255a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255d\n   \u2500\u2500\u2500\u2500\u2510    \u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557\n       \u2502    \u2551Key = DH(PrvA, PubB)\u2551\n   &lt;\u2500\u2500\u2500\u2518    \u255a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255d\n   \u2502                \u2502\n   \u2502                \u2502\n<\/pre>\n<p>\u041b\u044e\u0431\u043e\u0439 \u043c\u043e\u0436\u0435\u0442 \u0432\u0441\u0442\u0440\u044f\u0442\u044c-\u043f\u043e-\u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0435 \u0438 \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0435 \u043a\u043b\u044e\u0447\u0438 \u0441\u0432\u043e\u0438\u043c\u0438 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c\u0438 \u2014 \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0435 \u043d\u0435\u0442 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043d\u0438\u043a\u043e\u0432. \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u043f\u043e\u0434\u043f\u0438\u0441\u044c \u0434\u043e\u043b\u0433\u043e\u0436\u0438\u0432\u0443\u0449\u0438\u043c\u0438 \u043a\u043b\u044e\u0447\u0430\u043c\u0438.<\/p>\n<pre>\n\u250c\u2500\u2500\u2500\u2500\u2500\u2510                            \u250c\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502PeerA\u2502                            \u2502PeerB\u2502\n\u2514\u2500\u2500\u252c\u2500\u2500\u2518                            \u2514\u2500\u2500\u252c\u2500\u2500\u2518\n   \u2502IdA, PubA, sign(SignPrvA, (PubA)) \u2502 \u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557\n   \u2502\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&gt;\u2502 \u2551SignPrvA, SignPubA = load()\u2551\n   \u2502                                  \u2502 \u2551PrvA, PubA = DHgen()       \u2551\n   \u2502                                  \u2502 \u255a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255d\n   \u2502IdB, PubB, sign(SignPrvB, (PubB)) \u2502 \u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557\n   \u2502&lt;\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2502 \u2551SignPrvB, SignPubB = load()\u2551\n   \u2502                                  \u2502 \u2551PrvB, PubB = DHgen()       \u2551\n   \u2502                                  \u2502 \u255a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255d\n   \u2500\u2500\u2500\u2500\u2510    \u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557   \u2502\n       \u2502    \u2551verify(SignPubB, ...)\u2551   \u2502\n   &lt;\u2500\u2500\u2500\u2518    \u2551Key = DH(PrvA, PubB) \u2551   \u2502\n   \u2502        \u255a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255d   \u2502\n   \u2502                                  \u2502\n<\/pre>\n<p>\u0422\u0430\u043a\u0430\u044f \u043f\u043e\u0434\u043f\u0438\u0441\u044c \u043d\u0435 \u043f\u043e\u0434\u043e\u0439\u0434\u0451\u0442, \u0442\u0430\u043a \u043a\u0430\u043a \u043e\u043d\u0430 \u043d\u0435 \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d\u0430 \u043a \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0441\u0435\u0441\u0441\u0438\u0438. \u0422\u0430\u043a\u0438\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u00ab\u043f\u043e\u0434\u043e\u0439\u0434\u0443\u0442\u00bb \u0438 \u0434\u043b\u044f \u0441\u0435\u0441\u0441\u0438\u0439 \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u0430\u043c\u0438. \u041f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u0435\u0441\u044c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442. \u042d\u0442\u043e \u0432\u044b\u043d\u0443\u0436\u0434\u0430\u0435\u0442 \u0442\u0430\u043a\u0436\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u0441\u044b\u043b\u043a\u0443 \u0435\u0449\u0451 \u043e\u0434\u043d\u043e\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e\u0442 A.<\/p>\n<p>\u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u043a\u0440\u0438\u0442\u0438\u0447\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u0434 \u043f\u043e\u0434\u043f\u0438\u0441\u044c \u0438 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440, \u0442\u0430\u043a \u043a\u0430\u043a, \u0432 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u0434\u043c\u0435\u043d\u0438\u0442\u044c IdXXX \u0438 \u043f\u0435\u0440\u0435\u043f\u043e\u0434\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043a\u043b\u044e\u0447\u043e\u043c \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u043c \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043d\u0438\u043a\u0430. \u0414\u043b\u044f \u043f\u0440\u0435\u0434\u043e\u0442\u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Reflection_attack\">reflection \u0430\u0442\u0430\u043a<\/a><\/noindex>, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0447\u0442\u043e\u0431\u044b \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043f\u043e\u0434 \u043f\u043e\u0434\u043f\u0438\u0441\u044c\u044e \u043d\u0430\u0445\u043e\u0434\u0438\u043b\u0438\u0441\u044c \u0432 \u0447\u0451\u0442\u043a\u043e \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u0435\u0441\u0442\u0430\u0445 \u043f\u043e \u0441\u0432\u043e\u0435\u043c\u0443 \u0441\u043c\u044b\u0441\u043b\u0443: \u0435\u0441\u043b\u0438 A \u043f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 (PubA, PubB), \u0442\u043e B \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c (PubB, PubA). \u042d\u0442\u043e \u0435\u0449\u0451 \u0438 \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043e \u0432\u0430\u0436\u043d\u043e\u0441\u0442\u0438 \u0432\u044b\u0431\u043e\u0440\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0438 \u0444\u043e\u0440\u043c\u0430\u0442\u0430 \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0432 ASN.1 DER \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0441\u043e\u0440\u0442\u0438\u0440\u0443\u044e\u0442\u0441\u044f: SET OF(PubA, PubB) \u0431\u0443\u0434\u0435\u0442 \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u0435\u043d SET OF(PubB, PubA).<\/p>\n<pre>\n\u250c\u2500\u2500\u2500\u2500\u2500\u2510                                       \u250c\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502PeerA\u2502                                       \u2502PeerB\u2502\n\u2514\u2500\u2500\u252c\u2500\u2500\u2518                                       \u2514\u2500\u2500\u252c\u2500\u2500\u2518\n   \u2502                 IdA, PubA                   \u2502 \u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557\n   \u2502\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&gt;\u2502 \u2551SignPrvA, SignPubA = load()\u2551\n   \u2502                                             \u2502 \u2551PrvA, PubA = DHgen()       \u2551\n   \u2502                                             \u2502 \u255a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255d\n   \u2502IdB, PubB, sign(SignPrvB, (IdB, PubA, PubB)) \u2502 \u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557\n   \u2502&lt;\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2502 \u2551SignPrvB, SignPubB = load()\u2551\n   \u2502                                             \u2502 \u2551PrvB, PubB = DHgen()       \u2551\n   \u2502                                             \u2502 \u255a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255d\n   \u2502     sign(SignPrvA, (IdA, PubB, PubA))       \u2502 \u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557\n   \u2502\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&gt;\u2502 \u2551verify(SignPubB, ...)\u2551\n   \u2502                                             \u2502 \u2551Key = DH(PrvA, PubB) \u2551\n   \u2502                                             \u2502 \u255a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255d\n   \u2502                                             \u2502\n<\/pre>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e \u043c\u044b \u0432\u0441\u0451 \u0435\u0449\u0451 \u043d\u0435 \u00ab\u0434\u043e\u043a\u0430\u0437\u0430\u043b\u0438\u00bb \u0447\u0442\u043e \u0432\u044b\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0439 \u043e\u0431\u0449\u0438\u0439 \u043a\u043b\u044e\u0447 \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u0441\u0435\u0441\u0441\u0438\u0438. \u0412 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435, \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u043e\u0439\u0442\u0438\u0441\u044c \u0438 \u0431\u0435\u0437 \u044d\u0442\u043e\u0433\u043e \u0448\u0430\u0433\u0430 \u2014 \u043f\u0435\u0440\u0432\u043e\u0435 \u0436\u0435 \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u0432\u0430\u043b\u0438\u0434\u043d\u044b\u043c, \u043d\u043e \u043c\u044b \u0445\u043e\u0442\u0438\u043c, \u0447\u0442\u043e\u0431\u044b \u043a\u043e\u0433\u0434\u0430 \u0440\u0443\u043a\u043e\u043f\u043e\u0436\u0430\u0442\u0438\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u043e\u0441\u044c, \u0442\u043e \u0431\u044b\u043b\u0438 \u0431\u044b \u0443\u0432\u0435\u0440\u0435\u043d\u044b \u0447\u0442\u043e \u0432\u0441\u0451 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u043e. \u041d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0443 \u043d\u0430\u0441 \u043d\u0430 \u0440\u0443\u043a\u0430\u0445 ISO\/IEC IS 9798-3 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b.<\/p>\n<p>\u041c\u044b \u043c\u043e\u0433\u043b\u0438 \u0431\u044b \u043f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0438 \u0441\u0430\u043c \u0432\u044b\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0439 \u043a\u043b\u044e\u0447. \u042d\u0442\u043e \u043e\u043f\u0430\u0441\u043d\u043e, \u0442\u0430\u043a \u043a\u0430\u043a \u043d\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u043e, \u0447\u0442\u043e \u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u043c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0435 \u043f\u043e\u0434\u043f\u0438\u0441\u0438 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0443\u0442\u0435\u0447\u043a\u0438 (\u043f\u0443\u0441\u043a\u0430\u0439 \u0431\u0438\u0442\u044b-\u043d\u0430-\u043f\u043e\u0434\u043f\u0438\u0441\u044c, \u043d\u043e \u0432\u0441\u0451 \u0436\u0435 \u0443\u0442\u0435\u0447\u043a\u0438). \u041c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0445\u044d\u0448 \u043e\u0442 \u0432\u044b\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043b\u044e\u0447\u0430, \u043d\u043e \u0443\u0442\u0435\u0447\u043a\u0430 \u0434\u0430\u0436\u0435 \u0445\u044d\u0448\u0430 \u043e\u0442 \u0432\u044b\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043b\u044e\u0447\u0430 \u043c\u043e\u0436\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u0446\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u0438 brute-force \u0430\u0442\u0430\u043a\u0435 \u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0432\u044b\u0440\u0430\u0431\u043e\u0442\u043a\u0438. SIGMA \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 MAC \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u044e\u0449\u0443\u044e \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044f.<\/p>\n<pre>\n\u250c\u2500\u2500\u2500\u2500\u2500\u2510                                            \u250c\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502PeerA\u2502                                            \u2502PeerB\u2502\n\u2514\u2500\u2500\u252c\u2500\u2500\u2518                                            \u2514\u2500\u2500\u252c\u2500\u2500\u2518\n   \u2502                    IdA, PubA                     \u2502 \u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557\n   \u2502\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&gt;\u2502 \u2551SignPrvA, SignPubA = load()\u2551\n   \u2502                                                  \u2502 \u2551PrvA, PubA = DHgen()       \u2551\n   \u2502                                                  \u2502 \u255a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255d\n   \u2502IdB, PubB, sign(SignPrvB, (PubA, PubB)), MAC(IdB) \u2502 \u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557\n   \u2502&lt;\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2502 \u2551SignPrvB, SignPubB = load()\u2551\n   \u2502                                                  \u2502 \u2551PrvB, PubB = DHgen()       \u2551\n   \u2502                                                  \u2502 \u255a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255d\n   \u2502                                                  \u2502 \u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557\n   \u2502     sign(SignPrvA, (PubB, PubA)), MAC(IdA)       \u2502 \u2551Key = DH(PrvA, PubB) \u2551\n   \u2502\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&gt;\u2502 \u2551verify(Key, IdB)     \u2551\n   \u2502                                                  \u2502 \u2551verify(SignPubB, ...)\u2551\n   \u2502                                                  \u2502 \u255a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255d\n   \u2502                                                  \u2502\n<\/pre>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438, \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0437\u0430\u0445\u043e\u0442\u0435\u0442\u044c \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u044d\u0444\u0435\u043c\u0435\u0440\u043d\u044b\u0435 \u043a\u043b\u044e\u0447\u0438 (\u0447\u0442\u043e, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043f\u043b\u0430\u0447\u0435\u0432\u043d\u043e \u0434\u043b\u044f PFS). \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u044b \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u043a\u043b\u044e\u0447\u0435\u0432\u0443\u044e \u043f\u0430\u0440\u0443, \u043f\u043e\u043f\u044b\u0442\u0430\u043b\u0438\u0441\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f, \u043d\u043e TCP \u043d\u0435 \u0431\u044b\u043b \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0438\u043b\u0438 \u043e\u0431\u043e\u0440\u0432\u0430\u043b\u0441\u044f \u0433\u0434\u0435-\u0442\u043e \u043d\u0430 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0435 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430. \u0416\u0430\u043b\u043a\u043e \u0442\u0440\u0430\u0442\u0438\u0442\u044c \u043f\u043e\u0442\u0440\u0430\u0447\u0435\u043d\u043d\u0443\u044e \u044d\u043d\u0442\u0440\u043e\u043f\u0438\u044e \u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u043d\u0430 \u043d\u043e\u0432\u0443\u044e \u043f\u0430\u0440\u0443. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0432\u0435\u0434\u0451\u043c, \u0442\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0439, cookie \u2014 \u043f\u0441\u0435\u0432\u0434\u043e\u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0437\u0430\u0449\u0438\u0442\u0438\u0442 \u043e\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0445 replay \u0430\u0442\u0430\u043a \u043f\u0440\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u044d\u0444\u0435\u043c\u0435\u0440\u043d\u044b\u0445 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0445 \u043a\u043b\u044e\u0447\u0435\u0439. \u0418\u0437-\u0437\u0430 binding-\u0430 \u043c\u0435\u0436\u0434\u0443 cookie \u0438 \u044d\u0444\u0435\u043c\u0435\u0440\u043d\u044b\u043c \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u043c \u043a\u043b\u044e\u0447\u043e\u043c, \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u043f\u043e\u043b\u043e\u0436\u043d\u043e\u0433\u043e \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u0430 \u043c\u043e\u0436\u043d\u043e \u0443\u0431\u0440\u0430\u0442\u044c \u0438\u0437 \u043f\u043e\u0434\u043f\u0438\u0441\u0438 \u0437\u0430 \u043d\u0435\u043d\u0430\u0434\u043e\u0431\u043d\u043e\u0441\u0442\u044c\u044e.<\/p>\n<pre>\n\u250c\u2500\u2500\u2500\u2500\u2500\u2510                                                                 \u250c\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502PeerA\u2502                                                                 \u2502PeerB\u2502\n\u2514\u2500\u2500\u252c\u2500\u2500\u2518                                                                 \u2514\u2500\u2500\u252c\u2500\u2500\u2518\n   \u2502                          IdA, PubA, CookieA                           \u2502 \u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557\n   \u2502\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&gt;\u2502 \u2551SignPrvA, SignPubA = load()\u2551\n   \u2502                                                                       \u2502 \u2551PrvA, PubA = DHgen()       \u2551\n   \u2502                                                                       \u2502 \u255a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255d\n   \u2502IdB, PubB, CookieB, sign(SignPrvB, (CookieA, CookieB, PubB)), MAC(IdB) \u2502 \u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557\n   \u2502&lt;\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2502 \u2551SignPrvB, SignPubB = load()\u2551\n   \u2502                                                                       \u2502 \u2551PrvB, PubB = DHgen()       \u2551\n   \u2502                                                                       \u2502 \u255a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255d\n   \u2502                                                                       \u2502 \u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557\n   \u2502          sign(SignPrvA, (CookieB, CookieA, PubA)), MAC(IdA)           \u2502 \u2551Key = DH(PrvA, PubB) \u2551\n   \u2502\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&gt;\u2502 \u2551verify(Key, IdB)     \u2551\n   \u2502                                                                       \u2502 \u2551verify(SignPubB, ...)\u2551\n   \u2502                                                                       \u2502 \u255a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255d\n   \u2502                                                                       \u2502\n<\/pre>\n<p>\u041d\u0430\u043a\u043e\u043d\u0435\u0446, \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u043e\u0441\u0442\u044c \u043d\u0430\u0448\u0438\u0445 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u0432 \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043d\u0438\u043a\u043e\u0432 \u043e\u0442 \u043f\u0430\u0441\u0441\u0438\u0432\u043d\u043e\u0433\u043e \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u0435\u043b\u044f. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e SIGMA \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043e\u0431\u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f \u044d\u0444\u0435\u043c\u0435\u0440\u043d\u044b\u043c\u0438 \u043a\u043b\u044e\u0447\u0430\u043c\u0438, \u0432\u044b\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043e\u0431\u0449\u0438\u0439 \u043a\u043b\u044e\u0447, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0437\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u0442\u044c \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u044e\u0449\u0438\u0435 \u0438 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u044e\u0449\u0438\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f. SIGMA \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0434\u0432\u0430 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430:<\/p>\n<ul>\n<li>SIGMA-I \u2014 \u0437\u0430\u0449\u0438\u0449\u0430\u0435\u0442 \u0438\u043d\u0438\u0446\u0438\u0430\u0442\u043e\u0440\u0430 \u043e\u0442 \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u0430\u0442\u0430\u043a, \u043e\u0442\u0432\u0435\u0442\u0447\u0438\u043a\u0430 \u043e\u0442 \u043f\u0430\u0441\u0441\u0438\u0432\u043d\u044b\u0445: \u0438\u043d\u0438\u0446\u0438\u0430\u0442\u043e\u0440 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u0435\u0442 \u043e\u0442\u0432\u0435\u0442\u0447\u0438\u043a\u0430 \u0438 \u0435\u0441\u043b\u0438 \u0447\u0442\u043e-\u0442\u043e \u043d\u0435 \u0441\u043e\u0448\u043b\u043e\u0441\u044c, \u0442\u043e \u0441\u0432\u043e\u044e \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044e \u043e\u043d \u043d\u0435 \u0432\u044b\u0434\u0430\u0451\u0442. \u041e\u0442\u0432\u0435\u0442\u0447\u0438\u043a \u0436\u0435 \u0432\u044b\u0434\u0430\u0451\u0442 \u0441\u0432\u043e\u044e \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044e \u0435\u0441\u043b\u0438 \u0441 \u043d\u0438\u043c \u043d\u0430\u0447\u0430\u0442\u044c \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b. \u041f\u0430\u0441\u0441\u0438\u0432\u043d\u044b\u0439 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u0435\u043b\u044c \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0443\u0437\u043d\u0430\u0435\u0442;<br \/>\nSIGMA-R \u2014 \u0437\u0430\u0449\u0438\u0449\u0430\u0435\u0442 \u043e\u0442\u0432\u0435\u0442\u0447\u0438\u043a\u0430 \u043e\u0442 \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u0430\u0442\u0430\u043a, \u0438\u043d\u0438\u0446\u0438\u0430\u0442\u043e\u0440\u0430 \u043e\u0442 \u043f\u0430\u0441\u0441\u0438\u0432\u043d\u044b\u0445. \u0412\u0441\u0451 \u0441 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c\u044e \u0434\u043e \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442, \u043d\u043e \u0432 \u044d\u0442\u043e\u043c \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0435 \u0443\u0436\u0435 \u0447\u0435\u0442\u044b\u0440\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0440\u0443\u043a\u043e\u043f\u043e\u0436\u0430\u0442\u0438\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f.<\/p>\n<p>\n\u0412\u044b\u0431\u0438\u0440\u0430\u0435\u043c SIGMA-I \u043a\u0430\u043a \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0445\u043e\u0436\u0438\u0439 \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u043c\u044b \u043e\u0436\u0438\u0434\u0430\u0435\u043c \u043e\u0442 \u043a\u043b\u0438\u0435\u043d\u0442-\u0441\u0435\u0440\u0432\u0435\u0440\u043d\u044b\u0445 \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u044b\u0445 \u0432\u0435\u0449\u0435\u0439: \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0443\u0437\u043d\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0435\u0440, \u0430 \u0441\u0435\u0440\u0432\u0435\u0440 \u0438 \u0442\u0430\u043a \u0437\u043d\u0430\u044e\u0442 \u0432\u0441\u0435. \u041f\u043b\u044e\u0441 \u043e\u043d \u043f\u0440\u043e\u0449\u0435 \u0432 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438\u0437-\u0437\u0430 \u043c\u0435\u043d\u044c\u0448\u0435\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0440\u0443\u043a\u043e\u043f\u043e\u0436\u0430\u0442\u0438\u044f. \u0412\u0441\u0451 \u0447\u0442\u043e \u043c\u044b \u0432\u043d\u043e\u0441\u0438\u043c \u0432 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b, \u0442\u0430\u043a \u044d\u0442\u043e \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0447\u0430\u0441\u0442\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0438 \u043f\u0435\u0440\u0435\u043d\u043e\u0441 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430 A \u0432 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f:<\/p>\n<pre>\n\u250c\u2500\u2500\u2500\u2500\u2500\u2510                                                                        \u250c\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502PeerA\u2502                                                                        \u2502PeerB\u2502\n\u2514\u2500\u2500\u252c\u2500\u2500\u2518                                                                        \u2514\u2500\u2500\u252c\u2500\u2500\u2518\n   \u2502                                PubA, CookieA                                 \u2502 \u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557\n   \u2502\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&gt;\u2502 \u2551SignPrvA, SignPubA = load()\u2551\n   \u2502                                                                              \u2502 \u2551PrvA, PubA = DHgen()       \u2551\n   \u2502                                                                              \u2502 \u255a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255d\n   \u2502PubB, CookieB, Enc((IdB, sign(SignPrvB, (CookieA, CookieB, PubB)), MAC(IdB))) \u2502 \u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557\n   \u2502&lt;\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2502 \u2551SignPrvB, SignPubB = load()\u2551\n   \u2502                                                                              \u2502 \u2551PrvB, PubB = DHgen()       \u2551\n   \u2502                                                                              \u2502 \u255a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255d\n   \u2502                                                                              \u2502 \u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557\n   \u2502       Enc((IdA, sign(SignPrvA, (CookieB, CookieA, PubA)), MAC(IdA)))         \u2502 \u2551Key = DH(PrvA, PubB) \u2551\n   \u2502\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&gt;\u2502 \u2551verify(Key, IdB)     \u2551\n   \u2502                                                                              \u2502 \u2551verify(SignPubB, ...)\u2551\n   \u2502                                                                              \u2502 \u255a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255d\n   \u2502                                                                              \u2502\n<\/pre>\n<ul>\n<li>\u0414\u043b\u044f \u043f\u043e\u0434\u043f\u0438\u0441\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0413\u041e\u0421\u0422 \u0420 <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%93%D0%9E%D0%A1%D0%A2_%D0%A0_34.10-2012\">34.10-2012<\/a><\/noindex> \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0441 256-\u0431\u0438\u0442 \u043a\u043b\u044e\u0447\u0430\u043c\u0438.<\/li>\n<li>\u0414\u043b\u044f \u0432\u044b\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043e\u0431\u0449\u0435\u0433\u043e \u043a\u043b\u044e\u0447\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f 34.10-2012 VKO.<\/li>\n<li>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 MAC \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f CMAC. \u0422\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438 \u044d\u0442\u043e \u043e\u0441\u043e\u0431\u044b\u0439 \u0440\u0435\u0436\u0438\u043c \u0440\u0430\u0431\u043e\u0442\u044b \u0431\u043b\u043e\u0447\u043d\u043e\u0433\u043e \u0448\u0438\u0444\u0440\u0430, \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u0432 \u0413\u041e\u0421\u0422 \u0420 34.13-2015. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0440\u0435\u0436\u0438\u043c\u0430 \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/Kuznechik\">\u041a\u0443\u0437\u043d\u0435\u0447\u0438\u043a<\/a><\/noindex> (34.12-2015).<\/li>\n<li>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430 \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043d\u0438\u043a\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0445\u044d\u0448 \u043e\u0442 \u0435\u0433\u043e \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u043e\u0433\u043e \u043a\u043b\u044e\u0447\u0430. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0445\u044d\u0448\u0430 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%93%D0%9E%D0%A1%D0%A2_%D0%A0_34.11-2012\">\u0421\u0442\u0440\u0438\u0431\u043e\u0433-256<\/a><\/noindex> (34.11-2012 256 \u0431\u0438\u0442).<\/li>\n<\/ul>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0440\u0443\u043a\u043e\u043f\u043e\u0436\u0430\u0442\u0438\u044f \u0443 \u043d\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d \u043e\u0431\u0449\u0438\u0439 \u043a\u043b\u044e\u0447. \u0415\u0433\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\u043d\u044b\u0445 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439. \u042d\u0442\u0430 \u0447\u0430\u0441\u0442\u044c \u0441\u043e\u0432\u0441\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u0438 \u0432 \u043d\u0435\u0439 \u0441\u043b\u043e\u0436\u043d\u043e \u043e\u0448\u0438\u0431\u0438\u0442\u044c\u0441\u044f: \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u043c \u0441\u0447\u0451\u0442\u0447\u0438\u043a \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439, \u0448\u0438\u0444\u0440\u0443\u0435\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435, \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u0435\u043c (MAC) \u0441\u0447\u0451\u0442\u0447\u0438\u043a \u0438 \u0448\u0438\u0444\u0440\u043e\u0442\u0435\u043a\u0441\u0442, \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c. \u041f\u0440\u0438 \u043f\u0440\u0438\u0451\u043c\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0447\u0442\u043e \u0441\u0447\u0451\u0442\u0447\u0438\u043a \u0438\u043c\u0435\u0435\u0442 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u0435\u043c \u0448\u0438\u0444\u0440\u043e\u0442\u0435\u043a\u0441\u0442 \u0441 \u0441\u0447\u0451\u0442\u0447\u0438\u043a\u043e\u043c, \u0434\u0435\u0448\u0438\u0444\u0440\u0443\u0435\u043c. \u041a\u0430\u043a\u0438\u043c \u043a\u043b\u044e\u0447\u043e\u043c \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0440\u0443\u043a\u043e\u043f\u043e\u0436\u0430\u0442\u0438\u044f, \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\u043d\u044b\u0435, \u043a\u0430\u043a\u0438\u043c \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c? \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u043a\u043b\u044e\u0447 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u044d\u0442\u0438\u0445 \u0437\u0430\u0434\u0430\u0447 \u043e\u043f\u0430\u0441\u043d\u043e \u0438 \u043d\u0435\u0440\u0430\u0437\u0443\u043c\u043d\u043e. \u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u044b\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043a\u043b\u044e\u0447\u0438, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F_%D1%84%D0%BE%D1%80%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BB%D1%8E%D1%87%D0%B0\">KDF<\/a><\/noindex> (key derivation function). \u041e\u043f\u044f\u0442\u044c \u0436\u0435, \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u043c\u0443\u0434\u0440\u0438\u0442\u044c \u0438 \u0447\u0442\u043e-\u0442\u043e \u0438\u0437\u043e\u0431\u0440\u0435\u0442\u0430\u0442\u044c: <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/HKDF\">HKDF<\/a><\/noindex> \u0434\u0430\u0432\u043d\u043e \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u0430, \u0445\u043e\u0440\u043e\u0448\u043e \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0430 \u0438 \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c. \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u0432 \u0440\u043e\u0434\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 Python \u043d\u0435\u0442 \u044d\u0442\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c <noindex><a rel=\"nofollow\" href=\"https:\/\/pypi.org\/project\/hkdf\/\">hkdf<\/a><\/noindex> \u043f\u0430\u043a\u0435\u0442. HKDF \u0432\u043d\u0443\u0442\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/HMAC\">HMAC<\/a><\/noindex>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439, \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0445\u044d\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u044e. \u041f\u0440\u0438\u043c\u0435\u0440 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0430 Python \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 Wikipedia \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u0441\u0447\u0438\u0442\u0430\u043d\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u043a\u043e\u0434\u0430. \u041a\u0430\u043a \u0438 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 34.10-2012, \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0445\u044d\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0421\u0442\u0440\u0438\u0431\u043e\u0433-256. \u0412\u044b\u0445\u043e\u0434 \u043d\u0430\u0448\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043b\u044e\u0447\u0435\u0439 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0441\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u043c \u043a\u043b\u044e\u0447\u043e\u043c, \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0431\u0443\u0434\u0443\u0442 \u0432\u044b\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u044e\u0449\u0438\u0435 \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u044b\u0435:<\/p>\n<pre><code class=\"plaintext\">kdf = Hkdf(None, key_session, hash=GOST34112012256)\nkdf.expand(b\"handshake1-mac-identity\")\nkdf.expand(b\"handshake1-enc\")\nkdf.expand(b\"handshake1-mac\")\nkdf.expand(b\"handshake2-mac-identity\")\nkdf.expand(b\"handshake2-enc\")\nkdf.expand(b\"handshake2-mac\")\nkdf.expand(b\"transport-initiator-enc\")\nkdf.expand(b\"transport-initiator-mac\")\nkdf.expand(b\"transport-responder-enc\")\nkdf.expand(b\"transport-responder-mac\")\n<\/code><\/pre>\n<p><\/p>\n<h2>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b\/\u0441\u0445\u0435\u043c\u044b<\/h2>\n<p>\n\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043a\u0430\u043a\u0438\u0435 \u0436\u0435 \u0442\u0435\u043f\u0435\u0440\u044c ASN.1 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0443 \u043d\u0430\u0441 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438\u0441\u044c \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0432\u0441\u0435\u0445 \u044d\u0442\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445:<\/p>\n<pre><code class=\"plaintext\">class Msg(Choice):\n    schema = ((\n        (\"text\", MsgText()),\n        (\"handshake0\", MsgHandshake0(expl=tag_ctxc(0))),\n        (\"handshake1\", MsgHandshake1(expl=tag_ctxc(1))),\n        (\"handshake2\", MsgHandshake2(expl=tag_ctxc(2))),\n    ))\n\nclass MsgText(Sequence):\n    schema = ((\n        (\"payload\", MsgTextPayload()),\n        (\"payloadMac\", MAC()),\n    ))\n\nclass MsgTextPayload(Sequence):\n    schema = ((\n        (\"nonce\", Integer(bounds=(0, float(\"+inf\")))),\n        (\"ciphertext\", OctetString(bounds=(1, MaxTextLen))),\n    ))\n\nclass MsgHandshake0(Sequence):\n    schema = ((\n        (\"cookieInitiator\", Cookie()),\n        (\"pubKeyInitiator\", PubKey()),\n    ))\n\nclass MsgHandshake1(Sequence):\n    schema = ((\n        (\"cookieResponder\", Cookie()),\n        (\"pubKeyResponder\", PubKey()),\n        (\"ukm\", OctetString(bounds=(8, 8))),\n        (\"ciphertext\", OctetString()),\n        (\"ciphertextMac\", MAC()),\n    ))\n\nclass MsgHandshake2(Sequence):\n    schema = ((\n        (\"ciphertext\", OctetString()),\n        (\"ciphertextMac\", MAC()),\n    ))\n\nclass HandshakeTBE(Sequence):\n    schema = ((\n        (\"identity\", OctetString(bounds=(32, 32))),\n        (\"signature\", OctetString(bounds=(64, 64))),\n        (\"identityMac\", MAC()),\n    ))\n\nclass HandshakeTBS(Sequence):\n    schema = ((\n        (\"cookieTheir\", Cookie()),\n        (\"cookieOur\", Cookie()),\n        (\"pubKeyOur\", PubKey()),\n    ))\n\nclass Cookie(OctetString): bounds = (16, 16)\nclass PubKey(OctetString): bounds = (64, 64)\nclass MAC(OctetString): bounds = (16, 16)\n<\/code><\/pre>\n<p>\nHandshakeTBS \u2014 \u0442\u043e, \u0447\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c\u0441\u044f (to be signed). HandshakeTBE \u2014 \u0442\u043e, \u0447\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u043e (to be encrypted). \u041e\u0431\u0440\u0430\u0449\u0430\u044e \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u043f\u043e\u043b\u0435 ukm \u0432 MsgHandshake1. 34.10 VKO, \u0434\u043b\u044f \u0435\u0449\u0451 \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0440\u0430\u043d\u0434\u043e\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0432\u044b\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c\u044b\u0445 \u043a\u043b\u044e\u0447\u0435\u0439, \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 UKM (user keying material) \u2014 \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u044d\u043d\u0442\u0440\u043e\u043f\u0438\u044f.<\/p>\n<h2>\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438 \u0432 \u043a\u043e\u0434<\/h2>\n<p>\n\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043b\u0438\u0448\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u043d\u0435\u0441\u0451\u043d\u043d\u044b\u0435 \u043a \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u043c\u0443 \u043a\u043e\u0434\u0443 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f, \u0442\u0430\u043a \u043a\u0430\u043a \u043a\u0430\u0440\u043a\u0430\u0441 \u043e\u0441\u0442\u0430\u043b\u0441\u044f \u043f\u0440\u0435\u0436\u043d\u0438\u043c (\u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0431\u044b\u043b\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0430 \u043e\u043a\u043e\u043d\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f, \u0430 \u043f\u043e\u0442\u043e\u043c \u0438\u0437 \u043d\u0435\u0451 \u0432\u044b\u043f\u0438\u043b\u0438\u0432\u0430\u043b\u0430\u0441\u044c \u0432\u0441\u044f \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u044f).<\/p>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u0438 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043d\u0438\u043a\u043e\u0432 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u043e \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u043c \u043a\u043b\u044e\u0447\u0430\u043c, \u0442\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u0438\u0445 \u043d\u0430\u0434\u043e \u0433\u0434\u0435-\u0442\u043e \u0434\u043e\u043b\u0433\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u044c. \u0414\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c JSON \u0442\u0430\u043a\u043e\u0433\u043e \u0432\u0438\u0434\u0430:<\/p>\n<pre><code class=\"plaintext\">{\n    \"our\": {\n        \"prv\": \"21254cf66c15e0226ef2669ceee46c87b575f37f9000272f408d0c9283355f98\",\n        \"pub\": \"938c87da5c55b27b7f332d91b202dbef2540979d6ceaa4c35f1b5bfca6df47df0bdae0d3d82beac83cec3e353939489d9981b7eb7a3c58b71df2212d556312a1\"\n    },\n    \"their\": {\n        \"alice\": \"d361a59c25d2ca5a05d21f31168609deeec100570ac98f540416778c93b2c7402fd92640731a707ec67b5410a0feae5b78aeec93c4a455a17570a84f2bc21fce\",\n        \"bob\": \"aade1207dd85ecd283272e7b69c078d5fae75b6e141f7649ad21962042d643512c28a2dbdc12c7ba40eb704af920919511180c18f4d17e07d7f5acd49787224a\"\n    }\n}\n<\/code><\/pre>\n<p>\nour \u2014 \u043d\u0430\u0448\u0430 \u043a\u043b\u044e\u0447\u0435\u0432\u0430\u044f \u043f\u0430\u0440\u0430, \u0448\u0435\u0441\u0442\u043d\u0430\u0434\u0446\u0430\u0442\u0435\u0440\u0438\u0447\u043d\u044b\u0435 \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0439 \u0438 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0435 \u043a\u043b\u044e\u0447\u0438. their \u2014 \u0438\u043c\u0435\u043d\u0430 \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043d\u0438\u043a\u043e\u0432 \u0438 \u0438\u0445 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0435 \u043a\u043b\u044e\u0447\u0438. \u0418\u0437\u043c\u0435\u043d\u0438\u043c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043f\u043e\u0441\u0442\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 JSON \u0434\u0430\u043d\u043d\u044b\u0445:<\/p>\n<pre><code class=\"plaintext\">from pygost import gost3410\nfrom pygost.gost34112012256 import GOST34112012256\n\nCURVE = gost3410.GOST3410Curve(\n    *gost3410.CURVE_PARAMS[\"GostR3410_2001_CryptoPro_A_ParamSet\"]\n)\n\nparser = argparse.ArgumentParser(description=\"GOSTIM\")\nparser.add_argument(\n    \"--keys-gen\",\n    action=\"store_true\",\n    help=\"Generate JSON with our new keypair\",\n)\nparser.add_argument(\n    \"--keys\",\n    default=\"keys.json\",\n    required=False,\n    help=\"JSON with our and their keys\",\n)\nparser.add_argument(\n    \"--bind\",\n    default=\"::1\",\n    help=\"Address to listen on\",\n)\nparser.add_argument(\n    \"--port\",\n    type=int,\n    default=6666,\n    help=\"Port to listen on\",\n)\nargs = parser.parse_args()\n\nif args.keys_gen:\n    prv_raw = urandom(32)\n    pub = gost3410.public_key(CURVE, gost3410.prv_unmarshal(prv_raw))\n    pub_raw = gost3410.pub_marshal(pub)\n    print(json.dumps({\n        \"our\": {\"prv\": hexenc(prv_raw), \"pub\": hexenc(pub_raw)},\n        \"their\": {},\n    }))\n    exit(0)\n\n# Parse and unmarshal our and their keys {{{\nwith open(args.keys, \"rb\") as fd:\n    _keys = json.loads(fd.read().decode(\"utf-8\"))\nKEY_OUR_SIGN_PRV = gost3410.prv_unmarshal(hexdec(_keys[\"our\"][\"prv\"]))\n_pub = hexdec(_keys[\"our\"][\"pub\"])\nKEY_OUR_SIGN_PUB = gost3410.pub_unmarshal(_pub)\nKEY_OUR_SIGN_PUB_HASH = OctetString(GOST34112012256(_pub).digest())\nfor peer_name, pub_raw in _keys[\"their\"].items():\n    _pub = hexdec(pub_raw)\n    KEYS[GOST34112012256(_pub).digest()] = {\n        \"name\": peer_name,\n        \"pub\": gost3410.pub_unmarshal(_pub),\n    }\n# }}}\n<\/code><\/pre>\n<p>\n\u041f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 34.10 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u2014 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e. \u0420\u0430\u0437\u043c\u0435\u0440\u043e\u043c 256-\u0431\u0438\u0442 \u0434\u043b\u044f 256-\u0431\u0438\u0442 \u044d\u043b\u043b\u0438\u043f\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043a\u0440\u0438\u0432\u044b\u0445. PyGOST \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0435 \u0441 \u043d\u0430\u0431\u043e\u0440\u043e\u043c \u0431\u0430\u0439\u0442, \u0430 \u0441 <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%94%D0%BB%D0%B8%D0%BD%D0%BD%D0%B0%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B0\">\u0431\u043e\u043b\u044c\u0448\u0438\u043c\u0438 \u0447\u0438\u0441\u043b\u0430\u043c\u0438<\/a><\/noindex>, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u0448 \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 (urandom(32)) \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u0447\u0438\u0441\u043b\u043e, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f gost3410.prv_unmarshal(). \u041f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 \u0434\u0435\u0442\u0435\u0440\u043c\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u0437 \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u043e\u0433\u043e, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f gost3410.public_key(). \u041f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 34.10 \u2014 \u0434\u0432\u0430 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0447\u0438\u0441\u043b\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0442\u043e\u0436\u0435 \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u0431\u0430\u0439\u0442\u043e\u0432\u0443\u044e \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0434\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f gost3410.pub_marshal().<\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0447\u0442\u0435\u043d\u0438\u044f JSON \u0444\u0430\u0439\u043b\u0430, \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0435 \u043a\u043b\u044e\u0447\u0438, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0437\u0430\u0434, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f gost3410.pub_unmarshal(). \u0422\u0430\u043a \u043a\u0430\u043a \u043d\u0430\u043c \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u044c \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043d\u0438\u043a\u043e\u0432 \u0432 \u0432\u0438\u0434\u0435 \u0445\u044d\u0448\u0430 \u043e\u0442 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u043e\u0433\u043e \u043a\u043b\u044e\u0447\u0430, \u0442\u043e \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u0441\u0440\u0430\u0437\u0443 \u0436\u0435 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438 \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 \u0441\u043b\u043e\u0432\u0430\u0440\u044c \u0434\u043b\u044f \u0431\u044b\u0441\u0442\u0440\u043e\u0433\u043e \u043f\u043e\u0438\u0441\u043a\u0430. \u0421\u0442\u0440\u0438\u0431\u043e\u0433-256 \u0445\u044d\u0448 \u044d\u0442\u043e gost34112012256.GOST34112012256(), \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u044f\u044e\u0449\u0438\u0439 hashlib \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0443 \u0445\u044d\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u0439.<\/p>\n<p>\u041a\u0430\u043a \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u0430\u0441\u044c \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u0430 \u0438\u043d\u0438\u0446\u0438\u0430\u0442\u043e\u0440\u0430? \u0412\u0441\u0451, \u043a\u0430\u043a \u043f\u043e \u0441\u0445\u0435\u043c\u0435 \u0440\u0443\u043a\u043e\u043f\u043e\u0436\u0430\u0442\u0438\u044f: \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c cookie (128-\u0431\u0438\u0442 \u0432\u043f\u043e\u043b\u043d\u0435 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e), \u044d\u0444\u0435\u043c\u0435\u0440\u043d\u0443\u044e \u043a\u043b\u044e\u0447\u0435\u0432\u0443\u044e \u043f\u0430\u0440\u0443 34.10, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u043b\u044f VKO \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043b\u044e\u0447\u0435\u0439.<\/p>\n<pre><code class=\"plaintext\"> 395 async def initiator(host, port):\n 396     _id = repr((host, port))\n 397     logging.info(\"%s: dialing\", _id)\n 398     reader, writer = await asyncio.open_connection(host, port)\n 399     # Generate our ephemeral public key and cookie, send Handshake 0 message {{{\n 400     cookie_our = Cookie(urandom(16))\n 401     prv = gost3410.prv_unmarshal(urandom(32))\n 402     pub_our = gost3410.public_key(CURVE, prv)\n 403     pub_our_raw = PubKey(gost3410.pub_marshal(pub_our))\n 404     writer.write(Msg((\"handshake0\", MsgHandshake0((\n 405         (\"cookieInitiator\", cookie_our),\n 406         (\"pubKeyInitiator\", pub_our_raw),\n 407     )))).encode())\n 408     # }}}\n 409     await writer.drain()\n<\/code><\/pre>\n<p><\/p>\n<ul>\n<li>\u0436\u0434\u0451\u043c \u043e\u0442\u0432\u0435\u0442\u0430 \u0438 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u0443\u0435\u043c \u043f\u0440\u0438\u0448\u0435\u0434\u0448\u0435\u0435 Msg \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435;<\/li>\n<li>\u0443\u0431\u0435\u0436\u0434\u0430\u0435\u043c\u0441\u044f \u0447\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 handshake1;<\/li>\n<li>\u0434\u0435\u043a\u043e\u0434\u0438\u0440\u0443\u0435\u043c \u044d\u0444\u0435\u043c\u0435\u0440\u043d\u044b\u0439 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u043f\u043e\u043b\u043e\u0436\u043d\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u0441\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u0439 \u043a\u043b\u044e\u0447;<\/li>\n<li>\u0432\u044b\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u044b\u0435 \u043a\u043b\u044e\u0447\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 TBE \u0447\u0430\u0441\u0442\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f.<\/li>\n<\/ul>\n<p><\/p>\n<pre><code class=\"plaintext\"> 423     logging.info(\"%s: got %s message\", _id, msg.choice)\n 424     if msg.choice != \"handshake1\":\n 425         logging.warning(\"%s: unexpected message, disconnecting\", _id)\n 426         writer.close()\n 427         return\n 428     # }}}\n 429     msg_handshake1 = msg.value\n 430     # Validate Handshake message {{{\n 431     cookie_their = msg_handshake1[\"cookieResponder\"]\n 432     pub_their_raw = msg_handshake1[\"pubKeyResponder\"]\n 433     pub_their = gost3410.pub_unmarshal(bytes(pub_their_raw))\n 434     ukm_raw = bytes(msg_handshake1[\"ukm\"])\n 435     ukm = ukm_unmarshal(ukm_raw)\n 436     key_session = kek_34102012256(CURVE, prv, pub_their, ukm, mode=2001)\n 437     kdf = Hkdf(None, key_session, hash=GOST34112012256)\n 438     key_handshake1_mac_identity = kdf.expand(b\"handshake1-mac-identity\")\n 439     key_handshake1_enc = kdf.expand(b\"handshake1-enc\")\n 440     key_handshake1_mac = kdf.expand(b\"handshake1-mac\")\n<\/code><\/pre>\n<p>\nUKM \u044d\u0442\u043e 64-\u0431\u0438\u0442 \u0447\u0438\u0441\u043b\u043e (urandom(8)), \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0442\u043e\u0436\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0434\u0435\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438\u0437 \u0431\u0430\u0439\u0442\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f gost3410_vko.ukm_unmarshal(). VKO \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f 34.10-2012 256-\u0431\u0438\u0442 \u044d\u0442\u043e gost3410_vko.kek_34102012256() (KEK \u2014 key encryption key).<\/p>\n<p>\u0412\u044b\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0439 \u0441\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 \u0443\u0436\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f 256-\u0431\u0438\u0442 \u0431\u0430\u0439\u0442\u043e\u0432\u043e\u0439 \u043f\u0441\u0435\u0432\u0434\u043e\u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0439 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0435\u0433\u043e \u0441\u0440\u0430\u0437\u0443 \u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 HKDF \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u0422\u0430\u043a \u043a\u0430\u043a GOST34112012256 \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u044f\u0435\u0442 hashlib \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0443, \u0442\u043e \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0440\u0430\u0437\u0443 \u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 Hkdf \u043a\u043b\u0430\u0441\u0441\u0435. \u0421\u043e\u043b\u044c (\u043f\u0435\u0440\u0432\u044b\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 Hkdf) \u043c\u044b \u043d\u0435 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c, \u0442\u0430\u043a \u043a\u0430\u043a \u0432\u044b\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 \u0438\u0437-\u0437\u0430 \u044d\u0444\u0435\u043c\u0435\u0440\u043d\u043e\u0441\u0442\u0438 \u0443\u0447\u0430\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0445 \u043f\u0430\u0440 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0437\u043d\u044b\u043c \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0435\u0441\u0441\u0438\u0438 \u0438 \u0432 \u043d\u0451\u043c \u0443\u0436\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u044d\u043d\u0442\u0440\u043e\u043f\u0438\u0438. kdf.expand() \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0443\u0436\u0435 \u0432\u044b\u0434\u0430\u0451\u0442 \u043a\u043b\u044e\u0447\u0438 \u0434\u043b\u0438\u043d\u043e\u0439 256-\u0431\u0438\u0442, \u0442\u0440\u0435\u0431\u0443\u0435\u043c\u044b\u0435 \u0434\u043b\u044f \u041a\u0443\u0437\u043d\u0435\u0447\u0438\u043a\u0430 \u0432 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c.<\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e\u0442\u0441\u044f TBE \u0438 TBS \u0447\u0430\u0441\u0442\u0438 \u043f\u0440\u0438\u0448\u0435\u0434\u0448\u0435\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f:<\/p>\n<ul>\n<li>\u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442\u0441\u044f \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f MAC \u043d\u0430\u0434 \u043f\u0440\u0438\u0448\u0435\u0434\u0448\u0438\u043c \u0448\u0438\u0444\u0440\u043e\u0442\u0435\u043a\u0441\u0442\u043e\u043c;<\/li>\n<li>\u0434\u0435\u0448\u0438\u0444\u0440\u0443\u0435\u0442\u0441\u044f \u0448\u0438\u0444\u0440\u043e\u0442\u0435\u043a\u0441\u0442;<\/li>\n<li>\u0434\u0435\u043a\u043e\u0434\u0438\u0440\u0443\u0435\u0442\u0441\u044f TBE \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430;<\/li>\n<li>\u0438\u0437 \u043d\u0435\u0451 \u0431\u0435\u0440\u0451\u0442\u0441\u044f \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043d\u0438\u043a\u0430 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u0438\u0437\u0432\u0435\u0441\u0442\u0435\u043d \u043b\u0438 \u043e\u043d \u043d\u0430\u043c \u0432\u043e\u043e\u0431\u0449\u0435;<\/li>\n<li>\u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442\u0441\u044f \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u0441\u044f MAC \u043d\u0430\u0434 \u044d\u0442\u0438\u043c \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u043c;<\/li>\n<li>\u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0434\u043f\u0438\u0441\u044c \u043d\u0430\u0434 TBS \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439, \u0432 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0432\u0445\u043e\u0434\u044f\u0442 cookie \u043e\u0431\u0435\u0438\u0445 \u0441\u0442\u043e\u0440\u043e\u043d \u0438 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 \u044d\u0444\u0435\u043c\u0435\u0440\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u043f\u043e\u043b\u043e\u0436\u043d\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b. \u041f\u043e\u0434\u043f\u0438\u0441\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u0434\u043e\u043b\u0433\u043e\u0436\u0438\u0432\u0443\u0449\u0438\u043c \u043a\u043b\u044e\u0447\u043e\u043c \u043f\u043e\u0434\u043f\u0438\u0441\u0438 \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043d\u0438\u043a\u0430.<\/li>\n<\/ul>\n<p><\/p>\n<pre><code class=\"plaintext\"> 441     try:\n 442         peer_name = validate_tbe(\n 443             msg_handshake1,\n 444             key_handshake1_mac_identity,\n 445             key_handshake1_enc,\n 446             key_handshake1_mac,\n 447             cookie_our,\n 448             cookie_their,\n 449             pub_their_raw,\n 450         )\n 451     except ValueError as err:\n 452         logging.warning(\"%s: %s, disconnecting\", _id, err)\n 453         writer.close()\n 454         return\n 455     # }}}\n\n 128 def validate_tbe(\n 129         msg_handshake: Union[MsgHandshake1, MsgHandshake2],\n 130         key_mac_identity: bytes,\n 131         key_enc: bytes,\n 132         key_mac: bytes,\n 133         cookie_their: Cookie,\n 134         cookie_our: Cookie,\n 135         pub_key_our: PubKey,\n 136 ) -&gt; str:\n 137     ciphertext = bytes(msg_handshake[\"ciphertext\"])\n 138     mac_tag = mac(GOST3412Kuznechik(key_mac).encrypt, KUZNECHIK_BLOCKSIZE, ciphertext)\n 139     if not compare_digest(mac_tag, bytes(msg_handshake[\"ciphertextMac\"])):\n 140         raise ValueError(\"invalid MAC\")\n 141     plaintext = ctr(\n 142         GOST3412Kuznechik(key_enc).encrypt,\n 143         KUZNECHIK_BLOCKSIZE,\n 144         ciphertext,\n 145         8 * b\"x00\",\n 146     )\n 147     try:\n 148         tbe, _ = HandshakeTBE().decode(plaintext)\n 149     except ASN1Error:\n 150         raise ValueError(\"can not decode TBE\")\n 151     key_sign_pub_hash = bytes(tbe[\"identity\"])\n 152     peer = KEYS.get(key_sign_pub_hash)\n 153     if peer is None:\n 154         raise ValueError(\"unknown identity\")\n 155     mac_tag = mac(\n 156         GOST3412Kuznechik(key_mac_identity).encrypt,\n 157         KUZNECHIK_BLOCKSIZE,\n 158         key_sign_pub_hash,\n 159     )\n 160     if not compare_digest(mac_tag, bytes(tbe[\"identityMac\"])):\n 161         raise ValueError(\"invalid identity MAC\")\n 162     tbs = HandshakeTBS((\n 163         (\"cookieTheir\", cookie_their),\n 164         (\"cookieOur\", cookie_our),\n 165         (\"pubKeyOur\", pub_key_our),\n 166     ))\n 167     if not gost3410.verify(\n 168         CURVE,\n 169         peer[\"pub\"],\n 170         GOST34112012256(tbs.encode()).digest(),\n 171         bytes(tbe[\"signature\"]),\n 172     ):\n 173         raise ValueError(\"invalid signature\")\n 174     return peer[\"name\"]\n<\/code><\/pre>\n<p>\n\u041a\u0430\u043a \u0443\u0436\u0435 \u043f\u0438\u0441\u0430\u043b \u0432\u044b\u0448\u0435, 34.13-2015 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%A0%D0%B5%D0%B6%D0%B8%D0%BC_%D1%88%D0%B8%D1%84%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F\">\u0440\u0435\u0436\u0438\u043c\u044b \u0440\u0430\u0431\u043e\u0442\u044b \u0431\u043b\u043e\u0447\u043d\u044b\u0445 \u0448\u0438\u0444\u0440\u043e\u0432<\/a><\/noindex> \u0438\u0437 34.12-2015. \u0421\u0440\u0435\u0434\u0438 \u043d\u0438\u0445 \u0435\u0441\u0442\u044c \u0440\u0435\u0436\u0438\u043c \u0432\u044b\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438\u043c\u0438\u0442\u043e\u0432\u0441\u0442\u0430\u0432\u043a\u0438, \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f MAC-\u0430. \u0412 PyGOST \u044d\u0442\u043e gost3413.mac(). \u042d\u0442\u043e\u0442 \u0440\u0435\u0436\u0438\u043c \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f (\u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0449\u0430\u044f \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0430\u044f \u043e\u0434\u0438\u043d \u0431\u043b\u043e\u043a \u0434\u0430\u043d\u043d\u044b\u0445), \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0448\u0438\u0444\u0440\u043e\u0431\u043b\u043e\u043a\u0430 \u0438, \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0441\u0430\u043c\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. \u041f\u043e\u0447\u0435\u043c\u0443 \u043d\u0435\u043b\u044c\u0437\u044f hardcode-\u0438\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440 \u0448\u0438\u0444\u0440\u043e\u0431\u043b\u043e\u043a\u0430? 34.12-2015 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e 128-\u0431\u0438\u0442\u043d\u044b\u0439 \u0448\u0438\u0444\u0440 \u041a\u0443\u0437\u043d\u0435\u0447\u0438\u043a, \u043d\u043e \u0435\u0449\u0451 \u0438 64-\u0431\u0438\u0442\u043d\u0443\u044e <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%93%D0%9E%D0%A1%D0%A2_28147-89_%C2%AB%D0%9C%D0%B0%D0%B3%D0%BC%D0%B0%C2%BB\">\u041c\u0430\u0433\u043c\u0443<\/a><\/noindex> \u2014 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0438\u0437\u043c\u0435\u043d\u0451\u043d\u043d\u044b\u0439 \u0413\u041e\u0421\u0422 28147-89, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u0435\u0449\u0451 \u0432 \u041a\u0413\u0411 \u0438 \u0434\u043e \u0441\u0438\u0445 \u043f\u043e\u0440 \u0438\u043c\u0435\u044e\u0449\u0438\u0439 \u043e\u0434\u0438\u043d \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u0432\u044b\u0441\u043e\u043a\u0438\u0445 \u043f\u043e\u0440\u043e\u0433\u043e\u0432 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438.<\/p>\n<p>\u041a\u0443\u0437\u043d\u0435\u0447\u0438\u043a \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442\u0441\u044f gost.3412.GOST3412Kuznechik(key) \u0432\u044b\u0437\u043e\u0432\u043e\u043c \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043e\u0431\u044a\u0435\u043a\u0442 \u0441 .encrypt()\/.decrypt() \u043c\u0435\u0442\u043e\u0434\u0430\u043c\u0438, \u043f\u0440\u0438\u0433\u043e\u0434\u043d\u044b\u043c\u0438 \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0432 34.13 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. MAC \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c: gost3413.mac(GOST3412Kuznechik(key).encrypt, KUZNECHIK_BLOCKSIZE, ciphertext). \u0414\u043b\u044f \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0438 \u043f\u0440\u0438\u0448\u0435\u0434\u0448\u0435\u0433\u043e MAC-\u0430 \u043d\u0435\u043b\u044c\u0437\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u044b\u0447\u043d\u043e\u0435 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 (==) \u0431\u0430\u0439\u0442\u043e\u0432\u044b\u0445 \u0441\u0442\u0440\u043e\u043a, \u0442\u0430\u043a \u043a\u0430\u043a \u044d\u0442\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u0430\u0451\u0442 \u0443\u0442\u0435\u0447\u043a\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f, \u0447\u0442\u043e, \u0432 \u043e\u0431\u0449\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u044c \u043a \u0444\u0430\u0442\u0430\u043b\u044c\u043d\u044b\u043c \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u044f\u043c \u0442\u0438\u043f\u0430 <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/BEAST_(computer_security)#Attacks_against_TLS\/SSL\">BEAST<\/a><\/noindex> \u0430\u0442\u0430\u043a\u0438 \u043d\u0430 TLS. \u0412 Python \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f hmac.compare_digest \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e.<\/p>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0431\u043b\u043e\u0447\u043d\u043e\u0433\u043e \u0448\u0438\u0444\u0440\u0430 \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0431\u043b\u043e\u043a \u0434\u0430\u043d\u043d\u044b\u0445. \u0414\u043b\u044f \u0431\u043e\u043b\u044c\u0448\u0435\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430, \u0434\u0430 \u0435\u0449\u0451 \u0438 \u043d\u0435 \u043a\u0440\u0430\u0442\u043d\u043e\u0439 \u0434\u043b\u0438\u043d\u044b, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u0436\u0438\u043c \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0412 34.13-2015 \u043e\u043f\u0438\u0441\u0430\u043d\u044b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435: ECB, CTR, OFB, CBC, CFB. \u0423 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0441\u0432\u043e\u0438 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u044b\u0435 \u0441\u0444\u0435\u0440\u044b \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0438 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a\u0438. \u041a \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u043c\u0443 \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u0443 \u043d\u0430\u0441 \u0434\u043e \u0441\u0438\u0445 \u043f\u043e\u0440 \u043d\u0435\u0442 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0445 <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/AEAD-%D1%80%D0%B5%D0%B6%D0%B8%D0%BC_%D0%B1%D0%BB%D0%BE%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%88%D0%B8%D1%84%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F\">\u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0440\u0435\u0436\u0438\u043c\u043e\u0432 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f<\/a><\/noindex> (\u0442\u0438\u043f\u0430 CCM, OCB, GCM \u0438 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445) \u2014 \u043c\u044b \u0432\u044b\u043d\u0443\u0436\u0434\u0435\u043d\u044b \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u044f \u0431\u044b \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c MAC. \u042f \u0432\u044b\u0431\u0438\u0440\u0430\u044e <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%A0%D0%B5%D0%B6%D0%B8%D0%BC_%D1%88%D0%B8%D1%84%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F#Counter_mode_(CTR)\">\u0440\u0435\u0436\u0438\u043c \u0441\u0447\u0451\u0442\u0447\u0438\u043a\u0430<\/a><\/noindex> (CTR): \u043e\u043d \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0434\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0431\u043b\u043e\u043a\u0430, \u043c\u043e\u0436\u0435\u0442 \u0440\u0430\u0441\u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0432\u0430\u0442\u044c\u0441\u044f, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d \u0434\u043b\u044f \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 (\u0432 \u043e\u0442\u043b\u0438\u0447\u0438\u0438 \u043e\u0442 CBC, \u0443 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442\u0441\u044f \u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0438).<\/p>\n<p>\u041a\u0430\u043a \u0438 .mac(), .ctr() \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043f\u043e\u0445\u043e\u0436\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 \u0432\u0445\u043e\u0434\u0435: ciphertext = gost3413.ctr(GOST3412Kuznechik(key).encrypt, KUZNECHIK_BLOCKSIZE, plaintext, iv). \u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0437\u0430\u0434\u0430\u043d\u0438\u0435 \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438, \u0434\u043b\u0438\u043d\u043e\u0439 \u0440\u043e\u0432\u043d\u043e \u0432 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0443 \u0448\u0438\u0444\u0440\u043e\u0431\u043b\u043e\u043a\u0430. \u0415\u0441\u043b\u0438 \u043d\u0430\u0448 \u043a\u043b\u044e\u0447 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0434\u043d\u043e\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f (\u043f\u0443\u0441\u043a\u0430\u0439 \u0438 \u0438\u0437 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0431\u043b\u043e\u043a\u043e\u0432), \u0442\u043e \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e \u0437\u0430\u0434\u0430\u0442\u044c \u043d\u0443\u043b\u0435\u0432\u043e\u0439 \u0432\u0435\u043a\u0442\u043e\u0440 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438. \u0414\u043b\u044f \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f handshake \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0443 \u043d\u0430\u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043b\u044e\u0447.<\/p>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u043e\u0434\u043f\u0438\u0441\u0438 gost3410.verify() \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u0430: \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u043c \u044d\u043b\u043b\u0438\u043f\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u043a\u0440\u0438\u0432\u0443\u044e \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c (\u0435\u0451 \u043c\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u0444\u0438\u043a\u0441\u0438\u0440\u0443\u0435\u043c \u0432 \u043d\u0430\u0448\u0435\u043c GOSTIM \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0435), \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u0442\u0430 (\u043d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0435\u043c, \u0447\u0442\u043e \u044d\u0442\u043e \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043a\u043e\u0440\u0442\u0435\u0436 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0447\u0438\u0441\u0435\u043b, \u0430 \u043d\u0435 \u0431\u0430\u0439\u0442\u043e\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430), 34.11-2012 \u0445\u044d\u0448 \u0438 \u0441\u0430\u043c\u0430 \u043f\u0440\u0438\u0448\u0435\u0434\u0448\u0430\u044f \u043f\u043e\u0434\u043f\u0438\u0441\u044c.<\/p>\n<p>\u0414\u0430\u043b\u0435\u0435, \u0432 \u0438\u043d\u0438\u0446\u0438\u0430\u0442\u043e\u0440\u0435 \u043c\u044b \u043f\u043e\u0434\u0433\u043e\u0442\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0438 \u043e\u0442\u0441\u044b\u043b\u0430\u0435\u043c handshake2 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0440\u0443\u043a\u043e\u043f\u043e\u0436\u0430\u0442\u0438\u044f, \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u044f \u0442\u0435 \u0436\u0435 \u0441\u0430\u043c\u044b\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0447\u0442\u043e \u043c\u044b \u0438 \u0434\u0435\u043b\u0430\u043b\u0438 \u043f\u0440\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0435, \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u043e: \u043f\u043e\u0434\u043f\u0438\u0441\u044c \u043d\u0430 \u0441\u0432\u043e\u0438\u0445 \u043a\u043b\u044e\u0447\u0430\u0445 \u0432\u043c\u0435\u0441\u0442\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438, \u0438 \u0442.\u043f\u2026<\/p>\n<pre><code class=\"plaintext\"> 456     # Prepare and send Handshake 2 message {{{\n 457     tbs = HandshakeTBS((\n 458         (\"cookieTheir\", cookie_their),\n 459         (\"cookieOur\", cookie_our),\n 460         (\"pubKeyOur\", pub_our_raw),\n 461     ))\n 462     signature = gost3410.sign(\n 463         CURVE,\n 464         KEY_OUR_SIGN_PRV,\n 465         GOST34112012256(tbs.encode()).digest(),\n 466     )\n 467     key_handshake2_mac_identity = kdf.expand(b\"handshake2-mac-identity\")\n 468     mac_tag = mac(\n 469         GOST3412Kuznechik(key_handshake2_mac_identity).encrypt,\n 470         KUZNECHIK_BLOCKSIZE,\n 471         bytes(KEY_OUR_SIGN_PUB_HASH),\n 472     )\n 473     tbe = HandshakeTBE((\n 474         (\"identity\", KEY_OUR_SIGN_PUB_HASH),\n 475         (\"signature\", OctetString(signature)),\n 476         (\"identityMac\", MAC(mac_tag)),\n 477     ))\n 478     tbe_raw = tbe.encode()\n 479     key_handshake2_enc = kdf.expand(b\"handshake2-enc\")\n 480     key_handshake2_mac = kdf.expand(b\"handshake2-mac\")\n 481     ciphertext = ctr(\n 482         GOST3412Kuznechik(key_handshake2_enc).encrypt,\n 483         KUZNECHIK_BLOCKSIZE,\n 484         tbe_raw,\n 485         8 * b\"x00\",\n 486     )\n 487     mac_tag = mac(\n 488         GOST3412Kuznechik(key_handshake2_mac).encrypt,\n 489         KUZNECHIK_BLOCKSIZE,\n 490         ciphertext,\n 491     )\n 492     writer.write(Msg((\"handshake2\", MsgHandshake2((\n 493         (\"ciphertext\", OctetString(ciphertext)),\n 494         (\"ciphertextMac\", MAC(mac_tag)),\n 495     )))).encode())\n 496     # }}}\n 497     await writer.drain()\n 498     logging.info(\"%s: session established: %s\", _id, peer_name)\n <\/code><\/pre>\n<p>\n\u041a\u043e\u0433\u0434\u0430 \u0441\u0435\u0441\u0441\u0438\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0430, \u0442\u043e \u0432\u044b\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\u043d\u044b\u0435 \u043a\u043b\u044e\u0447\u0438 (\u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 \u0434\u043b\u044f \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0434\u043b\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438, \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0438\u0437 \u0441\u0442\u043e\u0440\u043e\u043d), \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u041a\u0443\u0437\u043d\u0435\u0447\u0438\u043a \u0434\u043b\u044f \u0434\u0435\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 MAC-\u0430:<\/p>\n<pre><code class=\"plaintext\"> 499     # Run text message sender, initialize transport decoder {{{\n 500     key_initiator_enc = kdf.expand(b\"transport-initiator-enc\")\n 501     key_initiator_mac = kdf.expand(b\"transport-initiator-mac\")\n 502     key_responder_enc = kdf.expand(b\"transport-responder-enc\")\n 503     key_responder_mac = kdf.expand(b\"transport-responder-mac\")\n ...\n 509     asyncio.ensure_future(msg_sender(\n 510         peer_name,\n 511         key_initiator_enc,\n 512         key_initiator_mac,\n 513         writer,\n 514     ))\n 515     encrypter = GOST3412Kuznechik(key_responder_enc).encrypt\n 516     macer = GOST3412Kuznechik(key_responder_mac).encrypt\n 517     # }}}\n 519     nonce_expected = 0\n\n 520     # Wait for test messages {{{\n 521     while True:\n 522         data = await reader.read(MaxMsgLen)\n ...\n 530             msg, tail = Msg().decode(buf)\n ...\n 537         try:\n 538             await msg_receiver(\n 539                 msg.value,\n 540                 nonce_expected,\n 541                 macer,\n 542                 encrypter,\n 543                 peer_name,\n 544             )\n 545         except ValueError as err:\n 546             logging.warning(\"%s: %s\", err)\n 547             break\n 548         nonce_expected += 1\n 549     # }}}\n<\/code><\/pre>\n<p>\nmsg_sender \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u0430 \u0442\u0435\u043f\u0435\u0440\u044c \u0448\u0438\u0444\u0440\u0443\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f, \u043f\u0435\u0440\u0435\u0434 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u043e\u0439 \u0432 TCP-\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435. \u0423 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043c\u043e\u043d\u043e\u0442\u043e\u043d\u043d\u043e \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430\u044e\u0449\u0438\u0439 nonce, \u0442\u0430\u043a\u0436\u0435 \u044f\u0432\u043b\u044f\u044e\u0449\u0438\u0439\u0441\u044f \u0438 \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u043c \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u0438 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u0441\u0447\u0451\u0442\u0447\u0438\u043a\u0430. \u0423 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0438 \u0431\u043b\u043e\u043a\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e \u0431\u0443\u0434\u0443\u0442 \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0449\u0438\u0435\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0441\u0447\u0451\u0442\u0447\u0438\u043a\u0430.<\/p>\n<pre><code class=\"plaintext\">async def msg_sender(peer_name: str, key_enc: bytes, key_mac: bytes, writer) -&gt; None:\n    nonce = 0\n    encrypter = GOST3412Kuznechik(key_enc).encrypt\n    macer = GOST3412Kuznechik(key_mac).encrypt\n    in_queue = IN_QUEUES[peer_name]\n    while True:\n        text = await in_queue.get()\n        if text is None:\n            break\n        ciphertext = ctr(\n            encrypter,\n            KUZNECHIK_BLOCKSIZE,\n            text.encode(\"utf-8\"),\n            long2bytes(nonce, 8),\n        )\n        payload = MsgTextPayload((\n            (\"nonce\", Integer(nonce)),\n            (\"ciphertext\", OctetString(ciphertext)),\n        ))\n        mac_tag = mac(macer, KUZNECHIK_BLOCKSIZE, payload.encode())\n        writer.write(Msg((\"text\", MsgText((\n            (\"payload\", payload),\n            (\"payloadMac\", MAC(mac_tag)),\n        )))).encode())\n        nonce += 1\n<\/code><\/pre>\n<p>\n\u041f\u0440\u0438\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u043e\u0439 msg_receiver, \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0449\u0435\u0439\u0441\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0435\u0439 \u0438 \u0434\u0435\u0448\u0438\u0444\u0440\u0430\u0446\u0438\u0435\u0439:<\/p>\n<pre><code class=\"plaintext\">async def msg_receiver(\n        msg_text: MsgText,\n        nonce_expected: int,\n        macer,\n        encrypter,\n        peer_name: str,\n) -&gt; None:\n    payload = msg_text[\"payload\"]\n    if int(payload[\"nonce\"]) != nonce_expected:\n        raise ValueError(\"unexpected nonce value\")\n    mac_tag = mac(macer, KUZNECHIK_BLOCKSIZE, payload.encode())\n    if not compare_digest(mac_tag, bytes(msg_text[\"payloadMac\"])):\n        raise ValueError(\"invalid MAC\")\n    plaintext = ctr(\n        encrypter,\n        KUZNECHIK_BLOCKSIZE,\n        bytes(payload[\"ciphertext\"]),\n        long2bytes(nonce_expected, 8),\n    )\n    text = plaintext.decode(\"utf-8\")\n    await OUT_QUEUES[peer_name].put(text)\n<\/code><\/pre>\n<p><\/p>\n<h2>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h2>\n<p>\nGOSTIM \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432 \u0443\u0447\u0435\u0431\u043d\u044b\u0445 \u0446\u0435\u043b\u044f\u0445 (\u0442\u0430\u043a \u043a\u0430\u043a \u043d\u0435 \u043f\u043e\u043a\u0440\u044b\u0442 \u0442\u0435\u0441\u0442\u0430\u043c\u0438, \u043a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c)! \u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043c\u043e\u0436\u043d\u043e \u0441\u043a\u0430\u0447\u0430\u0442\u044c <noindex><a rel=\"nofollow\" href=\"http:\/\/pygost.cypherpunks.ru\/gostim.txz\">\u0442\u0443\u0442<\/a><\/noindex> (\u0421\u0442\u0440\u0438\u0431\u043e\u0433-256 \u0445\u044d\u0448: 995bbd368c04e50a481d138c5fa2e43ec7c89bc77743ba8dbabee1fde45de120). \u041a\u0430\u043a \u0438 \u0432\u0441\u0435 \u043c\u043e\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u044b, \u0442\u0438\u043f\u0430 <noindex><a rel=\"nofollow\" href=\"http:\/\/gogost.cypherpunks.ru\/\">GoGOST<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"http:\/\/pyderasn.cypherpunks.ru\/\">PyDERASN<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"http:\/\/www.nncpgo.org\/\">NNCP<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"http:\/\/www.govpn.info\/\">GoVPN<\/a><\/noindex>, GOSTIM \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e <noindex><a rel=\"nofollow\" href=\"https:\/\/www.gnu.org\/philosophy\/free-sw.ru.html\">\u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u043c \u041f\u041e<\/a><\/noindex>, \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u0435\u043c\u044b\u043c \u043d\u0430 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445 <noindex><a rel=\"nofollow\" href=\"https:\/\/www.gnu.org\/licenses\/gpl-3.0.ru.html\">GPLv3+<\/a><\/noindex>.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"http:\/\/www.stargrave.org\/\">\u0421\u0435\u0440\u0433\u0435\u0439 \u041c\u0430\u0442\u0432\u0435\u0435\u0432<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"http:\/\/www.cypherpunks.ru\/\">\u0448\u0438\u0444\u0440\u043e\u043f\u0430\u043d\u043a<\/a><\/noindex>, \u0447\u043b\u0435\u043d <noindex><a rel=\"nofollow\" href=\"https:\/\/www.fsf.org\/\">\u0424\u043e\u043d\u0434\u0430 \u0421\u041f\u041e<\/a><\/noindex>, Python\/Go-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a, \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442 <noindex><a rel=\"nofollow\" href=\"http:\/\/stcnet.ru\/\">\u0424\u0413\u0423\u041f \u00ab\u041d\u0422\u0426 \u201e\u0410\u0442\u043b\u0430\u0441\u201c<\/a><\/noindex>.<\/li>\n<\/ul>\n<p>\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/452200\/\">habr.com<\/a><\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0411\u0443\u0434\u0443\u0447\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u043c PyGOST \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 (\u0413\u041e\u0421\u0422\u043e\u0432\u044b\u0435 \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u044b \u043d\u0430 \u0447\u0438\u0441\u0442\u043e\u043c Python), \u044f \u043d\u0435\u0440\u0435\u0434\u043a\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u044e \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u043e \u0442\u043e\u043c \u043a\u0430\u043a \u043d\u0430 \u043a\u043e\u043b\u0435\u043d\u043a\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0438\u0439 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u0439 \u043e\u0431\u043c\u0435\u043d \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u043c\u0438. \u041c\u043d\u043e\u0433\u0438\u0435 \u0441\u0447\u0438\u0442\u0430\u044e\u0442 \u043f\u0440\u0438\u043a\u043b\u0430\u0434\u043d\u0443\u044e \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u044e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0448\u0442\u0443\u043a\u043e\u0439, \u0438 .encrypt() \u0432\u044b\u0437\u043e\u0432\u0430 \u0443 \u0431\u043b\u043e\u0447\u043d\u043e\u0433\u043e \u0448\u0438\u0444\u0440\u0430 \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u043b\u044f \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0439 \u043e\u0442\u0441\u044b\u043b\u043a\u0438 \u043f\u043e \u043a\u0430\u043d\u0430\u043b\u0443 \u0441\u0432\u044f\u0437\u0438. \u0414\u0440\u0443\u0433\u0438\u0435 \u0436\u0435 \u0441\u0447\u0438\u0442\u0430\u044e\u0442, \u0447\u0442\u043e \u043f\u0440\u0438\u043a\u043b\u0430\u0434\u043d\u0430\u044f \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u044f \u2014 \u0443\u0434\u0435\u043b \u043d\u0435\u043c\u043d\u043e\u0433\u0438\u0445, \u0438 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":25495,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-33820","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.10 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0411\u0443\u0434\u0443\u0447\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u043c PyGOST \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 (\u0413\u041e\u0421\u0422\u043e\u0432\u044b\u0435 \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u044b \u043d\u0430 \u0447\u0438\u0441\u0442\u043e\u043c Python), \u044f \u043d\u0435\u0440\u0435\u0434\u043a\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u044e \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u043e \u0442\u043e\u043c \u043a\u0430\u043a \u043d\u0430 \u043a\u043e\u043b\u0435\u043d\u043a\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0438\u0439 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u0439 \u043e\u0431\u043c\u0435\u043d \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u043c\u0438. \u041c\u043d\u043e\u0433\u0438\u0435 \u0441\u0447\u0438\u0442\u0430\u044e\u0442 \u043f\u0440\u0438\u043a\u043b\u0430\u0434\u043d\u0443\u044e \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u044e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0448\u0442\u0443\u043a\u043e\u0439, \u0438 .encrypt() \u0432\u044b\u0437\u043e\u0432\u0430 \u0443 \u0431\u043b\u043e\u0447\u043d\u043e\u0433\u043e \u0448\u0438\u0444\u0440\u0430 \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u043b\u044f \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0439 \u043e\u0442\u0441\u044b\u043b\u043a\u0438 \u043f\u043e \u043a\u0430\u043d\u0430\u043b\u0443 \u0441\u0432\u044f\u0437\u0438. \u0414\u0440\u0443\u0433\u0438\u0435 \u0436\u0435 \u0441\u0447\u0438\u0442\u0430\u044e\u0442, \u0447\u0442\u043e \u043f\u0440\u0438\u043a\u043b\u0430\u0434\u043d\u0430\u044f \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u044f \u2014 \u0443\u0434\u0435\u043b \u043d\u0435\u043c\u043d\u043e\u0433\u0438\u0445, \u0438\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/gostim-p2p-f2f-e2ee-im-za-odin-vecher-s-gost-kriptografiej\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.10\" \/>\n\t\t<meta property=\"og:locale\" content=\"de_DE\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47GOSTIM: P2P F2F E2EE IM \u0437\u0430 \u043e\u0434\u0438\u043d \u0432\u0435\u0447\u0435\u0440 \u0441 \u0413\u041e\u0421\u0422-\u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0435\u0439 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0411\u0443\u0434\u0443\u0447\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u043c PyGOST \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 (\u0413\u041e\u0421\u0422\u043e\u0432\u044b\u0435 \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u044b \u043d\u0430 \u0447\u0438\u0441\u0442\u043e\u043c Python), \u044f \u043d\u0435\u0440\u0435\u0434\u043a\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u044e \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u043e \u0442\u043e\u043c \u043a\u0430\u043a \u043d\u0430 \u043a\u043e\u043b\u0435\u043d\u043a\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0438\u0439 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u0439 \u043e\u0431\u043c\u0435\u043d \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u043c\u0438. \u041c\u043d\u043e\u0433\u0438\u0435 \u0441\u0447\u0438\u0442\u0430\u044e\u0442 \u043f\u0440\u0438\u043a\u043b\u0430\u0434\u043d\u0443\u044e \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u044e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0448\u0442\u0443\u043a\u043e\u0439, \u0438 .encrypt() \u0432\u044b\u0437\u043e\u0432\u0430 \u0443 \u0431\u043b\u043e\u0447\u043d\u043e\u0433\u043e \u0448\u0438\u0444\u0440\u0430 \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u043b\u044f \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0439 \u043e\u0442\u0441\u044b\u043b\u043a\u0438 \u043f\u043e \u043a\u0430\u043d\u0430\u043b\u0443 \u0441\u0432\u044f\u0437\u0438. \u0414\u0440\u0443\u0433\u0438\u0435 \u0436\u0435 \u0441\u0447\u0438\u0442\u0430\u044e\u0442, \u0447\u0442\u043e \u043f\u0440\u0438\u043a\u043b\u0430\u0434\u043d\u0430\u044f \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u044f \u2014 \u0443\u0434\u0435\u043b \u043d\u0435\u043c\u043d\u043e\u0433\u0438\u0445, \u0438\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/gostim-p2p-f2f-e2ee-im-za-odin-vecher-s-gost-kriptografiej\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T18:54:50+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T18:54:50+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47GOSTIM: P2P F2F E2EE IM in einer Nacht mit GOST-Kryptographie | ProHoster","description":"Als Entwickler der PyGOST-Bibliothek (GOST-Kryptographiemethoden in reinem Python) bekomme ich oft Fragen, wie man einfach und sicher Nachrichten austauschen kann. Viele glauben, dass angewandte Kryptographie recht einfach ist, und dass ein .encrypt() Aufruf bei einem Blockcipher ausreicht, um sicher \u00fcber ein Kommunikationskanal zu senden. Andere wiederum sind der Meinung, dass angewandte Kryptographie etwas f\u00fcr wenige ist, und","canonical_url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/gostim-p2p-f2f-e2ee-im-za-odin-vecher-s-gost-kriptografiej","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"de_DE","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47GOSTIM: P2P F2F E2EE IM \u0437\u0430 \u043e\u0434\u0438\u043d \u0432\u0435\u0447\u0435\u0440 \u0441 \u0413\u041e\u0421\u0422-\u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0435\u0439 | ProHoster","og:description":"\u0411\u0443\u0434\u0443\u0447\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u043c PyGOST \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 (\u0413\u041e\u0421\u0422\u043e\u0432\u044b\u0435 \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u044b \u043d\u0430 \u0447\u0438\u0441\u0442\u043e\u043c Python), \u044f \u043d\u0435\u0440\u0435\u0434\u043a\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u044e \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u043e \u0442\u043e\u043c \u043a\u0430\u043a \u043d\u0430 \u043a\u043e\u043b\u0435\u043d\u043a\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0438\u0439 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u0439 \u043e\u0431\u043c\u0435\u043d \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u043c\u0438. \u041c\u043d\u043e\u0433\u0438\u0435 \u0441\u0447\u0438\u0442\u0430\u044e\u0442 \u043f\u0440\u0438\u043a\u043b\u0430\u0434\u043d\u0443\u044e \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u044e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0448\u0442\u0443\u043a\u043e\u0439, \u0438 .encrypt() \u0432\u044b\u0437\u043e\u0432\u0430 \u0443 \u0431\u043b\u043e\u0447\u043d\u043e\u0433\u043e \u0448\u0438\u0444\u0440\u0430 \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u043b\u044f \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0439 \u043e\u0442\u0441\u044b\u043b\u043a\u0438 \u043f\u043e \u043a\u0430\u043d\u0430\u043b\u0443 \u0441\u0432\u044f\u0437\u0438. \u0414\u0440\u0443\u0433\u0438\u0435 \u0436\u0435 \u0441\u0447\u0438\u0442\u0430\u044e\u0442, \u0447\u0442\u043e \u043f\u0440\u0438\u043a\u043b\u0430\u0434\u043d\u0430\u044f \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u044f \u2014 \u0443\u0434\u0435\u043b \u043d\u0435\u043c\u043d\u043e\u0433\u0438\u0445, \u0438","og:url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/gostim-p2p-f2f-e2ee-im-za-odin-vecher-s-gost-kriptografiej","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T18:54:50+00:00","article:modified_time":"2019-10-31T18:54:50+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"33820","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-21 16:51:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 02:33:23","updated":"2026-01-21 16:51:19"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/33820","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/comments?post=33820"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/33820\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media\/25495"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=33820"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=33820"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=33820"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}