Como a equipe it-animals venceu as finais do Digital Breakthrough

Este artigo foi escrito em coautoria com o líder da equipe de @Restlin





Seleção de casos e nossa visão de sua solução

Inicialmente, a escolha recaiu sobre o caso do Ministério da Administração Interna: Desenvolvimento de uma solução de software autônomo para análise linguística e transformação da face narrativa no texto.





Formulação de caso:





Levando em consideração as especificidades das atividades de determinados serviços do Ministério de Assuntos Internos da Rússia, ao preparar documentos, é necessário transformar o rosto da narração da primeira pessoa para a terceira, levando em consideração o gênero, no texto. Por exemplo, a frase no texto original “Eu vi que Ivanov foi até mim” no texto final deve ser transformada em “Ele viu que Ivanov foi até ele”. A solução de software desenvolvida realizará automaticamente o processo de conversão da face da história, o que permitirá que os funcionários dediquem mais tempo a outros aspectos do seu trabalho. O caso foi preparado pelo Departamento de Tecnologias da Informação, Comunicações e Proteção da Informação do Ministério de Assuntos Internos da Rússia. 





Ele era próximo a nós na especialização e tinha uma ideia clara da beleza de como esse problema poderia ser resolvido.





Foi planejado que criaríamos um serviço web que pode converter automaticamente o depoimento de uma testemunha da primeira pessoa para a terceira.





 Tudo correu bem até o momento em que assistimos ao vídeo com a apresentação da caixa do porta-malas, o que eles esperam na saída: 





  1. solução local que funciona sem acesso à rede; 





  2. pacotes de escritório integrados por meio de macros.





Nossa equipe foi dividida em 2 campos: metade insistiu no cumprimento estrito dos requisitos do titular do caso, caso contrário, o caso deveria ser alterado, o segundo insistiu na solução primária (offtopic: uma decisão semelhante disparou de outros caras e eles ganharam).





, : , .





:





« » , . , , , , . (, ). - , ( Creatio). .





? Open source : OpenSSL. - php tcpdf pdf . pirs.online , .





, .





,  . - , ASP.NET. 





( : ? , . 





?

: , .





: , . - . , , . - .





:





  • : ;





  • ( );





  • ;





  • ;





  • ;





  • ;





  • ;





  • .





3 , PostgreSQL: 





  1. user - ;





  2. message - . ;





  3. file - , .





php- Yii2 . .





OpenSSL, - .





, . - (libengine-gost-openssl 1.1) , -2012. .





: . - , , . ! 





PHP openssl , , , openssl engine .





openssl . , openssl.





:





exec("openssl req -nodes -newkey gost2012_512 -keyout $eSignPath/client.key -pkeyopt paramset:A -out $eSignPath/client.csr -subj \"/C=RU/ST=Udm/L=Izhevsk/O=IT/OU=animals/CN=user-{$user->id}\" -config $caPath/openssl.cnf ");







exec("openssl ca -engine gost -keyfile $caPath/ca.key -cert $caPath/ca.crt -in $eSignPath/client.csr -out $eSignPath/client.crt -batch -config $caPath/openssl.cnf 2>&1", $output);







$eSignPath



- , $caPath



- .





:





exec("openssl ca -config $caPath/openssl.cnf -keyfile $caPath/ca.key -cert $caPath/ca.crt -revoke $eSignPath/client.crt 2>&1", $output);







exec("openssl ca -gencrl -config $caPath/openssl.cnf -keyfile $caPath/ca.key -cert $caPath/ca.crt -out $caPath/crl.pem 2>&1", $output);







$eSignPath



- , $caPath



- .





:





exec("openssl smime -engine gost -sign -in $fp -out $fp.sig -nodetach -binary -signer $clientKeysPath/client.crt -inkey $clientKeysPath/client.key -outform SMIME 2>&1", $output);







$fp



- , $clientKeysPath



- .





:





$output = exec("openssl cms -engine gost -verify -in $sigPath -inform SMIME -CAfile $pathCA/ca.crt -out $fp -certsout $clientKeysPath/client.crt 2>&1");







$fp



- , $clientKeysPath



- , $sigPath



- .





openssl - .   , , . , : - .





: , tcpdf pdf pdf . , pdf .





: . , , , . , .





tcpdf openssl. . openssl (-,  ) api:





$fields = [







'r' => 'api/sign',







'filePath' => $tempdoc,







'userId' => $user->id,







];







$query = http_build_query($fields);







$ch = curl_init();







$host = \Yii::$app->params['apiHost'] ?? '';







curl_setopt($ch, CURLOPT_URL, $host . '/index.php?' . $query);







curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);







$signature = curl_exec($ch);







/*if (empty($this->signature_data['extracerts'])) {







openssl_pkcs7_sign($tempdoc, $tempsign, $this->signature_data['signcert'], array($this->signature_data['privkey'], $this->signature_data['password']), array(), PKCS7_BINARY | PKCS7_DETACHED);







} else {







openssl_pkcs7_sign($tempdoc, $tempsign, $this->signature_data['signcert'], array($this->signature_data['privkey'], $this->signature_data['password']), array(), PKCS7_BINARY | PKCS7_DETACHED, $this->signature_data['extracerts']);







}*/







!





Zoom , , . 





: ,   ( 5 ) . 





Inesperadamente, os resultados tiveram que esperar até a noite, embora os vencedores tenham sido anunciados no Pólo Noroeste, quase uma hora depois da defesa. O tempo se arrastava com a entrega do correio russo.





Offtop: nós somos os vencedores! 750 mil por equipe, Karl! 750 em 2 dias, Karl! E isso significa que estamos indo para a Grandfinal do Digital Breakthrough em Moscou!



Nosso repositório de soluções








All Articles