From ea3102c95848f7ee86dfe2081d4a711d37add7d3 Mon Sep 17 00:00:00 2001 From: Andrew Guschin Date: Thu, 19 May 2022 16:08:23 +0400 Subject: Add latex report --- .gitignore | 14 +- http-client/go.sum | 77 +++ http-server/go.sum | 2 + report/SCWorks.cls | 908 +++++++++++++++++++++++++++++++++ report/coursework.pdf | Bin 0 -> 284022 bytes report/coursework.tex | 498 ++++++++++++++++++ report/images/screenshots/chat.png | Bin 0 -> 7921 bytes report/images/screenshots/error.png | Bin 0 -> 19468 bytes report/images/screenshots/input.png | Bin 0 -> 6554 bytes report/images/screenshots/key.png | Bin 0 -> 31781 bytes report/images/screenshots/register.png | Bin 0 -> 18721 bytes report/images/screenshots/start.png | Bin 0 -> 10196 bytes report/merge.sh | 5 + report/preamble.sty | 50 ++ report/sources.bib | 29 ++ report/title.pdf | Bin 0 -> 25350 bytes report/titlepage.tex | 53 ++ 17 files changed, 1635 insertions(+), 1 deletion(-) create mode 100644 http-client/go.sum create mode 100644 http-server/go.sum create mode 100644 report/SCWorks.cls create mode 100644 report/coursework.pdf create mode 100644 report/coursework.tex create mode 100644 report/images/screenshots/chat.png create mode 100644 report/images/screenshots/error.png create mode 100644 report/images/screenshots/input.png create mode 100644 report/images/screenshots/key.png create mode 100644 report/images/screenshots/register.png create mode 100644 report/images/screenshots/start.png create mode 100755 report/merge.sh create mode 100644 report/preamble.sty create mode 100644 report/sources.bib create mode 100644 report/title.pdf create mode 100644 report/titlepage.tex diff --git a/.gitignore b/.gitignore index 723ef36..167b5d8 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,13 @@ -.idea \ No newline at end of file +*.sqlite3 +.* +_minted* +*.aux +*.bbl +*.bcf +*.blg +*.fdb_latexmk +*.fls +*.log +*.xml +*.gz +*.toc \ No newline at end of file diff --git a/http-client/go.sum b/http-client/go.sum new file mode 100644 index 0000000..d4331e2 --- /dev/null +++ b/http-client/go.sum @@ -0,0 +1,77 @@ +fyne.io/fyne/v2 v2.0.2 h1:6pDvFuCmL1odyT/fPI+2L54hMJW1Zt9Dno41HmLInRs= +fyne.io/fyne/v2 v2.0.2/go.mod h1:3+FYmLJVgeb8EvTPJ5YzZeo7LkAq4bbuY3Zrir6xHbg= +github.com/Kodeworks/golang-image-ico v0.0.0-20141118225523-73f0f4cfade9/go.mod h1:7uhhqiBaR4CpN0k9rMjOtjpcfGd6DG2m04zQxKnWQ0I= +github.com/akavel/rsrc v0.8.0/go.mod h1:uLoCtb9J+EyAqh+26kdrTgmzRBFPGOolLWKpdxkKq+c= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/fredbi/uri v0.0.0-20181227131451-3dcfdacbaaf3 h1:FDqhDm7pcsLhhWl1QtD8vlzI4mm59llRvNzrFg6/LAA= +github.com/fredbi/uri v0.0.0-20181227131451-3dcfdacbaaf3/go.mod h1:CzM2G82Q9BDUvMTGHnXf/6OExw/Dz2ivDj48nVg7Lg8= +github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/fyne-io/mobile v0.1.3-0.20210318200029-09e9c4e13a8f h1:rguJ/t99j/6zRSFzsBKlsmmyl+vOvCeTJ+2uTBvuXFI= +github.com/fyne-io/mobile v0.1.3-0.20210318200029-09e9c4e13a8f/go.mod h1:/kOrWrZB6sasLbEy2JIvr4arEzQTXBTZGb3Y96yWbHY= +github.com/go-gl/gl v0.0.0-20190320180904-bf2b1f2f34d7 h1:SCYMcCJ89LjRGwEa0tRluNRiMjZHalQZrVrvTbPh+qw= +github.com/go-gl/gl v0.0.0-20190320180904-bf2b1f2f34d7/go.mod h1:482civXOzJJCPzJ4ZOX/pwvXBWSnzD4OKMdH4ClKGbk= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20210311203641-62640a716d48 h1:QrUfZrT8n72FUuiABt4tbu8PwDnOPAbnj3Mql1UhdRI= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20210311203641-62640a716d48/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/godbus/dbus/v5 v5.0.3 h1:ZqHaoEF7TBzh4jzPmqVhE/5A1z9of6orkAe5uHoAeME= +github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/goki/freetype v0.0.0-20181231101311-fa8a33aabaff h1:W71vTCKoxtdXgnm1ECDFkfQnpdqAO00zzGXLA5yaEX8= +github.com/goki/freetype v0.0.0-20181231101311-fa8a33aabaff/go.mod h1:wfqRWLHRBsRgkp5dmbG56SA0DmVtwrF5N3oPdI8t+Aw= +github.com/jackmordaunt/icns v0.0.0-20181231085925-4f16af745526/go.mod h1:UQkeMHVoNcyXYq9otUupF7/h/2tmHlhrS2zw7ZVvUqc= +github.com/josephspurrier/goversioninfo v0.0.0-20200309025242-14b0ab84c6ca/go.mod h1:eJTEwMjXb7kZ633hO3Ln9mBUCOjX2+FlTljvpl9SYdE= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/lucor/goinfo v0.0.0-20200401173949-526b5363a13a/go.mod h1:ORP3/rB5IsulLEBwQZCJyyV6niqmI7P4EWSmkug+1Ng= +github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/srwiley/oksvg v0.0.0-20200311192757-870daf9aa564 h1:HunZiaEKNGVdhTRQOVpMmj5MQnGnv+e8uZNu3xFLgyM= +github.com/srwiley/oksvg v0.0.0-20200311192757-870daf9aa564/go.mod h1:afMbS0qvv1m5tfENCwnOdZGOF8RGR/FsZ7bvBxQGZG4= +github.com/srwiley/rasterx v0.0.0-20200120212402-85cb7272f5e9 h1:m59mIOBO4kfcNCEzJNy71UkeF4XIx2EVmL9KLwDQdmM= +github.com/srwiley/rasterx v0.0.0-20200120212402-85cb7272f5e9/go.mod h1:mvWM0+15UqyrFKqdRjY6LuAVJR0HOVhJlEgZ5JWtSWU= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200430140353-33d19683fad8 h1:6WW6V3x1P/jokJBpRQYUJnMHRP6isStQwCozxnU7XQw= +golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e h1:3G+cUijn7XD+S4eJFddp53Pv7+slrESplyjG25HgL+k= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200720211630-cb9d2d5c5666 h1:gVCS+QOncANNPlmlO1AhlU3oxs4V9z+gTtPwIk3p2N8= +golang.org/x/sys v0.0.0-20200720211630-cb9d2d5c5666/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190808195139-e713427fea3f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200328031815-3db5fc6bac03/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/http-server/go.sum b/http-server/go.sum new file mode 100644 index 0000000..96ff824 --- /dev/null +++ b/http-server/go.sum @@ -0,0 +1,2 @@ +github.com/mattn/go-sqlite3 v1.14.7 h1:fxWBnXkxfM6sRiuH3bqJ4CfzZojMOLVc0UTsTglEghA= +github.com/mattn/go-sqlite3 v1.14.7/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= diff --git a/report/SCWorks.cls b/report/SCWorks.cls new file mode 100644 index 0000000..7eddd54 --- /dev/null +++ b/report/SCWorks.cls @@ -0,0 +1,908 @@ +\LoadClass[14pt]{extarticle} +%\RequirePackage[14pt]{extsizes} +\RequirePackage[ + a4paper, mag=1000, + left=2.5cm, right=1.5cm, top=2cm, bottom=2cm, bindingoffset=0cm, + headheight=0cm, footskip=1cm, headsep=0cm + ]{geometry} +\RequirePackage{setspace} +\RequirePackage{calc} +\RequirePackage{titlesec} +\RequirePackage{titletoc} +\RequirePackage{caption} +\RequirePackage{graphicx} +\RequirePackage[inline]{enumitem} + + + + +% --------------------------------------------------------------------------% +% Input data +% --------------------------------------------------------------------------% +\def\chair#1{\gdef\@chair{#1}}\chair{\hbox to 3cm{\hrulefill}} +\def\worktype#1{\gdef\@worktype{#1}} +\def\worktitle{\@title} +\def\typework#1{\gdef\@typework{#1}} +\def\disserform#1{\gdef\@disserform{#1}} +\def\disserformP#1{\gdef\@disserformP{#1}} +\def\disserformR#1{\gdef\@disserformR{#1}} +\def\disserformV#1{\gdef\@disserformV{#1}} +\def\course#1{\gdef\@course{#1}}\course{2} +\def\group#1{\gdef\@group{#1}}\group{211} +\def\department#1{\gdef\@department{#1}}\department{\cyr\cyrf\cyra\cyrk% +\cyru\cyrl\cyrsftsn\cyrt\cyre\cyrt\cyra\ \CYRK\CYRN\cyri\CYRI\CYRT} +\def\otdelenie#1{\gdef\@otdelenie{#1}} +\def\studentName{\@author} +%\def\studentName#1{\gdef\@studentName{#1}} +\def\satitle#1{\gdef\@satitle{#1}}\satitle{\hbox to 3cm{\hrulefill}} +\def\saname#1{\gdef\@saname{#1}}\saname{\hbox to 3cm{\hrulefill}} +\def\critictitle#1{\gdef\@critictitle{#1}}\critictitle{\hbox to 3cm{\hrulefill}} +\def\criticname#1{\gdef\@criticname{#1}}\criticname{\hbox to 3cm{\hrulefill}} +\def\secrname#1{\gdef\@secrname{#1}}\secrname{\hbox to 3cm{\hrulefill}} +\def\chtitle#1{\gdef\@chtitle{#1}}\chtitle{\hbox to 3cm{\hrulefill}} +\def\chname#1{\gdef\@chname{#1}}\chname{\hbox to 3cm{\hrulefill}} +%\def\year#1{\gdef\@year{#1}} +\def\spectype#1{\gdef\@spectype{#1}} +\def\spectyperod#1{\gdef\@spectyperod{#1}} +\def\workform#1{\gdef\@workform{#1}} +\def\practtype#1{\gdef\@practtype{#1}}\practtype{\cyr\cyru\cyrch\cyre\cyrb% +\cyrn\cyra\cyrya} +\def\term#1{\gdef\@term{#1}}\term{2} +\def\duration#1{\gdef\@duration{#1}}\duration{2} +\def\protnum#1{\gdef\@protnum{#1}}\protnum{\hbox to 1cm{\hrulefill}} +\def\protdate#1{\gdef\@protdate{#1}}\protdate{\hbox to 3cm{\hrulefill}} +\def\practStart#1{\gdef\@practStart{#1}}\practStart{\hbox to 3cm{\hrulefill}} +\def\practFinish#1{\gdef\@practFinish{#1}}\practFinish{\hbox to 3cm{\hrulefill}} +\def\reviewtype#1{\gdef\@reviewtype{#1}}\reviewtype{\CYRO\CYRT% +\CYRZ\CYRERY\CYRV} + +\def\patitle#1{\gdef\@patitle{#1}}\patitle{\@satitle} +\def\paname#1{\gdef\@paname{#1}}\paname{\@saname} + +\def\napravlenie#1{\gdef\@napravlenie{#1}}\napravlenie{\hbox to 3cm{\hrulefill}} +\def\Napravlenie{\@napravlenie} + + +\def\studenttitle#1{\gdef\@studenttitle{#1}}\studenttitle{\cyr\cyrs\cyrt% +\cyru\cyrd\cyre\cyrn\cyrt\cyra} +\def\studentdone#1{\gdef\@studentdone{#1}}\studentdone{\cyrp\cyrr\cyro% +\cyrsh\cyre\cyrd\cyrsh\cyre\cyrg\cyro} +\def\studentfemale{\studenttitle{\cyrs\cyrt\cyru\cyrd\cyre\cyrn\cyrt% +\cyrk\cyri}\studentdone{\cyrp\cyrr\cyro\cyrsh\cyre\cyrd\cyrsh% +\cyre\cyrishrt}} + +%\newcommand{\MakeTitle}{} + +\def\workname#1{\gdef\@workname{#1}} + +%\hbox to 3cm{\hrulefill} + +% --------------------------------------------------------------------------% + + +\newcommand{\signature}[2]{ +\hbox to 7cm{#1\hfill} \hbox to 3cm{\hrulefill} \hbox to 6cm{\hfill #2}} + +\newcommand{\inlinesignature}[2]{% +#1\qquad \hbox to 3cm{\hrulefill}\quad #2} + + +\newcommand{\signatureline}{} + +% --------------------------------------------------------------------------% +\newcommand{\scaleUnivName}{0.97} + +\DeclareOption{times}{% + \renewcommand{\rmdefault}{ftm} + \renewcommand{\scaleUnivName}{1.0} +} + +\DeclareOption{spec}{% + \spectype{\cyr\cyrs\cyrp\cyre\cyrc\cyri\cyra\cyrl\cyrsftsn\cyrn\cyro% + \cyrs\cyrt\cyri} + \spectyperod{\cyrs\cyrp\cyre\cyrc\cyri\cyra\cyrl\cyrsftsn\cyrn\cyro% + \cyrs\cyrt\cyri} + \workform{\cyr\CYRS\CYRP\CYRE\CYRC\CYRI\CYRA\CYRL\CYRI\CYRS\CYRT\CYRA} + \disserform{\CYRD\CYRI\CYRP\CYRL\CYRO\CYRM\CYRN\CYRA\CYRYA\ \CYRR\CYRA% + \CYRB\CYRO\CYRT\CYRA} + \disserformP{\CYRD\CYRI\CYRP\CYRL\CYRO\CYRM\CYRN\CYRO\CYRISHRT\ \CYRR% + \CYRA\CYRB\CYRO\CYRT\CYRE} + \disserformR{\CYRD\CYRI\CYRP\CYRL\CYRO\CYRM\CYRN\CYRO\CYRISHRT\ \CYRR% + \CYRA\CYRB\CYRO\CYRT\CYRERY} + \disserformV{\CYRD\CYRI\CYRP\CYRL\CYRO\CYRM\CYRN\CYRU\CYRYU\ \CYRR\CYRA% + \CYRB\CYRO\CYRT\CYRU} +} + +\DeclareOption{bachelor}{% + \spectype{\cyr\cyrn\cyra\cyrp\cyrr\cyra\cyrv\cyrl\cyre\cyrn\cyri\cyrya} + \spectyperod{\cyr\cyrn\cyra\cyrp\cyrr\cyra\cyrv\cyrl\cyre\cyrn\cyri \cyryu} + \workform{\cyr\CYRB\CYRA\CYRK\CYRA\CYRL\CYRA\CYRV\CYRR\CYRA} + \disserform{\CYRB\CYRA\CYRK\CYRA\CYRL\CYRA\CYRV\CYRR\CYRS\CYRK\CYRA% + \CYRYA\ \CYRR\CYRA\CYRB\CYRO\CYRT\CYRA} + \disserformP{\CYRB\CYRA\CYRK\CYRA\CYRL\CYRA\CYRV\CYRR\CYRS\CYRK\CYRO% + \CYRISHRT\ \CYRR\CYRA\CYRB\CYRO\CYRT\CYRE} + \disserformR{\CYRB\CYRA\CYRK\CYRA\CYRL\CYRA\CYRV\CYRR\CYRS\CYRK\CYRO% + \CYRISHRT\ \CYRR\CYRA\CYRB\CYRO\CYRT\CYRERY} + \disserformV{\CYRB\CYRA\CYRK\CYRA\CYRL\CYRA\CYRV\CYRR\CYRS\CYRK\CYRU% + \CYRYU\ \CYRR\CYRA\CYRB\CYRO\CYRT\CYRU} +} + +\DeclareOption{master}{% + \spectype{\cyr\cyrn\cyra\cyrp\cyrr\cyra\cyrv\cyrl\cyre\cyrn\cyri\cyrya} + \spectyperod{\cyr\cyrn\cyra\cyrp\cyrr\cyra\cyrv\cyrl\cyre\cyrn\cyri \cyryu} + \workform{\cyr\CYRM\CYRA\CYRG\CYRI\CYRS\CYRT\CYRR\CYRA} + \disserform{\CYRM\CYRA\CYRG\CYRI\CYRS\CYRT\CYRE\CYRR\CYRS\CYRK\CYRA% + \CYRYA\ \CYRR\CYRA\CYRB\CYRO\CYRT\CYRA} + \disserformP{\CYRM\CYRA\CYRG\CYRI\CYRS\CYRT\CYRE\CYRR\CYRS\CYRK\CYRO% + \CYRISHRT\ \CYRR\CYRA\CYRB\CYRO\CYRT\CYRE} + \disserformR{\CYRM\CYRA\CYRG\CYRI\CYRS\CYRT\CYRE\CYRR\CYRS\CYRK\CYRO% + \CYRISHRT\ \CYRR\CYRA\CYRB\CYRO\CYRT\CYRERY} + \disserformV{\CYRM\CYRA\CYRG\CYRI\CYRS\CYRT\CYRE\CYRR\CYRS\CYRK\CYRU% + \CYRYU\ \CYRR\CYRA\CYRB\CYRO\CYRT\CYRU} +} + +\DeclareOption{coursework}{% + \worktype{\cyr\CYRK\cyru\cyrr\cyrs\cyro\cyrv\cyra\cyrya\ \cyrr\cyra\cyrb% + \cyro\cyrt\cyra} + \renewcommand{\maketitle}{\CDMakeTitle} + \workname{\MakeUppercase{\@worktype}} + \typework{\cyr\cyrn\cyra\cyrp\cyri\cyrs\cyra\cyrn\cyra} +} + +\DeclareOption{diploma}{% + \worktype{\cyr\CYRV\cyrery\cyrp\cyru\cyrs\cyrk\cyrn\cyra\cyrya\ \cyrk\cyrv% + \cyra\cyrl\cyri\cyrf\cyri\cyrk\cyra\cyrc\cyri\cyro\cyrn\cyrn\cyra% + \cyrya\ \cyrr\cyra\cyrb\cyro\cyrt\cyra} + \worktype{\ \cyrr\cyra\cyrb\cyro\cyrt\cyra} + \renewcommand{\maketitle}{\CDMakeTitle} + \workname{\MakeUppercase{\@disserform}} + \typework{\cyr\cyrn\cyra\cyrp\cyri\cyrs\cyra\cyrn\cyra} +} + +\DeclareOption{autoref}{% + \workname{\cyr\CYRA\CYRV\CYRT\CYRO\CYRR\CYRE\CYRF\CYRE\CYRR\CYRA\CYRT\ % + \MakeUppercase{\@disserformR}} + \worktype{\ \cyrr\cyra\cyrb\cyro\cyrt\cyra} + \renewcommand{\maketitle}{\CDMakeTitle} + %\workname{\MakeUppercase{\@disserform}} + \typework{\cyr\cyrn\cyra\cyrp\cyri\cyrs\cyra\cyrn\cyra} +} + +\DeclareOption{nir}{% + \workname{\cyr\CYRO\CYRT\CYRCH\CYRE\CYRT\ \CYRO\ \CYRN\CYRA\CYRU\CYRCH% + \CYRN\CYRO-\CYRI\CYRS\CYRS\CYRL\CYRE\CYRD\CYRO\CYRV\CYRA\CYRT\CYRE\CYRL% + \CYRSFTSN\CYRS\CYRK\CYRO\CYRISHRT\ \CYRR\CYRA\CYRB\CYRO\CYRT\CYRE} + \worktype{\ \cyrr\cyra\cyrb\cyro\cyrt\cyra} + \renewcommand{\maketitle}{\CDMakeTitle} + %\workname{\MakeUppercase{\@disserform}} + \typework{\cyr\cyrn\cyra\cyrp\cyri\cyrs\cyra\cyrn\cyra} +} + +\DeclareOption{pract}{% + \worktype{\cyr\CYRO\cyrt\cyrch\cyre\cyrt\ \cyro\ \cyrp\cyrr\cyra\cyrk\cyrt% + \cyri\cyrk\cyre} + \renewcommand{\maketitle}{\MakeTitlePr} + \typework{\cyr\cyrn\cyra\cyrp\cyri\cyrs\cyra\cyrn} +} + +\DeclareOption{review}{% + \reviewtype{\CYRO\CYRT\CYRZ\CYRERY\CYRV} + \worktype{\cyrn\cyra\cyru\cyrch\cyrn\cyro\cyrg\cyro\ \cyrr\cyru\cyrk% + \cyro\cyrv\cyro\cyrd\cyri\cyrt\cyre\cyrl\cyrya\ \cyro\ \cyrv\cyrery% + \cyrp\cyru\cyrs\cyrk\cyrn\cyro\cyrishrt\ \cyrk\cyrv\cyra\cyrl\cyri\cyrf% + \cyri\cyrk\cyra\cyrc\cyri\cyro\cyrn\cyrn\cyro\cyrishrt\ \cyrr\cyra\cyrb% + \cyro\cyrt\cyre} + \workname{\cyr\cyrn\cyra\cyru\cyrch\cyrn\cyro\cyrg\cyro\ \cyrr\cyru\cyrk% + \cyro\cyrv\cyro\cyrd\cyri\cyrt\cyre\cyrl\cyrya\ \cyro\ \MakeLowercase{\@disserformP}} + %\workname{\@worktype\ \MakeLowercase{\@workform}} + \renewcommand{\maketitle}{\MakeTitleReview} + \renewcommand{\signatureline}{% + \par\noindent% + \CYRN\cyra\cyru\cyrch\cyrn\cyrery\cyrishrt\ \cyrr\cyru\cyrk\cyro\cyrv% + \cyro\cyrd\cyri\cyrt\cyre\cyrl\cyrsftsn\\% + \signature{\@satitle}{\@saname}\\% + } +} + +\DeclareOption{assignment}{% + \reviewtype{\CYRZ\CYRA\CYRD\CYRA\CYRN\CYRI\CYRE} + \worktype{\cyrn\cyra\ \cyrv\cyrery\cyrp\cyru\cyrs\cyrk\cyrn\cyru% + \cyryu\ \cyrk\cyrv\cyra\cyrl\cyri\cyrf\cyri\cyrk\cyra\cyrc\cyri\cyro% + \cyrn\cyrn\cyru\cyryu\ \cyrr\cyra\cyrb\cyro\cyrt\cyru} + \workname{\cyr\cyrn\cyra\ \MakeLowercase{\@disserformV}} + %\workname{\@worktype\ \MakeLowercase{\@workform}} + \renewcommand{\maketitle}{\MakeTitleAssign} + \renewcommand{\signatureline}{% + + \vfill% + \noindent% + \textbf{\CYRS\cyrr\cyro\cyrk\ \cyrp\cyrr\cyre\cyrd\cyro\cyrs\cyrt\cyra% + \cyrv\cyrl\cyre\cyrn\cyri\cyrya\ \cyrr\cyra\cyrb\cyro\cyrt\cyrery:}\ \@practFinish + + \vspace{2em}\raggedright + \noindent \CYRR\cyra\cyrs\cyrs\cyrm\cyro\cyrt\cyrr\cyre\cyrn\cyro\ % + \cyrn\cyra\ \cyrz\cyra\cyrs\cyre\cyrd\cyra\cyrn\cyri\cyri\ \cyrk\cyra% + \cyrf\cyre\cyrd\cyrr\cyrery\ \@chair + + \vspace{1em} + \CYRP\cyrr\cyro\cyrt\cyro\cyrk\cyro\cyrl\ \textnumero\ \@protnum\ \cyro% + \cyrt\ \@protdate + + \vspace{1em} + \raggedright + \noindent + \inlinesignature{\CYRS\cyre\cyrk\cyrr\cyre\cyrt\cyra\cyrr\cyrsftsn}{\@secrname} + + \vspace{2em} + \noindent\raggedright + \CYRD\cyra\cyrt\cyra\ \cyrv\cyrery\cyrd\cyra\cyrch\cyri\ \cyrz\cyra% + \cyrd\cyra\cyrn\cyri\cyrya\ \@practStart + + \vspace{1em} + \noindent\raggedright + \inlinesignature{\CYRZ\cyra\cyrd\cyra\cyrn\cyri\cyre\ \cyrp\cyro\cyrl% + \cyru\cyrch\cyri\cyrl}{\hbox to 3cm{\hrulefill}} + + \vspace{1cm} + } +} + +\DeclareOption{critique}{% + \reviewtype{\CYRR\CYRE\CYRC\CYRE\CYRN\CYRZ\CYRI\CYRYA} + \worktype{\cyrn\cyra\ \cyrv\cyrery\cyrp\cyru\cyrs\cyrk\cyrn\cyru% + \cyryu\ \cyrk\cyrv\cyra\cyrl\cyri\cyrf\cyri\cyrk\cyra\cyrc\cyri\cyro% + \cyrn\cyrn\cyru\cyryu\ \cyrr\cyra\cyrb\cyro\cyrt\cyru} + \workname{\cyr\cyrn\cyra\ \MakeLowercase{\@disserformV}} + %\workname{\@worktype\ \MakeLowercase{\@workform}} + \renewcommand{\maketitle}{\MakeTitleReview} + \renewcommand{\signatureline}{% + \par\noindent% + \CYRR\cyre\cyrc\cyre\cyrn\cyrz\cyre\cyrn\cyrt\\% + \signature{\@critictitle}{\@criticname}\\% + } +} + + +\DeclareOption{referat}{% + \worktype{\cyr\CYRR\cyre\cyrf\cyre\cyrr\cyra\cyrt} + \workname{\MakeUppercase{\@worktype}} + \renewcommand{\maketitle}{\RefMakeTitle} + \typework{\cyr\cyrn\cyra\cyrp\cyri\cyrs\cyra\cyrn} +} + +\DeclareOption{och}{% + \otdelenie{\cyr\cyro\cyrch\cyrn\cyro\cyrishrt\ \cyrf\cyro\cyrr\cyrm% + \cyrery\ \cyro\cyrb\cyru\cyrch\cyre\cyrn\cyri\cyrya} +} + +\DeclareOption{zaoch}{% + \otdelenie{\cyr\cyrz\cyra\cyro\cyrch\cyrn\cyro\cyrishrt\ \cyrf\cyro\cyrr% + \cyrm\cyrery\ \cyro\cyrb\cyru\cyrch\cyre\cyrn\cyri\cyrya} +} + +\ExecuteOptions{coursework,och,bachelor} +\ProcessOptions + +% --------------------------------------------------------------------------% +\newcommand*{\hm}[1]{#1\nobreak\discretionary{}% +{\hbox{$\mathsurround=0pt #1$}}{}} +% --------------------------------------------------------------------------% + +% --------------------------------------------------------------------------% + +\onehalfspacing +\parindent=1.25cm +\pagestyle{headings} +\renewcommand{\@oddhead}{} +\renewcommand{\@oddfoot}{\hfil \thepage} + +% --------------------------------------------------------------------------% +% Table and figure numbering by sections +% --------------------------------------------------------------------------% +\newif\if@secNumbering\@secNumberingfalse +\newcommand{\secNumbering}{ + \renewcommand{\thefigure}{\arabic{section}.\arabic{figure}} + \renewcommand{\thetable}{\arabic{section}.\arabic{table}} + \renewcommand{\theequation}{\arabic{section}.\arabic{equation}} + \@addtoreset{figure}{section} + \@addtoreset{table}{section} + \@addtoreset{equation}{section} + \@secNumberingtrue +} +% --------------------------------------------------------------------------% + +% --------------------------------------------------------------------------% +% Table and figure captions +% --------------------------------------------------------------------------% +\def\CaptionName#1{\gdef\@captionname{#1}} +\newlength\tmp %10cm +\setlength{\tmp}{1ex} +\setlength{\belowcaptionskip}{1ex} +\setlength{\abovecaptionskip}{1ex} + +\captionsetup[figure]{name=\CYRR\cyri\cyrs\cyru\cyrn\cyro\cyrk, labelsep=endash, + justification=centering, font={small}, skip=\abovecaptionskip, position=below} +\captionsetup[table]{name=\CYRT\cyra\cyrb\cyrl\cyri\cyrc\cyra, labelsep=endash, format=plain, + justification=RaggedRight, singlelinecheck=false, font={small}, position=top} + +% --------------------------------------------------------------------------% +% Table of contents +% --------------------------------------------------------------------------% +\renewcommand{\tableofcontents}% +{\structformat\section*{\uppercase{\cyr\CYRS\CYRO\CYRD\CYRE\CYRR\CYRZH\CYRA% +\CYRN\CYRI\CYRE}}\secformat\@starttoc{toc} +\thispagestyle{empty}} + +\renewcommand{\@dotsep}{1.5} +\renewcommand{\@pnumwidth}{1.0em} + +\newcommand{\l@abcd}[2]{{\@dottedtocline{0}{0pt}{0pt}{#1}{#2}}} + +\renewcommand{\l@section}{\@dottedtocline{1}{0em}{1.5em}} +\renewcommand{\l@subsection}{\@dottedtocline{2}{1.5em}{2.3em}} +% --------------------------------------------------------------------------% + +% --------------------------------------------------------------------------% +% Sections, subsections +% --------------------------------------------------------------------------% +% Numbering +\renewcommand{\thesection}{\arabic{section}} +\renewcommand{\thesubsection}{\arabic{section}.\arabic{subsection}} +\renewcommand{\thesubsubsection}{\arabic{section}.\arabic{subsection}.\arabic{subsubsection}} + +\newcommand{\sectionbreak}{\clearpage} + +% Contents, intro, conclusion +\newcommand{\structformat} +{ + \titlespacing{\section} + {0cm}{3ex plus 1ex minus .2ex}{1.4ex plus.2ex} + \titleformat{\section}[block] + {\centering\bfseries} + {\thesection}{0ex}{} +} + +% Sections, subsections +\newcommand{\secformat} +{ + \titlespacing{\section} + {0cm}{3ex plus 1ex minus .2ex}{0.4ex plus.2ex} + \titleformat{\section}[block] + {\hspace{1.25cm}\raggedright\bfseries} + {\thesection}{1ex}{} +} + +\newif\if@hyperrefloaded\@hyperrefloadedfalse +\AtBeginDocument{\@ifpackageloaded{hyperref}% + {\@hyperrefloadedtrue}{\@hyperrefloadedfalse}% +} + +%\RequirePackage{ifthen} +\newcommand{\starsection}[1]{ + \structformat + \section*{#1}% + \if@hyperrefloaded + \phantomsection + \fi + \addcontentsline{toc}{section}{#1} + \setcounter{section}{0} + \secformat +} + + +\setcounter{section}{0} +\secformat + + +\newcommand{\intro}{\starsection{\cyr\CYRV\CYRV\CYRE\CYRD\CYRE% +\CYRN\CYRI\CYRE}} +\newcommand{\abbreviations}{\starsection{\CYRO\CYRB\CYRO\CYRZ\CYRN\CYRA% +\CYRCH\CYRE\CYRN\CYRI\CYRYA\ \CYRI\ \CYRS\CYRO\CYRK\CYRR\CYRA\CYRSHCH% +\CYRE\CYRN\CYRI\CYRYA}} +\newcommand{\definitions}{\starsection{\CYRO\CYRP\CYRR\CYRE\CYRD\CYRE% +\CYRL\CYRE\CYRN\CYRI\CYRYA}} +\newcommand{\defabbr}{\starsection{\CYRO\CYRP\CYRR\CYRE\CYRD\CYRE\CYRL% +\CYRE\CYRN\CYRI\CYRYA, \CYRO\CYRB\CYRO\CYRZ\CYRN\CYRA\CYRCH\CYRE\CYRN% +\CYRI\CYRYA\ \CYRI\ \CYRS\CYRO\CYRK\CYRR\CYRA\CYRSHCH\CYRE\CYRN\CYRI\CYRYA}} +\newcommand{\conclusion}{\starsection{\cyr\CYRZ\CYRA\CYRK\CYRL\CYRYU% +\CYRCH\CYRE\CYRN\CYRI\CYRE}} + +% Section and subsection parameters +\titlespacing{\section} +{0cm}{3ex plus 1ex minus .2ex}{0.4ex plus.2ex} + +\titleformat{\subsection}[block] +{\hspace{1.25cm}\normalfont\bfseries} +{\thesubsection}{1ex}{} +\titlespacing{\subsection} +{0cm}{2ex plus 1ex minus .2ex}{.4ex plus.2ex} + +\titleformat{\subsubsection}[block] +{\hspace{1.25cm}\normalfont} +{\thesubsubsection}{1ex}{} +\titlespacing{\subsubsection} +{0cm}{2ex plus 1ex minus .2ex}{.4ex plus.2ex} + +% --------------------------------------------------------------------------% + +% --------------------------------------------------------------------------% + + +%\AddEnumerateCounter{\Asbuk}{\@Asbuk}{\CYRM} +%\AddEnumerateCounter{\asbuk}{\@asbuk}{\cyrm} + +\makeatletter +\def\redeflsection{\def\l@section{\@dottedtocline{1}{0em}{10em}}} +\renewcommand{\appendix}{\par% + + \renewcommand{\secNumbering}{ + \renewcommand{\thefigure}{\Asbuk{section}.\arabic{figure}} + \renewcommand{\thetable}{\Asbuk{section}.\arabic{table}} + \renewcommand{\theequation}{\Asbuk{section}.\arabic{equation}} + \@addtoreset{figure}{section} + \@addtoreset{table}{section} + \@addtoreset{equation}{section} + + } + \if@secNumbering + \secNumbering + \fi + \setcounter{section}{0}% + \setcounter{subsection}{0}% + \renewcommand{\appendixname}{\cyr\CYRP\CYRR\CYRI\CYRL\CYRO\CYRZH\CYRE% + \CYRN\CYRI\CYRE}% + \def\sectionname{\appendixname}% + \addtocontents{toc}{\protect\redeflsection}% + \gdef\thesection{\Asbuk{section}}% + \titlespacing{\section} + %{0cm}{1ex plus 0.1ex minus .2ex}{1.1ex plus.1ex} + {0cm}{3ex plus 1ex minus .2ex}{0.4ex plus.2ex} + \titleformat{\section}[display] + {\centering\normalfont\bfseries} + {\appendixname\hspace{1ex}\thesection}{0ex}{} + + + \titlecontents{section} + [3ex] + {\hspace{-3ex}} + {\appendixname~\thecontentslabel\hspace{2ex}} + {\hspace{2.3em}} + {\titlerule*[0.98ex]{.}\contentspage} + +} + + + +% --------------------------------------------------------------------------% +% Title pages +% --------------------------------------------------------------------------% +%\newcommand{\shapka}{{\centering \CYRM\CYRI\CYRN\CYRO\CYRB\CYRR\CYRN\CYRA% +%\CYRU\CYRK\CYRI\ \CYRR\CYRO\CYRS\CYRS\CYRI\CYRI\\ % +%\CYRF\cyre\cyrd\cyre\cyrr\cyra\cyrl\cyrsftsn\cyrn\cyro\cyre\ \cyrg\cyro% +%\cyrs\cyru\cyrd\cyra\cyrr\cyrs\cyrt\cyrv\cyre\cyrn\cyrn\cyro\cyre\ % +%\cyrb\cyryu\cyrd\cyrzh\cyre\cyrt\cyrn\cyro\cyre\ \cyro\cyrb\cyrr\cyra% +%\cyrz\cyro\cyrv\cyra\cyrt\cyre\cyrl\cyrsftsn\cyrn\cyro\cyre\ \cyru% +%\cyrch\cyrr\cyre\cyrzh\cyrd\cyre\cyrn\cyri\cyre\ \cyrv\cyrery\cyrs% +%\cyrsh\cyre\cyrg\cyro\ \cyro\cyrb\cyrr\cyra\cyrz% +%\cyro\cyrv\cyra\cyrn\cyri\cyrya\\ +%\textbf{<<\CYRS\CYRA\CYRR\CYRA\CYRT\CYRO\CYRV\CYRS\CYRK\CYRI\CYRISHRT\ % +%\CYRN\CYRA\CYRC\CYRI\CYRO\CYRN\CYRA\CYRL\CYRSFTSN\CYRN\CYRERY% +%\CYRISHRT\ \CYRI\CYRS\CYRS\CYRL\CYRE\CYRD\CYRO\CYRV\CYRA\CYRT\CYRE\CYRL% +%\CYRSFTSN\CYRS\CYRK\CYRI\CYRISHRT\ % +%\CYRG\CYRO\CYRS\CYRU\CYRD\CYRA\CYRR\CYRS\CYRT\CYRV\CYRE\CYRN\CYRN\CYRERY% +%\CYRISHRT\ \CYRU\CYRN\CYRI\CYRV\CYRE\CYRR\CYRS\CYRI\CYRT\CYRE\CYRT\ % +%\CYRI\CYRM\CYRE\CYRN\CYRI~\CYRN.\,\CYRG.\,\CYRCH\CYRE\CYRR\CYRN\CYRERY% +%\CYRSH\CYRE\CYRV\CYRS\CYRK\CYRO\CYRG\CYRO>>}\\}} + +%\newcommand{\shapka}{{\centering \CYRM\CYRI\CYRN\CYRO\CYRB\CYRR\CYRN\CYRA% +%\CYRU\CYRK\CYRI\ \CYRR\CYRO\CYRS\CYRS\CYRI\CYRI\\ \hspace{-1em}% +%\CYRF\cyre\cyrd\cyre\cyrr\cyra\cyrl\cyrsftsn\cyrn\cyro\cyre\ \cyrg\cyro% +%\cyrs\cyru\cyrd\cyra\cyrr\cyrs\cyrt\cyrv\cyre\cyrn\cyrn\cyro\cyre\ % +%\cyrb\cyryu\cyrd\cyrzh\cyre\cyrt\cyrn\cyro\cyre\ \cyro\cyrb\cyrr\cyra% +%\cyrz\cyro\cyrv\cyra\cyrt\cyre\cyrl\cyrsftsn\cyrn\cyro\cyre\ \cyru% +%\cyrch\cyrr\cyre\cyrzh\cyrd\cyre\cyrn\cyri\cyre\ \\\cyrv\cyrery\cyrs% +%\cyrsh\cyre\cyrg\cyro\ \cyro\cyrb\cyrr\cyra\cyrz% +%\cyro\cyrv\cyra\cyrn\cyri\cyrya\\\hspace{-2em} +%{ +%\textbf{<<\CYRS\CYRA\CYRR\CYRA\CYRT\CYRO\CYRV\CYRS\CYRK\CYRI\CYRISHRT\ % +%\CYRN\CYRA\CYRC\CYRI\CYRO\CYRN\CYRA\CYRL\CYRSFTSN\CYRN\CYRERY% +%\CYRISHRT\ \CYRI\CYRS\CYRS\CYRL\CYRE\CYRD\CYRO\CYRV\CYRA\CYRT\CYRE\CYRL% +%\CYRSFTSN\CYRS\CYRK\CYRI\CYRISHRT}} \\% +%{\textbf{\CYRG\CYRO\CYRS\CYRU\CYRD\CYRA\CYRR\CYRS\CYRT\CYRV\CYRE\CYRN\CYRN\CYRERY% +%\CYRISHRT\ \CYRU\CYRN\CYRI\CYRV\CYRE\CYRR\CYRS\CYRI\CYRT\CYRE\CYRT}} \\% +%{\textbf{\CYRI\CYRM\CYRE\CYRN\CYRI~\CYRN.\,\CYRG.\,\CYRCH\CYRE\CYRR\CYRN\CYRERY% +%\CYRSH\CYRE\CYRV\CYRS\CYRK\CYRO\CYRG\CYRO>>}}\\}} + +\newcommand{\shapka}{{\centering \CYRM\CYRI\CYRN\CYRO\CYRB\CYRR\CYRN\CYRA% +\CYRU\CYRK\CYRI\ \CYRR\CYRO\CYRS\CYRS\CYRI\CYRI\\ % +\CYRF\cyre\cyrd\cyre\cyrr\cyra\cyrl\cyrsftsn\cyrn\cyro\cyre\ \cyrg\cyro% +\cyrs\cyru\cyrd\cyra\cyrr\cyrs\cyrt\cyrv\cyre\cyrn\cyrn\cyro\cyre\ % +\cyrb\cyryu\cyrd\cyrzh\cyre\cyrt\cyrn\cyro\cyre\ \cyro\cyrb\cyrr\cyra% +\cyrz\cyro\cyrv\cyra\cyrt\cyre\cyrl\cyrsftsn\cyrn\cyro\cyre\ \cyru% +\cyrch\cyrr\cyre\cyrzh\cyrd\cyre\cyrn\cyri\cyre\ \\\cyrv\cyrery\cyrs% +\cyrsh\cyre\cyrg\cyro\ \cyro\cyrb\cyrr\cyra\cyrz% +\cyro\cyrv\cyra\cyrn\cyri\cyrya\\[0.2em] + +\centerline{\scalebox{\scaleUnivName}[1.0]{\parbox[t]{1.1\textwidth} +{\centering +\textbf{<<\CYRS\CYRA\CYRR\CYRA\CYRT\CYRO\CYRV\CYRS\CYRK\CYRI\CYRISHRT\ % +\CYRN\CYRA\CYRC\CYRI\CYRO\CYRN\CYRA\CYRL\CYRSFTSN\CYRN\CYRERY% +\CYRISHRT\ \CYRI\CYRS\CYRS\CYRL\CYRE\CYRD\CYRO\CYRV\CYRA\CYRT\CYRE\CYRL% +\CYRSFTSN\CYRS\CYRK\CYRI\CYRISHRT\ \\% +\CYRG\CYRO\CYRS\CYRU\CYRD\CYRA\CYRR\CYRS\CYRT\CYRV\CYRE\CYRN\CYRN\CYRERY% +\CYRISHRT\ \CYRU\CYRN\CYRI\CYRV\CYRE\CYRR\CYRS\CYRI\CYRT\CYRE\CYRT\ \\% +\CYRI\CYRM\CYRE\CYRN\CYRI~\CYRN.\,\CYRG.\,\CYRCH\CYRE\CYRR\CYRN\CYRERY% +\CYRSH\CYRE\CYRV\CYRS\CYRK\CYRO\CYRG\CYRO>>}}}}}} + +\newcommand{\CDMakeTitle} +{ +\thispagestyle{empty} +\shapka +%\vspace{0.5cm} +\begin{center} +%\parbox{8cm}{ +%\raggedright +\CYRK\cyra\cyrf\cyre\cyrd\cyrr\cyra\ \@chair +%} +\end{center} + +\vspace{14pt} +\vspace{1cm} +{\centering +\textbf{\MakeUppercase{\@title}} +\\[0.3cm] +{\@workname} + +} + +\vspace{1.5cm} +\begin{flushleft} +\@studenttitle\ \@course\ \cyrk\cyru\cyrr\cyrs\cyra\ \@group\ \cyrg% +\cyrr\cyru\cyrp\cyrp\cyrery\\ +\@spectype\ \@napravlenie\\ +\@department\\ +\@author +\end{flushleft} +\vfill + +\noindent +\CYRN\cyra\cyru\cyrch\cyrn\cyrery\cyrishrt\ \cyrr\cyru\cyrk\cyro\cyrv% +\cyro\cyrd\cyri\cyrt\cyre\cyrl\cyrsftsn\\ +\signature{\@satitle}{\@saname}\\[14pt] +\CYRZ\cyra\cyrv\cyre\cyrd\cyru\cyryu\cyrshch\cyri\cyrishrt\ \cyrk\cyra% +\cyrf\cyre\cyrd\cyrr\cyro\cyrishrt\\ +\signature{\@chtitle}{\@chname} + +\vfill +{\centering{\cyr\CYRS\cyra\cyrr\cyra\cyrt\cyro\cyrv\ \@date} + +} +\newpage +} +% --------------------------------------------------------------------------% + +% --------------------------------------------------------------------------% +% Title page of internship +% --------------------------------------------------------------------------% +\newcommand{\MakeTitlePr} +{ +\thispagestyle{empty} +\begin{center} +\shapka +\end{center} +\vspace{0.5cm} + + +\begin{flushright} + \parbox{7cm}{ + \begin{flushleft} + \CYRU\CYRT\CYRV\CYRE\CYRR\CYRZH\CYRD\CYRA\CYRYU\\ + \CYRZ\cyra\cyrv.\cyrk\cyra\cyrf\cyre\cyrd\cyrr\cyro\cyrishrt,\\ + \@chtitle\\ + \hbox to 7cm{\hrulefill\ \@chname} + \end{flushleft} + } +\end{flushright} + +\vspace{1cm} +\begin{center}\textbf{\MakeUppercase{\@worktype}}\end{center} +\begin{flushleft} + \vspace{12pt} + \@studenttitle\ \@course\ \cyrk\cyru\cyrr\cyrs\cyra\ \@group\ \cyrg% + \cyrr\cyru\cyrp\cyrp\cyrery\ \@department\\ + \@author + \vspace{0.5cm} + + + \cyrv\cyri\cyrd\ \cyrp\cyrr\cyra\cyrk\cyrt\cyri\cyrk\cyri: \@practtype\\ + \cyrk\cyra\cyrf\cyre\cyrd\cyrr\cyra: \@chair\\ + \cyrk\cyru\cyrr\cyrs: \@course\\ + \cyrs\cyre\cyrm\cyre\cyrs\cyrt\cyrr: \@term\\ + \cyrp\cyrr\cyro\cyrd\cyro\cyrl\cyrzh\cyri\cyrt\cyre\cyrl\cyrsftsn\cyrn% + \cyro\cyrs\cyrt\cyrsftsn: \@duration\ \cyrn\cyre\cyrd., \cyrs\ \@practStart\ \cyrg. \cyrp\cyro\ \@practFinish\ \cyrg. +\end{flushleft} +%\parindent=-0.2cm +\vspace{1cm} + +\noindent +\CYRR\cyru\cyrk\cyro\cyrv\cyro\cyrd\cyri\cyrt\cyre\cyrl\cyrsftsn\ \cyrp% +\cyrr\cyra\cyrk\cyrt\cyri\cyrk\cyri\ \cyro\cyrt\ \cyru\cyrn\cyri\cyrv% +\cyre\cyrr\cyrs\cyri\cyrt\cyre\cyrt\cyra,\\[12pt]% +\signature{\@satitle}{\@saname}\\[14pt] +\CYRR\cyru\cyrk\cyro\cyrv\cyro\cyrd\cyri\cyrt\cyre\cyrl\cyrsftsn\ \cyrp% +\cyrr\cyra\cyrk\cyrt\cyri\cyrk\cyri\ \cyro\cyrt\ \cyro\cyrr\cyrg\cyra% +\cyrn\cyri\cyrz\cyra\cyrc\cyri\cyri\ (\cyru\cyrch\cyrr\cyre\cyrzh\cyrd% +\cyre\cyrn\cyri\cyrya, \cyrp\cyrr\cyre\cyrd\cyrp\cyrr\cyri\cyrya\cyrt% +\cyri\cyrya),\\[12pt]% +\signature{\@patitle}{\@paname} + +\newpage +\thispagestyle{empty} +\vspace*{11cm} +\CYRT\cyre\cyrm\cyra\ \cyrp\cyrr\cyra\cyrk\cyrt\cyri\cyrk\cyri:<<\@title>> +\parindent=1.25cm +\newpage +} +% --------------------------------------------------------------------------% + +% --------------------------------------------------------------------------% +% Title page of review +% --------------------------------------------------------------------------% +\newcommand{\MakeTitleReview} +{ +\pagestyle{empty} +\begin{center} +\shapka +\end{center} + + +{ +\centering +\textbf{\MakeUppercase{\@reviewtype}}\\[-0.3em] +\textbf{\@workname}\\[0.3em] +<<{\MakeUppercase{\@title}}>> + +\@studenttitle\ \@course\ \cyrk\cyru\cyrr\cyrs\cyra\ % +\@department\\ + +\centering +{\@author}\\ + +\centering +\@studentdone\ \cyro\cyrb\cyru\cyrch\cyre\cyrn\cyri\cyre\ \cyrp% +\cyro\ \@spectyperod\ \@napravlenie + +} +\vspace{2em} +} +% --------------------------------------------------------------------------% + + +% --------------------------------------------------------------------------% +% Title page of assignment +% --------------------------------------------------------------------------% +\newcommand{\MakeTitleAssign} +{ +\pagestyle{empty} +\begin{center} +\shapka +\end{center} + +{ +\centering +\CYRK\cyra\cyrf\cyre\cyrd\cyrr\cyra\ \@chair + + +\vspace{6em} +\centering +\textbf{\MakeUppercase{\@reviewtype}\\%[-0.3em] +\@workname} + +\vspace{0.3em} +\raggedright +\cyrp\cyro\ \@spectyperod\ \@napravlenie\\ +\@studenttitle\ \@course\ \cyrk\cyru\cyrr\cyrs\cyra\ % +\@department\\ +\MakeUppercase{\@author}\\ +\textbf{\CYRT\cyre\cyrm\cyra\ \cyrr\cyra\cyrb\cyro\cyrt\cyrery:} <<{\MakeUppercase{\@title}}>> + +} + +\vfill + +\noindent +\CYRN\cyra\cyru\cyrch\cyrn\cyrery\cyrishrt\ \cyrr\cyru\cyrk\cyro\cyrv% +\cyro\cyrd\cyri\cyrt\cyre\cyrl\cyrsftsn\\ +\signature{\@satitle}{\@saname}\\[14pt] +\CYRZ\cyra\cyrv\cyre\cyrd\cyru\cyryu\cyrshch\cyri\cyrishrt\ \cyrk\cyra% +\cyrf\cyre\cyrd\cyrr\cyro\cyrishrt\\ +\signature{\@chtitle}{\@chname} + +\vfill +{\centering{\cyr\CYRS\cyra\cyrr\cyra\cyrt\cyro\cyrv\ \@date} + +} +\newpage +\begin{center}\bf +C\cyro\cyrd\cyre\cyrr\cyrzh\cyra\cyrn\cyri\cyre\ \cyrr\cyra\cyrb% +\cyro\cyrt\cyrery +\end{center} +} +% --------------------------------------------------------------------------% + +% --------------------------------------------------------------------------% +% Referat title page +% --------------------------------------------------------------------------% +\newcommand{\RefMakeTitle} +{ +\thispagestyle{empty} +\shapka + +\vspace{3cm} +{\centering +\textbf{\MakeUppercase{\@title}} +\\[0.3cm] +{\@workname} + +} + +\vspace{1.5cm} +\begin{flushleft} +\@studenttitle\ \@course\ \cyrk\cyru\cyrr\cyrs\cyra\ \@group\ \cyrg% +\cyrr\cyru\cyrp\cyrp\cyrery\\ +\@spectype\ \@napravlenie\\ +\@department\\ +\@author +\end{flushleft} +\vfill + +\noindent +\CYRP\cyrr\cyro\cyrv\cyre\cyrr\cyre\cyrn\cyro:\\ +\signature{\@satitle}{\@saname} + +\vfill +{\centering{\cyr\CYRS\cyra\cyrr\cyra\cyrt\cyro\cyrv\ \@date} + +} +\newpage +} +% --------------------------------------------------------------------------% + +% --------------------------------------------------------------------------% +% Last page +% --------------------------------------------------------------------------% +\newcommand{\lastpage} +{ +\newpage +\thispagestyle{empty} +\vspace*{11cm} +\@worktype\ <<\@title>>\ \@typework\ \cyrm\cyrn\cyro\cyrishrt\ % +\cyrs\cyra\cyrm\cyro\cyrs\cyrt\cyro\cyrya\cyrt\cyre\cyrl\cyrsftsn\cyrn% +\cyro, \cyri\ \cyrn\cyra\ \cyrv\cyrs\cyre\ \cyri\cyrs\cyrt\cyro\cyrch% +\cyrn\cyri\cyrk\cyri, \cyri\cyrm\cyre\cyryu\cyrshch\cyri\cyre\cyrs% +\cyrya\ \cyrv\ \cyrr\cyra\cyrb\cyro\cyrt\cyre, \cyrd\cyra\cyrn\cyrery\ % +\cyrs\cyro\cyro\cyrt\cyrv\cyre\cyrs\cyrt\cyrv\cyru\cyryu\cyrshch\cyri% +\cyre\ \cyrs\cyrs\cyrery\cyrl\cyrk\cyri.\par +\parindent=9cm +\parbox{8cm}{ +\begin{flushleft} +\hbox to 6cm{\hbox to 3.5cm{\hrulefill}/\hbox to 3.5cm{\hrulefill}/} +\end{flushleft} +} +} + +\AddEnumerateCounter{\Asbuk}{\@Asbuk}{\CYRM} +\AddEnumerateCounter{\asbuk}{\@asbuk}{\cyrm} + +% --------------------------------------------------------------------------% +% enumerations +% --------------------------------------------------------------------------% +\setlist{noitemsep} +%\setlist[1]{labelindent=\parindent} % < Usually a good idea +\setlist[itemize]{ +%leftmargin=52pt, +rightmargin=0pt, +labelsep=7pt, +labelwidth=20pt, +itemindent=0pt, +listparindent=0pt, +topsep=0pt,%4pt plus 2pt minus 4pt, +partopsep=0pt,% plus 1pt minus 1pt, +parsep=0pt,% plus 1pt, +itemsep=0 pt%\parsep +} +\setlist[enumerate]{ +%leftmargin=52pt, +rightmargin=0pt, +labelsep=5pt, +labelwidth=20pt, +itemindent=0pt, +listparindent=0pt, +topsep=0pt,%4pt plus 2pt minus 4pt, +partopsep=0pt,% plus 1pt minus 1pt, +parsep=0pt,% plus 1pt, +itemsep=0pt%\parsep +} +\setlist[itemize,1]{label={\normalfont\bfseries\textemdash}} +%\setlist[enumerate]{labelsep=*, leftmargin=1.5pc} +\setlist[enumerate,1]{label=\arabic*., ref=\arabic*} +\setlist[enumerate,2]{label=\emph{\asbuk*}), ref=\theenumi.\emph{\asbuk*}} +\setlist[enumerate,3]{label=\roman*., ref=\theenumii.\roman*} +\setlist[enumerate,4]{label=\Asbuk*., ref=\theenumiii.\Asbuk*} +%\setlist[description]{font=\sffamily\bfseries} + +%%%\renewcommand{\@listI}{% +%%%\leftmargin=52pt +%%%\rightmargin=0pt +%%%\labelsep=7pt +%%%\labelwidth=20pt +%%%\itemindent=0pt +%%%\listparindent=0pt +%%%\topsep=4pt plus 2pt minus 4pt +%%%\partopsep=0pt plus 1pt minus 1pt +%%%\parsep=0pt plus 1pt +%%%\itemsep=\parsep} + +%%%\renewcommand\theenumi {\@arabic\c@enumi} +%%%\renewcommand\theenumii {\asbuk{enumii}} +%%%\renewcommand\theenumiii{\@roman\c@enumiii} +%%%\renewcommand\theenumiv {\Asbuk{enumiv}} +%%%\newcommand\atheenumi{\asbuk{enumi}} +%%%\newcommand\atheenumii{\asbuk{enumii}} +%%%\renewcommand\labelenumi {\theenumi.} +%%%\renewcommand\labelenumii {\theenumii.} +%%%\renewcommand\labelenumiii{\theenumiii.} +%%%\renewcommand\labelenumiv {\theenumiv.} +%%%\renewcommand\p@enumii {\theenumi} +%%%\renewcommand\p@enumiii {\theenumi.\theenumii} +%%%\renewcommand\p@enumiv {\p@enumiii.\theenumiii} +%%%\renewcommand\labelitemi {\normalfont\bfseries\textemdash} +%%%\renewcommand\labelitemii {\normalfont\bfseries\textendash} +%%%\renewcommand\labelitemiii{\textperiodcentered} +%%%\renewcommand\labelitemiv {\textasteriskcentered} +%%% +%%%\renewcommand{\@listI}{% +%%%\leftmargin=52pt +%%%\rightmargin=0pt +%%%\labelsep=7pt +%%%\labelwidth=20pt +%%%\itemindent=0pt +%%%\listparindent=0pt +%%%\topsep=4pt plus 2pt minus 4pt +%%%\partopsep=0pt plus 1pt minus 1pt +%%%\parsep=0pt plus 1pt +%%%\itemsep=\parsep} +% --------------------------------------------------------------------------% + + +% --------------------------------------------------------------------------% +% References +% --------------------------------------------------------------------------% +\makeatletter +\def\@biblabel#1{#1 } + +\renewenvironment{thebibliography}[1] +{ + \starsection{\cyr\CYRS\CYRP\CYRI\CYRS\CYRO\CYRK\ \CYRI\CYRS\CYRP\CYRO\CYRL% + \CYRSFTSN\CYRZ\CYRO\CYRV\CYRA\CYRN\CYRN\CYRERY\CYRH\ \CYRI\CYRS\CYRT% + \CYRO\CYRCH\CYRN\CYRI\CYRK\CYRO\CYRV} + \list{\@biblabel{\@arabic\c@enumiv}}% + {\settowidth\labelwidth{\@biblabel{#1}}% + \leftmargin\labelwidth + \advance\leftmargin\labelsep + \setlength{\itemsep}{0pt} + \@openbib@code + \usecounter{enumiv}% + \let\p@enumiv\@empty + \renewcommand\theenumiv{\@arabic\c@enumiv}}% + \sloppy + \clubpenalty4000 + \@clubpenalty \clubpenalty + \widowpenalty4000% + \sfcode`\.\@m} +{\def\@noitemerr + {\@latex@warning{Empty `thebibliography' environment}}% + \endlist} + +\makeatother +% --------------------------------------------------------------------------% diff --git a/report/coursework.pdf b/report/coursework.pdf new file mode 100644 index 0000000..e379155 Binary files /dev/null and b/report/coursework.pdf differ diff --git a/report/coursework.tex b/report/coursework.tex new file mode 100644 index 0000000..3821166 --- /dev/null +++ b/report/coursework.tex @@ -0,0 +1,498 @@ +\documentclass[spec, och, coursework]{SCWorks} +\usepackage{preamble} + + +\begin{document} +\include{titlepage.tex} +\tableofcontents + + +\intro +Для безопасного ведения корреспонденции в Интернете необходимы способы +подтверждения авторства того или иного пользователя для каждого сообщения. +Методы, используемые для реализации таких систем взаимодействия зачастую +намного более надёжные, чем системы общения с помощью физических бумажных +носителей. Такая надёжность достигается с помощью использования современных +криптографических протоколов, взлом которых является крайне неэффективной +задачей. + +Основной схемой подтверждения авторства какого-либо сообщения является +\textit{Электронная цифровая подпись}. При подписи сообщения по такой схеме +используется сразу несколько криптографических протоколов, обеспечивающих +надёжность подписи. + +Для реализации алгоритмов цифровой подписи обычно используется два +криптографических алгоритма: +\begin{itemize} + \item + Хэш-функции --- односторонние функции, которые однозначно преобразуют + сообщение произвольной длины в сообщение фиксированной длины; + \item + Системы с открытым ключом --- системы ассиметричного шифрования, + которые позволяют надёжно защитить электронную подпись от подделки. +\end{itemize} + +Системы, в которых используется какой-либо вид цифровой подписи способны +распознать любые попытки компрометации сообщений любого своего пользователя. + + +\section{Хэширование} +В основе алгоритмов цифровой подписи обычно используется какая-либо +односторонняя хэш-фунцкция в том или ином виде. + +Хэш-функция определена для сообщений любой длины, при этом в результате +получается хэш некоторой фиксированной длины. То есть $h = H(M)$, где +$H$ -- некоторая хэш-функция, $M$ -- некоторое сообщение, а $h$ -- хэш +сообщения, полученный с помощью функции $H$. При этом хэш-функции обладают +дополнительными свойствами, которые обеспечивают полезность таких функций +в крипографии: + +\begin{itemize} + \item Для данного $M$ легко вычислить $h$; + \item Для данного $h$ сложно вычислить такое $M$, что $H(M) = h$; + \item Для данного $M$ сложно найти другое такое $M'$, что $H(M) = H(M')$. +\end{itemize} + +На практике, для реализации односторонних хэш-функций используется идея функции +сжатия. В результате применения такой функции получается значение длины $n$, +меньшее длины $m$ исходного сообщения. В качестве параметров односторонняя +функция сжатия принимает часть сообщения и хэш-значение всех предыдущих блоков, +полученных по данному алгоритму. Таким образом хэш текущей части сообщения $M_i$ +вычисляется по формуле \[ h_i = f(M_i, h_{i - 1}) \]. + +Это значение становится одним из параметров для вычисления хэша для следующего +блока сообщения. Хэшем всего сообщения является хэш последнего блока. +\cite{scheiner-applied} + +Наиболее известными алгоритмами хэширования являются MD5 и SHA, разработанные +в 1991 и 1995 году соответственно. На данный момент оба алгоритма считаются +небезопасными для определённых целей, но на их примере можно рассмотреть +практическую реализацию и применение односторонних хэш-функций. + + +\subsection{MD5} +Алгоритм MD5 основан является улучшенной версией предшествующего алгоритма MD4. +Они cхожи по дизайну, хотя MD5 является несколько более сложным. Эти алгоритмы +обрабатывают данное сообщение блоким по 512 бит, которые в свою очередь +разбиты на 16 32-битных подблоков. В результате их исполнения в обоих случаях +получается хэш длины 128 бит, который получается конкатенацией четырёх +32-битных блоков. + +Перед применением непосредственно алгоритма хэширования MD5 предварительно +обрабатывает сообщение. Суть обработки состоит в том, что сообщение дополняется +так, что его длина была на 64 бита меньше числа, кратного 512. Дополнение +состоит из одного единичного бита, за которым следует необходимое количество +нулей. После этого в конце добавляется 64-битное представление длины сообщения +(до дополнения). Таким образом, в резултате получается сообщение, длина которого +кратна 512 битам. + +Следующим шагом будет установка начальных значений четырёх \textit{цепных +переменных}. Они получают следующие значения: +\begin{align*} + A &= \texttt{01234567}_{16} \\ + B &= \texttt{89abcdef}_{16} \\ + C &= \texttt{fedcba98}_{16} \\ + D &= \texttt{76542210}_{16} +\end{align*} + +Эти значения копируются в новые временные переменные $a = A$, $b = B$, $c = C$, +$d = D$. + +Алгоритм обрабатывает изначальное сообщения по циклам, при этом в каждом цикле +обрабатывается свой 512-битный блок. Каждый цикл разделён на 4 раунда, в каждом +из который используется своя нелинейная функция +\begin{align*} + F(x, y, z) &= (x \land y) \lor (\neg x \land z) \\ + G(x, y, z) &= (x \land z) \lor (\neg z \land y) \\ + H(x, y, z) &= x \oplus y \oplus z \\ + I(x, y, z) &= y \oplus (x \lor \neg z) +\end{align*} + +Для обработки $j$-го 32-битного подблока $M_j$ вводятся ещё четыре операции для +каждого из четырёх раундов: +\begin{align*} + FF(a, b, c, d, M_j, s, t_i) &= (a = b + ((a + F(b, c, d) + M_j + t_i) <<< s)) \\ + GG(a, b, c, d, M_j, s, t_i) &= (a = b + ((a + G(b, c, d) + M_j + t_i) <<< s)) \\ + HH(a, b, c, d, M_j, s, t_i) &= (a = b + ((a + H(b, c, d) + M_j + t_i) <<< s)) \\ + II(a, b, c, d, M_j, s, t_i) &= (a = b + ((a + I(b, c, d) + M_j + t_i) <<< s)) +\end{align*} + +Каждая итерация состоит из 64 шагов по 16 шагов на раунд. Для шагов +$i = \overline{1,64}$ константа $t_i = \left[2^{32} \cdot |\sin(i)|\right]$. +После выполнения всех шагов алгоритма, изменённые значения $a$, $b$, $c$, $d$ +прибавляются к $A$, $B$, $C$, $D$ и алгоритм повторяется для следующего блока +сообщения. Результат получается после выполнения алгоритма на последнем блоке и +конкатенации $A$, $B$, $C$ и $D$. + +Операции каждого раунда MD5 можно посмотреть в приложении $?$. +\cite{scheiner-applied} + + +\subsection{Secure Hash Algorithm} +Алгоритм хэширования SHA (или SHA-1) в общих чертах схож с алгоритмом MD4, +но в нём присутствуют дополнительные изменения, которые делают его более +криптостойким. +\begin{enumerate} + \item + Более длинная 160-битная длина хэша из-за использования пяти цепных + переменных вместо четырёх; + \item + В SHA используется 4 раунда, как и в MD5, но при этом в четвёртом + раунде используется такая же функция, как и во втором; + \item Количество шагов алгоритма увеличено с 64 до 80; + \item + Количество числовых констант уменьшено до четырёх, каждая из которых + является общей для одного из раундов алгоритма, вместо уникальной + константы для каждого шага алгоритма; + \item Изменён набор нелинейных функций. +\end{enumerate} + +Как и в MD5 первым шагом является установка начальных значений цепных +переменных: +\[ A = \texttt{67452301}_{16} \] +\[ B = \texttt{efcdab89}_{16} \] +\[ C = \texttt{98badcfe}_{16} \] +\[ D = \texttt{10325476}_{16} \] +\[ E = \texttt{c3d2e1f0}_{16} \] + +На каждой итерации алгоритма обрабатывается очередной блок исходного сообщения. +Значения цепных переменных копируются в новые переменные $a = A$, $b = B$, +$c = C$, $d = D$, $e = E$. + +Набор нелинейных функций у SHA следующий: +\begin{align*} + f_t(x, y, z) &= (x \land y) \lor (\neg x \land z), \, \text{для } t = \overline{0, 19} \\ + f_t(x, y, z) &= x \oplus y \oplus z, \, \text{для } t = \overline{20, 39} \\ + f_t(x, y, z) &= (x \land y) \lor (x \land z) \lor (y \land z), \, \text{для } t = \overline{40, 59} \\ + f_t(x, y, z) &= x \oplus y \oplus z, \, \text{для } t = \overline{60, 79} +\end{align*} + +Обрабатываемый блок сообщения преобразуется из 16 32-битных слов ($M_i, \, +i = \overline{0, 15}$) в 80 32-битных слов ($W_i, \, i = \overline{0, 79}$) +по следующему алгоритму: +\begin{align*} + W_t &= M_t, \, \text{для } t = \overline{0, 15} \\ + W_t &= (W_{t - 3} \oplus W_{t - 8} \oplus W_{t - 14} \oplus W_{t - 16}) <<< 1, \, \text{для } t = \overline{16, 79} +\end{align*} + +Для четырёх раундов используются следующие числовые константы: +\begin{align*} + K_t &= \left[\frac{\sqrt{2}}{4} \cdot 2^{32}\right] = \texttt{5a827999}_{16}, \, \text{для } t = \overline{0, 19} \\ + K_t &= \left[\frac{\sqrt{3}}{4} \cdot 2^{32}\right] = \texttt{6ed9eba1}_{16}, \, \text{для } t = \overline{20, 39} \\ + K_t &= \left[\frac{\sqrt{5}}{4} \cdot 2^{32}\right] = \texttt{8f1bbcdc}_{16}, \, \text{для } t = \overline{40, 59} \\ + K_t &= \left[\frac{\sqrt{10}}{4} \cdot 2^{32}\right] = \texttt{ca62c1d6}_{16}, \, \text{для } t = \overline{60, 79} \\ +\end{align*} + +Основной цикл алгоритма: +\begin{minted}{basic} + for t = 0 to 79 + tmp = (a <<< 5) + f_t(b, c, d) + e + W_t + K_t + e = d + d = c + c = b <<< 30 + b = a + a = tmp +\end{minted} + +Далее переменные $a$, $b$, $c$, $d$ и $e$ прибавляются к $A$, $B$, $C$, $D$ +и $E$ соответственно. Результатом всего алгоритма является конкатенация +$A$, $B$, $C$, $D$ и $E$ после выполнения его для всех блоков исходного +сообщения. + +\section{Ассиметричное шифрование} +В системах шифрования с открытым ключом (ассиметричных системах шифрования) +каждый из пользователей обладает некоторым ключом $k$, состоящим из +открытого ключа $k_o$, который определяет правило шифрования $E_k$, +и закрытого ключа $k_p$, который определяет правило расшифрования $D_k$. +Эти правила связаны соотношением +\[ E_k(M) = C, \, D_k(C) = M \] +где $M$ --- любой открытый текст, $C$ --- шифротекст. \cite{alferov} + +Для отправки конфиденциального сообщения от пользователя B пользователю A, +следует использовать следующий алгоритм: +\begin{enumerate} + \item Пользователь B запрашивает у пользователя A копию открытого ключа $k_o$; + \item Пользователь B вычисляет шифротекст $C = E_k(M)$ для своего сообщения $M$; + \item + Пользователь A получает шифротекст $C$ и расшифровывает его с помощью + своего закрытого ключа $k_p$, чтобы получить зашифрованное сообщение + $M = D_k(C)$. +\end{enumerate} + +Системы шифрования с открытым ключом осуществляют блочное шифрование, поэтому +текст исходного сообщения перед началом алгоритма шифрования разбивается на +блоки необходимого размера, которые затем последовательно преобразуются. +Ассиметричные системы обычно обеспечивают значительно меньшие скорости +шифрования, чем симметричные системы из-за чего из зачастую используют только +для передачи ключей пользователей, которые затем используются в симметричных +системах шифрования. + +\subsection{RSA} +Для обеспечения шифрования в алгоритме RSA используется факт того, что +имея два достаточно больших простых числа можно легко найти их произведение, +но имея произведение двух простых чисел нет простого способа найти его +разложение на множители \cite{encyclopedia}. Пусть $n = p \cdot q$ --- целое +число, представимое в виде произведения +двух больших простых числел $p$ и $q$. Выберем два числа $e$ и $d$ из условия +\[ e \cdot d \equiv 1 (\text{mod } \varphi(n)) \] +где $\varphi(n) = (p - 1) \cdot (q - 1)$ --- значение функции Эйлера от числа +$n$. + +Пусть $k = (n, p, q, e, d)$ --- некоторый выбранный ключ, который состоит из +открытого ключа $k_o = (n, e)$ и закрытого ключа $k_p = (n, p, q, d)$. +Тогда правила шифрования и расшифрования для некоторого сообщения $M$ и +шифротекста $C$ определяются следующими формулами: +\[ C = E_k(M) = M^e (\text{mod } n), \, D_k(C) = C^d (\text{mod } n) = M\] + +Нетрудно продемонстрировать, что сложность нахождения секретного ключа RSA +определяется сложностью факторизации числа $n$. Поэтому для создания ключа +следует использовать достаочно длинные простые числа, на которые также +можно наложить дополнительные требования для усложнения задачи: +\begin{enumerate} + \item + Числа $p$ и $q$ должны не слишком сильно отличаться друг от друга, но + и не быть слишком близкими друг к другу; + \item + Следует подобрать такие два таких числа, что наибольший общий делитель + чисел $p - 1$ и $q - 1$ был небольшим (желательно, равным 2); + \item + $p$ и $q$ должны быть сильно простыми числами, т. е. следующее + число имеет большой простой делитель и предыдущее число тоже имеет + такой большой простой делитель $s$, что $s - 1$ также обладает + достаточно большим простым делителем. +\end{enumerate} + +\section{Электронная цифровая подпись} +Цифровая подпись является некоторым числом, которое зависит от исходного +сообщения и некоторого закрытого ключа. С помощью цифровой подписи можно +решить три важных задачи при обмене сообщениями: +\begin{itemize} + \item аутентификация источника сообщения; + \item установление целостности сообщения; + \item обеспечение невозможности отказа от факта подписи конкретного сообщения. +\end{itemize} + +Надёжность схемы цифровой подписи определяется сложностью выполнения следующих +задач: +\begin{itemize} + \item + Подделка подписи (нахождение значения подписи под заданным + сообщением лицом, не являющимся владельцем секретного ключа); + \item + Создание подписанного сообщения (нахождения хотя бы одного сообщения + с правильным значением подписи); + \item Подмена сообщения (подбор двух различных сообщений с одинаковой подписью). +\end{itemize} + +Для создания цифровой подписи можно использовать алгоритмы шифрования с открытым +ключом, так как они обеспечивают невозможность подделки сообщения. Предположим, +что имеется некоторая пара преобразований $(E_k, D_k)$, где $E_k$ +зависит от открытого ключа $k_o$, а $D_k$ --- от закрытого $k_p$. Цифровую +подпись $S$ сообщения $M$ можно вычислить с помощью преобразования $D_k(M) = S$. +Таким образом, полученную подпись любой другой пользователь сможет проверить +с помощью известного ему преобразования $E_k(S) = M$ и получить исходное +сообщение. + +Проблема такого подхода заключается в том, что для такой системы подписи не +выполняется требование невозможности создания подписанного сообщения, +так как для любого $S_1$ любой пользователь может вычислить $M_1 = E_k(S_1)$ +и получить подписанное сообщение. + +Для решения этой проблемы зачастую в систему подписи также включается некоторая +хэш-функция $h$, которая перед подписью применяется к сообщению. +Но так как по хэшу сообщения невозможно восстановить само сообщение, подпись +должна отправляться вместе с сообщением. Создание подписи по такой схеме +удовлетворяет всем трём требованиям для надёжности цифровой подписи. +\cite{alferov} + +\subsection{Правовая сторона применения ЭЦП в России} +В российском Федеральном Законе \textnumero 63 электронные цифровые подписи +подразделяются на три вида: +\begin{enumerate} + \item + Простая электронная подпись --- подпись, которая с помощью определённых + криптографических протоколов позволяет подтвердить факт формирования + подписи определённым лицом; + \item + Неквалифицированная электронная подпись --- подпись, которая получена + в результате криптографического преобразования информации с + использованием ключа электронной подписи, позволяет определить лицо, + подписавшее электронный документ, позволяет обнаружить факт внесения + изменений в документ после его подписи; + \item + Квалифицированная электронная подпись --- подпись, которая соответствует + всем техническим признакам неквалифицированной электронной подписи, но + при этом также имеет ключ проверки электронной подписи в + квалифицированном сертификате, а также создана при помощи средств + электронной подписи, получивших подтверждение соответствия требованиям, + установленных в \textnumero 63-ФЗ. +\end{enumerate} + +Электронные документы считаются равнозначными документам на бумажном носителе, +подписанном собственноручной подписью, если они подписаны квалифицированной +электронной подписью и соответствуют остальным требованиям \textnumero 63-ФЗ. + +Таким образом, электронные цифровые подписи, применяемые в разнообразных +веб-приложениях для защиты от компрометации канала связи обычно не имеют +правовой силы на территории Российской Федерации. + + +\section{Разработка системы с применением ЭЦП} +В качестве системы, в которой необходимо применение электронной цифровой подписи +мною была выбрана система мгновенного обмена сообщениями (чат). Для разработки +данной системы я выбрал язык программирования Go, в стандартной библиотеке +которого присутствуют все криптографические функции, необходимые для реализации +данной системы. Для упрощения работы с чатом также были использованы две +сторонние библиотеки: +\begin{itemize} + \item + \textbf{fyne.io}, для создания пользовательского интерфейса клиентской + части системы; + \item Реализация драйвера базы данных \textbf{sqlite3} для языка Go. +\end{itemize} + +\subsection{Используемый алгоритм цифровой подписи} +В качестве алгоритма шифрования с открытым ключом используется RSA, в качестве +хэш-функции $h$ --- SHA-256, а также в процессе подписи к сообщению применяется +алгоритм Base64. + +Алгоритм подписи: +\begin{enumerate} + \item Генерируются открытый и закрытый ключи шифрования RSA; + \item Сообщение $M$ преобразуется с помощью алгоритма Base64 в $B_M$; + \item Вычисляется хэш $H_M = h(B_M)$; + \item Хэш зашифровывется с помощью ключа $k_o$: $C_M = E_k(H_M)$; + \item + Полученный шифротекст $C_M$ преобразуется в подпись $S_M$ с помощью + алгоритма Base64. +\end{enumerate} + +Для отправки сообщения $M$ на сервер к нему дополнительно приставляется +его подпись. Данные, отправляемые на сервер состоят из трёх частей, +конкатенируемых перед отправкой: +\begin{itemize} + \item Преобразованное с помощью алгоритма Base64 сообщение $M$; + \item Знак точки; + \item Цифровая подпись $S_M$. +\end{itemize} + +При получении сообщения от клиента, сервер проверяет его подпись. Алгоритм +проверки подписи: +\begin{enumerate} + \item Полученное сообщение разделяется на $B_M$ и $S_M$; + \item $S_M$ декодируются с помощью алгоритма Base64 в шифротекст $C_M$; + \item Вычисляется хэш $H_M = h(B_M)$; + \item Шифротекст $C_M$ расшифровывается с помощью ключа $h_p$ в сообщение $H_S$; + \item Подпись считается валидной в случае, если $H_S = H_M$. +\end{enumerate} + +\subsection{Реализация сервера приложения} +Сервер приложения принимает сетевые запросы по прикладному протоколу $HTTP$. +В сервере реализованы следующие точки входа: +\begin{itemize} + \item + \texttt{/api/register}: с помощью данной точки пользователь может внести + свой ключ проверки подписи в систему; + \item + \texttt{/api/sendMessage}: все сообщения, которые сервер должен сохранить + в своей базе данных и передать другим пользователям системы отправляются + на эту точку входа; + \item + \texttt{/api/pollMessages}: с помощью данной точки входа пользователь + способен запросить все сообщения, которые пришли на сервер после + некоторого момента времени (который пользователь указывает в запросе); + \item + \texttt{/api/getUserKey}: для проверки подписи пришедшего сообщения + на стороне клиента, пользователь может запросить ключ другого + пользователя, сохранённый на сервере; + \item + \texttt{/api/tryAuth}: данная точка входа не выполняет никаких действий, + и реализована для удобства проверки возможности аутентификации + пользователя на сервере (при удачной аутентификации данная точка + вернёт ответ со статусом HTTP 200, иначе, при провале аутентификации по + каким-либо причинам, статус будет не равен 200 и клиент может вывести + предупреждение пользователю). +\end{itemize} + +\subsection{Работа с клиентом приложения} +Для начала обмена сообщения с другими ползователями, подключенными к системе +необходимо в неё войти, либо зарегистрироваться. Вход возможен только при +наличии сгенерированного ключа для подписи, поэтому при первом запуске +следует нажать на кнопку <<Зарегистрироваться>> (рис. \ref{fig:start}). +\begin{figure}[H] + \centering + \includegraphics[width=0.7\textwidth]{screenshots/start.png} + \caption{Экран при запуске приложения} + \label{fig:start} +\end{figure} + +При регистрации (и входе) необходимо ввести URL сервера, к которому должен +присоединиться клиент и своё имя (рис. \ref{fig:register}). После этого +необходимо нажать на кнопку <<Сгенерировать ключи подписи>>. +\begin{figure}[H] + \centering + \includegraphics[width=0.7\textwidth]{screenshots/register.png} + \caption{Окно регистрации} + \label{fig:register} +\end{figure} + +Далее можно сохранить ключ в любом удобном месте с любым именем (рис. \ref{fig:key}). +\begin{figure}[H] + \centering + \includegraphics[width=0.7\textwidth]{screenshots/key.png} + \caption{Выбор места для сохранения ключа} + \label{fig:key} +\end{figure} + +После выбора места сохранения ключа необходимо нажать на кнопку +<<Зарегистрироваться>>, после чего клиент проверит возможность совершить +это действие с указанными данными. Если клиент не может соединиться с сервером, +либо на сервере уже зарегистрирован пользователь с таким именем, то клиент +выведет окно с ошибкой (рис. \ref{fig:error}). +\begin{figure}[H] + \centering + \includegraphics[width=0.7\textwidth]{screenshots/error.png} + \caption{Ошибка при регистрации} + \label{fig:error} +\end{figure} + +Если клиенту удалось соединиться с сервером и успешно пройти все проверки, то +для пользователя откроется окно чата, в котором можно написать своё сообщение +в поле снизу. Для отправки сообщения необходимо нажать на кнопку <<Отправить>> +(рис. \ref{fig:input}). +\begin{figure}[H] + \centering + \includegraphics[width=0.7\textwidth]{screenshots/input.png} + \caption{Ввод сообщения} + \label{fig:input} +\end{figure} + +Все сообщения, которые клиент смог получить от сервера отображаются в этом +окне чата (рис. \ref{fig:chat}). +\begin{figure}[H] + \centering + \includegraphics[width=0.7\textwidth]{screenshots/chat.png} + \caption{Окно чата с сообщением} + \label{fig:chat} +\end{figure} + + +\conclusion +Для реализации систем электронных цифровых подписей обычно используются +наиболее проверенные криптографически стойкие алгоритмы, которые способны +обеспечить защищённость от компрометации канала связи между пользователями. + +Благодаря таким алгоритмам имеется возможность установления безопасного +канала связи даже через Интернет, между людьми, которым сложно физически +обменяться ключами для проверки подписей. + +Но с увеличением мощности вычислительных компьютерных систем и разработкой +квантовых компьютеров некоторые криптографические протоколы находятся +под угрозой потери надёжности и безопасности. Поэтому можно ожидать появления +новых алгоритмов шифрования, хэширования и электронной цифровой подписи, +учитывающих новые разработки в сфере квантовых вычислений. + + +\printbibliography + +\end{document} diff --git a/report/images/screenshots/chat.png b/report/images/screenshots/chat.png new file mode 100644 index 0000000..64c1c44 Binary files /dev/null and b/report/images/screenshots/chat.png differ diff --git a/report/images/screenshots/error.png b/report/images/screenshots/error.png new file mode 100644 index 0000000..15cc0ef Binary files /dev/null and b/report/images/screenshots/error.png differ diff --git a/report/images/screenshots/input.png b/report/images/screenshots/input.png new file mode 100644 index 0000000..894c651 Binary files /dev/null and b/report/images/screenshots/input.png differ diff --git a/report/images/screenshots/key.png b/report/images/screenshots/key.png new file mode 100644 index 0000000..edef017 Binary files /dev/null and b/report/images/screenshots/key.png differ diff --git a/report/images/screenshots/register.png b/report/images/screenshots/register.png new file mode 100644 index 0000000..b13bed6 Binary files /dev/null and b/report/images/screenshots/register.png differ diff --git a/report/images/screenshots/start.png b/report/images/screenshots/start.png new file mode 100644 index 0000000..4c2ea10 Binary files /dev/null and b/report/images/screenshots/start.png differ diff --git a/report/merge.sh b/report/merge.sh new file mode 100755 index 0000000..bc4df1c --- /dev/null +++ b/report/merge.sh @@ -0,0 +1,5 @@ +#!/bin/sh + +pdftk coursework.pdf cat 2-end output tmp.pdf +pdftk title.pdf tmp.pdf cat output course.pdf +rm tmp.pdf diff --git a/report/preamble.sty b/report/preamble.sty new file mode 100644 index 0000000..fdd4cb1 --- /dev/null +++ b/report/preamble.sty @@ -0,0 +1,50 @@ +\usepackage{subfigure} +\usepackage{tikz,pgfplots} +\pgfplotsset{compat=1.5} +\usepackage{float} +\setcounter{secnumdepth}{4} +\titleformat{\paragraph}[block] +{\hspace{1.25cm}\normalfont} +{\theparagraph}{1ex}{} +\titlespacing{\paragraph} +{0cm}{2ex plus 1ex minus .2ex}{.4ex plus.2ex} + +% --------------------------------------------------------------------------% + + +\usepackage[T2A]{fontenc} +\usepackage[utf8]{inputenc} +\usepackage{graphicx} +\graphicspath{ {./images/} } +\usepackage{tempora} +\usepackage{minted} + +% \usepackage[sort,compress]{cite} +\usepackage{amsmath} +\usepackage{amssymb} +\usepackage{amsthm} +\usepackage{fancyvrb} +\usepackage{listings} +\usepackage{listingsutf8} +\usepackage{longtable} +\usepackage{array} +\usepackage[english,russian]{babel} +% \usepackage[colorlinks=false]{hyperref} +\usepackage{url} + +\usepackage[parentracker=true, + backend=biber, + hyperref=false, + language=russian, + autolang=other, + citestyle=gost-numeric, + defernumbers=true, + bibstyle=gost-numeric, +]{biblatex} +\addbibresource{sources.bib} +\usepackage{csquotes} + + +\newcommand{\eqdef}{\stackrel {\rm def}{=}} +\renewcommand\theFancyVerbLine{\small\arabic{FancyVerbLine}} +\newtheorem{lem}{Лемма} \ No newline at end of file diff --git a/report/sources.bib b/report/sources.bib new file mode 100644 index 0000000..839fa27 --- /dev/null +++ b/report/sources.bib @@ -0,0 +1,29 @@ +@book{scheiner-applied, + author = {Bruce Schneier}, + title = {Applied Cryptography, Second Edition}, + publisher = {John Wiley \& Sons}, + year = {1996}, + isbn = {0-471-11709-9}, + language = {english}, + langid = {english}, +} + +@book{encyclopedia, + author = {Henk C.A.v. Tilborg}, + title = {Encyclopedia of Cryptography and Security}, + publisher = {Springer-Verlag New York}, + year = {2005}, + isbn = {978-0-387-23473-1}, + language = {english}, + langid = {english}, +} + +@book{alferov, + author = {А. П. Алферов}, + title = {Основы криптографии, 2-е издание}, + publisher = {Гелиос АРВ}, + year = {2002}, + isbn = {5-85438-025-0}, + language = {russian}, + langid = {russian}, +} \ No newline at end of file diff --git a/report/title.pdf b/report/title.pdf new file mode 100644 index 0000000..801f0df Binary files /dev/null and b/report/title.pdf differ diff --git a/report/titlepage.tex b/report/titlepage.tex new file mode 100644 index 0000000..69d896e --- /dev/null +++ b/report/titlepage.tex @@ -0,0 +1,53 @@ +\selectlanguage{russian} +\chair{теоретических основ компьютерной безопасности и криптографии} +\title{Электронная цифровая подпись} +\course{2} +\group{231} +\department{факультета КНиИТ} +\napravlenie{10.05.01 "--- Компьютерная безопасность} + +% Для студентки. Для работы студента следующая команда не нужна. +% \studenttitle{Студентки} + +% Фамилия, имя, отчество в родительном падеже +\author{Гущина Андрея Юрьевича} + +% Заведующий кафедрой +\chtitle{д.ф.-м.н.} % степень, звание +\chname{М. Б. Абросимов} + +%Научный руководитель (для реферата преподаватель проверяющий работу) +\satitle{д.ф.-м.н.} %должность, степень, звание +\saname{М. Б. Абросимов} + +% Руководитель практики от организации (только для практики, +% для остальных типов работ не используется) +% \patitle{к.ф.-м.н.} +% \paname{С.~В.~Миронов} + +% Семестр (только для практики, для остальных +% типов работ не используется) +%\term{8} + +% Наименование практики (только для практики, для остальных +% типов работ не используется) +%\practtype{преддипломная} + +% Продолжительность практики (количество недель) (только для практики, +% для остальных типов работ не используется) +%\duration{4} + +% Даты начала и окончания практики (только для практики, для остальных +% типов работ не используется) +%\practStart{30.04.2019} +%\practFinish{27.05.2019} + +% Год выполнения отчета +\date{2021} + +\maketitle + +% Включение нумерации рисунков, формул и таблиц по разделам +% (по умолчанию - нумерация сквозная) +% (допускается оба вида нумерации) +% \secNumbering \ No newline at end of file -- cgit v1.2.3