source: comparacioncriptosistemas/interfaz/criptosistemas.cpp

interfaz
Last change on this file was 39ca4d5, checked in by lhernandez <lhernandez@…>, 8 years ago

Empaquetado de la primera version de la interfaz de criptosistema, preparado para estudiar criptosistemas TesT Variaties, para luego ser implemetado en la herramienta grafica

  • Property mode set to 100644
File size: 18.2 KB
Line 
1/*!
2    Interfaz de criptosistema Desarrollada en Qt
3    @author Ing. Leonel P. Hernandez M (lhernandez at cenditel.gob.ve)
4    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
5    @date 30/06/2016
6    @version 1.0.0
7*/
8#include "criptosistemas.h"
9#include "ui_criptosistemas.h"
10#include <QMessageBox>
11#include<QProgressDialog>
12
13#include <QTime>
14#include <QHash>
15#include <QCryptographicHash>
16#include <QFile>
17#include <QFileDialog>
18#include <QTextStream>
19#include <QDateTime>
20#include <QDebug>
21#include <iostream>
22#include <ctime>
23#include "polynomial.h"
24#include "executionresult.h"
25#include <crypto++/rsa.h>
26#include <crypto++/osrng.h>
27#include <crypto++/base64.h>
28#include <crypto++/files.h>
29#include <crypto++/salsa.h>
30
31const int iterations = 20;
32
33using namespace std;
34using namespace pol;
35using namespace CryptoPP;
36QString dir;
37
38CriptoSistemas::CriptoSistemas(QWidget *parent) :
39    QMainWindow(parent),
40    ui(new Ui::CriptoSistemas)
41{
42    ui->setupUi(this);
43    QFile ruta_priv;
44    QFile ruta_publ;
45    if ( ruta_priv.exists("/usr/share/criptosistema/keys/privkey.txt") && ruta_publ.exists("/usr/share/criptosistema/keys/pubkey.txt"))
46    {
47        ui->generarLlaves->setEnabled(false);
48        ui->cifrar->setEnabled(true);
49        ui->decifrar->setEnabled(true);
50        connect(ui->cifrar,SIGNAL(clicked()),this,SLOT(CifrarArchivo()));
51        connect(ui->decifrar, SIGNAL(clicked()), this, SLOT(DescifrarArchivo()));
52        connect(ui->ayuda,SIGNAL(clicked()),this,SLOT(Ayuda()));
53        ui->progressBar->setVisible(false);
54    }
55    else
56    {
57        connect(ui->generarLlaves,SIGNAL(clicked()),this,SLOT(OpcionLlaves()));
58        connect(ui->ayuda,SIGNAL(clicked()),this,SLOT(Ayuda()));
59        ui->progressBar->setVisible(false);
60    }
61}
62
63
64CriptoSistemas::~CriptoSistemas()
65{
66    delete ui;
67}
68
69
70/*!
71    Funcion que despliega una pregunta para crear las llaves (privada y publica)
72    @author Ing. Leonel P. Hernandez M (lhernandez at cenditel.gob.ve)
73    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
74    @date 30/06/2016
75    @version 1.0.0
76*/
77void CriptoSistemas::OpcionLlaves()
78{
79    QPushButton *pushSi = new QPushButton("&Si", this);
80    QPushButton *pushNo = new QPushButton("&No", this);
81
82    QString generar_llaves = "<html><head/><body><p ><img src=':/static/cenditel.png' width='110' height='80' style='float: left;'/></p><p align='center'><span style= 'font-size:16pt; font-weight:600; font-style:italic; color:#ff0000;'>Generar Llaves</span></p></body></html>";
83    ui->titulo->setText(generar_llaves);
84    QString pregunta = "<html><head/><body><p align='center'><span style= 'font-size:16pt; color:#2589eb;'>¿Deseas Generar las llave privada y publica?</span></p><p align='center'><img src=':/static/llaves.png'/></p></body></html>";
85    ui->imgCentral->setText(pregunta);
86    pushSi->setGeometry(QRect(233, 394, 80, 31));
87    pushNo->setGeometry(QRect(518, 394, 80, 31));
88    ui->centralPage->addWidget(ui->imgCentral, 0,2);
89    ui->centralPage->addWidget(pushSi, 1,1);
90    ui->centralPage->addWidget(pushNo, 1,3);
91    connect(pushSi,SIGNAL(clicked()),this,SLOT(GenerarLlaves()));
92    connect(pushNo,SIGNAL(clicked()),this,SLOT(Inicio()));
93    connect(ui->cifrar,SIGNAL(clicked()),this,SLOT(CifrarArchivo()));
94    connect(ui->decifrar, SIGNAL(clicked()), this, SLOT(DescifrarArchivo()));
95    pushSi->setObjectName("si");
96    pushNo->setObjectName("no");
97}
98
99
100void CriptoSistemas::Inicio()
101{
102
103}
104
105
106/*!
107    Funcion que permite generar las llaves(privada y publica)
108    @author Ing. Leonel P. Hernandez M (lhernandez at cenditel.gob.ve)
109    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
110    @date 30/06/2016
111    @version 1.0.0
112*/
113void CriptoSistemas::GenerarLlaves()
114{
115    QFile ruta_priv;
116    QFile ruta_publ;
117    QPushButton *pushSi = findChild<QPushButton*>("si");
118    pushSi->setVisible(false);
119    QPushButton *pushNo = findChild<QPushButton*>("no");
120    pushNo->setVisible(false);
121    QPushButton *pushCifrar = new QPushButton("&Cifrar", this);
122    QPushButton *pushDescifrar = new QPushButton("&Descifrar", this);
123    pushCifrar->setObjectName("cifra");
124    pushDescifrar->setObjectName("descifrar");
125    QString exito = "<html><head/><body><p align='center'><span style= 'font-size:16pt; color:#2589eb;'>Éxito al generar las claves, ahora puedes cifrar o descifrar un archivo</span></p><p align='center'><img src=':/static/llaves.png'/></p></body></html>";
126    if ( ruta_priv.exists("/usr/share/criptosistema/keys/privkey.txt") && ruta_publ.exists("/usr/share/criptosistema/keys/pubkey.txt"))
127    {
128
129        QMessageBox::information(this,"Informacion","Las llaves existen, las puedes usar para cifrar o descifrar un archivo!!!");
130        ui->generarLlaves->setEnabled(false);
131        ui->cifrar->setEnabled(true);
132        ui->decifrar->setEnabled(true);
133        ui->imgCentral->setText(exito);
134        ui->centralPage->addWidget(ui->imgCentral, 0,2);
135        ui->centralPage->addWidget(pushCifrar, 1,1);
136        ui->centralPage->addWidget(pushDescifrar, 1,3);
137    }
138    else
139    {
140        QMessageBox::information(this,"Alerta","Generando la clave......!!!");
141        pol_t kx = get_rand_pol(KEY_DEG, false);
142        pol_t ky = get_rand_pol(KEY_DEG, false);
143        pol3v_t D = get_open_key(kx, ky);
144        AutoSeededRandomPool rng;
145        InvertibleRSAFunction privkey;
146        privkey.GenerateRandomWithKeySize(rng, 3072);
147        Base64Encoder privkeysink(new FileSink("/usr/share/criptosistema/keys/privkey.txt"));
148        privkey.DEREncode(privkeysink);
149        privkeysink.MessageEnd();
150        RSAFunction pubkey(privkey);
151        Base64Encoder pubkeysink(new FileSink("/usr/share/criptosistema/keys/pubkey.txt"));
152        pubkey.DEREncode(pubkeysink);
153        pubkeysink.MessageEnd();
154        ui->generarLlaves->setEnabled(false);
155        ui->cifrar->setEnabled(true);
156        ui->decifrar->setEnabled(true);
157        QMessageBox::information(this,"Exito","Las llaves se crearon, las puedes usar para cifrar o descifrar un archivo!!!");
158        ui->imgCentral->setText(exito);
159        ui->centralPage->addWidget(ui->imgCentral, 0,2);
160        ui->centralPage->addWidget(pushCifrar, 1,1);
161        ui->centralPage->addWidget(pushDescifrar, 1,3);
162    }
163    connect(pushCifrar,SIGNAL(clicked()),this,SLOT(CifrarArchivo()));
164    connect(pushDescifrar,SIGNAL(clicked()),this,SLOT(DescifrarArchivo()));
165}
166
167
168/*!
169    Funcion que muestra la carga del archivo que desea cifrar
170    @author Ing. Leonel P. Hernandez M (lhernandez at cenditel.gob.ve)
171    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
172    @date 15/08/2016
173    @version 1.0.0
174*/
175void CriptoSistemas::CifrarArchivo()
176{
177    QPushButton *pushSeleccionar = new QPushButton("&Seleccionar Archivo ...", this);
178    QPushButton *pushDescargar = new QPushButton("&Descargar en ...", this);
179    QString cifrando = "<html><head/><body><p ><img src=':/static/cenditel.png' width='110' height='80' style='float: left;'/></p><p align='center'><span style= 'font-size:16pt; font-weight:600; font-style:italic; color:#ff0000;'>Cifrar Archivo</span></p></body></html>";
180    ui->titulo->setText(cifrando);
181    QString img = "<html><head/><body><p align='center'><p align='center'><img src=':/static/cifrar.png'/></p></body></html>";
182    ui->imgCentral->setText(img);
183    QPushButton *pushcifrar = findChild<QPushButton*>("cifra");
184    QPushButton *pushDescifrar = findChild<QPushButton*>("descifrar");
185    if(pushcifrar && pushDescifrar){
186        pushcifrar->setVisible(false);
187        pushDescifrar->setVisible(false);
188    }
189    ui->centralPage->addWidget(ui->imgCentral, 0,2);
190    ui->centralPage->addWidget(pushSeleccionar, 0,1);
191    ui->centralPage->addWidget(pushDescargar, 2,2);
192    pushDescargar->setObjectName("pushDescargar");
193    pushSeleccionar->setObjectName("pushSeleccionar1");
194
195    connect(pushSeleccionar, &QPushButton::clicked,[=] {
196        emit OpenFolderForCrifrar();
197    });
198    connect(pushDescargar, SIGNAL(clicked()), this, SLOT(SaveFile()));
199
200}
201
202
203/*!
204    Funcion permite montar un archivo para cifrar
205    @author Ing. Leonel P. Hernandez M (lhernandez at cenditel.gob.ve)
206    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
207    @date 26/09/2016
208    @version 1.0.0
209*/
210void CriptoSistemas::OpenFolderForCrifrar()
211{
212    dir = QFileDialog::getOpenFileName(this,tr("Selleccione Archivo"),"/home",tr("Archivos (*.txt);;Todos los Archivos(*.*)"));
213    string ruta = dir.toStdString();
214    QFile archivo(ruta.c_str());
215    int size = archivo.size();
216    if (size > 256)
217    {
218        QString style = "QLabel{ background-color: #FCDFDF; font-size: 13px; font-style: italic; margin-left: 10px; }";
219        this->ui->flujo_mensajes->setText("El archivo que desea Cifrar debe tener un tamaño maximo de 256 Bytes, vuelve a seleccionar un archivo.");
220        ui->flujo_mensajes->setStyleSheet(style);
221        dir = "";
222    }
223}
224
225
226/*!
227    Funcion que permite guardar en una ruta dada el txt cifrado
228    @author Ing. Leonel P. Hernandez M (lhernandez at cenditel.gob.ve)
229    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
230    @date 26/09/2016
231    @version 1.0.0
232*/
233void CriptoSistemas::SaveFile()
234{
235    string ruta = dir.toStdString();
236    QFile archivo(ruta.c_str());
237    int size = archivo.size();
238    if (dir.size() > 0 && size <= 256)
239    {
240        QString dir_save = QFileDialog::getSaveFileName(0,"Save file",QDir::currentPath(),
241                "Text files (*.txt)",
242                 new QString("Text files (*.txt)"));
243
244
245        if (size <= 256)
246        {
247            string plain;
248            string save = dir_save.toStdString();
249            FileSource texto_plano(ruta.c_str(), true, new StringSink(plain));
250            FileSource file("/usr/share/criptosistema/keys/pubkey.txt", true, new Base64Decoder);
251            // Cifrado
252            RSAES_OAEP_SHA_Encryptor pubkey(file);
253            AutoSeededRandomPool rng;
254            StringSource ss1( plain, true,
255                new PK_EncryptorFilter( rng, pubkey,
256                    new FileSink( save.c_str() )
257                ) // PK_EncryptorFilter
258             ); // StringSource
259            QString style = "QLabel{ background-color: #5CB85C; font-size: 13px; font-style: italic; margin-left: 10px; }";
260            this->ui->flujo_mensajes->setText("El archivo se Cifro con exito, se encuentra en la ruta " + dir_save);
261            ui->flujo_mensajes->setStyleSheet(style);
262            dir = "";
263        }
264        else
265        {
266            QString style = "QLabel{ background-color: #FCDFDF; font-size: 13px; font-style: italic; margin-left: 10px; }";
267            this->ui->flujo_mensajes->setText("El archivo que desea Cifrar debe tener un tamaño maximo de 256 Bytes, vuelve a seleccionar un archivo.");
268            ui->flujo_mensajes->setStyleSheet(style);
269            dir = "";
270        }
271    }
272    else
273    {
274        QString style = "QLabel{ background-color: #FCDFDF; font-size: 13px; font-style: italic; margin-left: 10px; }";
275        this->ui->flujo_mensajes->setText("Error, Debes seleccionar un archivo para cifrar");
276        ui->flujo_mensajes->setStyleSheet(style);
277    }
278}
279
280
281/*!
282    Funcion que muestra el formulario para la carga del archivo que desea Decifrar
283    @author Ing. Leonel P. Hernandez M (lhernandez at cenditel.gob.ve)
284    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
285    @date 26/09/2016
286    @version 1.0.0
287*/
288void CriptoSistemas::DescifrarArchivo()
289{
290    QPushButton *pushSeleccionar = new QPushButton("&Seleccionar Archivo ...", this);
291    QPushButton *pushDescargar = new QPushButton("&Descifrar en ...", this);
292    QString cifrando = "<html><head/><body><p><img src=':/static/cenditel.png' width='110' height='80' style='float: left;'/></p><p align='center'><span style= 'font-size:16pt; font-weight:600; font-style:italic; color:#ff0000;'>Decifrar Archivo</span></p></body></html>";
293    ui->titulo->setText(cifrando);
294    QString img = "<html><head/><body><p align='center'><p align='center'><img src=':/static/descifrar.png'/></p></body></html>";
295    ui->imgCentral->setText(img);
296    QPushButton *pushcifrar = findChild<QPushButton*>("cifra");
297    QPushButton *pushDescifrar = findChild<QPushButton*>("descifrar");
298    if(pushcifrar && pushDescifrar){
299        pushcifrar->setVisible(false);
300        pushDescifrar->setVisible(false);
301    }
302    ui->centralPage->addWidget(ui->imgCentral, 0,2);
303    ui->centralPage->addWidget(pushSeleccionar, 0,1);
304    ui->centralPage->addWidget(pushDescargar, 2,2);
305    pushDescargar->setObjectName("pushDescargarEn");
306    pushSeleccionar->setObjectName("pushSeleccionar");
307    connect(pushSeleccionar, SIGNAL(clicked()), this, SLOT(OpenFolderForDescifrar()));
308    connect(pushDescargar, SIGNAL(clicked()), this, SLOT(SaveFileForDescifrado()));
309}
310
311
312/*!
313    Funcion permite montar un archivo el cual sera Decifrado
314    @author Ing. Leonel P. Hernandez M (lhernandez at cenditel.gob.ve)
315    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
316    @date 26/09/2016
317    @version 1.0.0
318*/
319void CriptoSistemas::OpenFolderForDescifrar()
320{
321    dir = QFileDialog::getOpenFileName(this,tr("Selleccione Archivo"),"/home",tr("Archivos (*.txt);;Todos los Archivos(*.*)"));
322    QPushButton *pushDescarga = findChild<QPushButton*>("pushDescargar");
323    if (pushDescarga)
324    {
325        pushDescarga->setVisible(false);
326    }
327}
328
329
330/*!
331    Funcion que permite guardar en una ruta dada el txt Decifrado
332    @author Ing. Leonel P. Hernandez M (lhernandez at cenditel.gob.ve)
333    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
334    @date 26/09/2016
335    @version 1.0.0
336*/
337void CriptoSistemas::SaveFileForDescifrado()
338{
339    if (dir.size() > 0 )
340    {
341        QString dir_save = QFileDialog::getSaveFileName(0,"Save file",QDir::currentPath(),
342                "Text files (*.txt)",
343                    new QString("Text files (*.txt)"));
344        // Descifrado
345        AutoSeededRandomPool rng;
346        string str;
347        string ruta = dir.toStdString();
348        string save = dir_save.toStdString();
349        FileSource file("/usr/share/criptosistema/keys/privkey.txt", true, new Base64Decoder);
350        FileSource cifrado(ruta.c_str(), true, new StringSink(str));
351        RSAES_OAEP_SHA_Decryptor d(file);
352
353        StringSource ss2(str, true,
354            new PK_DecryptorFilter(rng, d,
355                new FileSink( save.c_str() )
356           ) // PK_DecryptorFilter
357        ); // StringSource
358        QString style = "QLabel{ background-color: #5CB85C; font-size: 13px; font-style: italic; margin-left: 10px; }";
359        this->ui->flujo_mensajes->setText("El archivo se DesCifro con exito, el archivo se encuentra en la siguiente ruta: " + dir_save);
360        ui->flujo_mensajes->setStyleSheet(style);
361        dir = "";
362    }
363    else
364    {
365        QString style = "QLabel{ background-color: #FCDFDF; font-size: 13px; font-style: italic; margin-left: 10px; }";
366        this->ui->flujo_mensajes->setText("Debes seleccionar un archivo para Decifrar");
367        ui->flujo_mensajes->setStyleSheet(style);
368    }
369}
370
371
372/*!
373    Funcion para mostrar la Ayuda del sistema
374    @author Ing. Leonel P. Hernandez M (lhernandez at cenditel.gob.ve)
375    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
376    @date 26/09/2016
377    @version 1.0.0
378*/
379void CriptoSistemas::Ayuda()
380{
381    QPushButton *pushSeleccionar = findChild<QPushButton*>("pushSeleccionar");
382    QPushButton *pushSelecciona = findChild<QPushButton*>("pushSeleccionar1");
383    QPushButton *pushDescargar = findChild<QPushButton*>("pushDescargarEn");
384    QPushButton *pushDescarga = findChild<QPushButton*>("pushDescargar");
385    QPushButton *pushSi = findChild<QPushButton*>("si");
386    QPushButton *pushNo = findChild<QPushButton*>("no");
387    QPushButton *pushcifrar = findChild<QPushButton*>("cifra");
388    QPushButton *pushDescifrar = findChild<QPushButton*>("descifrar");
389    if(pushcifrar && pushDescifrar){
390        delete pushcifrar;
391        delete pushDescifrar;
392    }
393    if (pushSi)
394    {
395        delete pushSi;
396    }
397    if (pushNo)
398    {
399        delete pushNo;
400    }
401    if (pushDescargar)
402    {
403        delete pushDescargar;
404    }
405    if (pushDescarga)
406    {
407        delete pushDescarga;
408    }
409    if (pushSeleccionar)
410    {
411        delete pushSeleccionar;
412    }
413    if (pushSelecciona)
414    {
415        delete pushSelecciona;
416    }
417    QString bienvenida = "<html><head/><body><p><img src=':/static/cenditel.png' width='110' height='80' style='float: left;'/></p><p align='center'><span style= 'font-size:16pt; font-weight:600; font-style:italic; color:#ff0000;'>Bienvenido</span></p></body></html>";
418    ui->titulo->setText(bienvenida);
419    QString ayuda = "<html><head/><body><p align='justify'><p align='justify'>Una de las herramientas principales para proveer seguridad a la información cuando</p><p align='justify'>se transmite por un canal abierto es la criptografía. La criptografía es una rama</p><p align='justify'>de la matemática que permite transformar la información de manera que su lectura</p><p align='justify'>sea muy difícil si no se posee una clave criptográfica. Es de particular interés,</p><p align='justify'>entonces, para este Centro de Desarrollo e Investigación en Tecnologías Libres-</p><p align='justify'>CENDITEL, dedica parte de su potencial investigativo a estudiar los diferentes </p><p align='justify'>sistemas criptográficos (criptosistemas) existentes, proponer mejoras a los mismos </p><p align='justify'>o incluso, desarrollar soberanamente propuestas alternativas a los ya conocidos.</p><p align='justify'>Es por ello que desde CENDITEL nos hemos propuesto el estudio de un </p><p align='justify'>criptosistema novedoso que puede dar seguridad incluso en un computador cuántico, </p><p align='justify'>si llegare a ser construido. Este estudio se llama Criptosistema de variedad </p><p align='justify'>algebraica, su seguridad se basa en un problema matemático del área de geometría</p><p align='justify'>permitiría ser seguro en el mencionado computador cuántico además de poder ser </p><p align='justify'>utilizado en un computador clásico .</p></p></body></html>";
420    ui->imgCentral->setText(ayuda);
421    ui->centralPage->addWidget(ui->imgCentral, 0,1);
422
423}
Note: See TracBrowser for help on using the repository browser.