/*! Interfaz de criptosistema Desarrollada en Qt @author Ing. Leonel P. Hernandez M (lhernandez at cenditel.gob.ve) @copyright GNU Public License versión 2 (GPLv2) @date 30/06/2016 @version 1.0.0 */ #include "criptosistemas.h" #include "ui_criptosistemas.h" #include #include #include #include #include #include #include #include #include #include #include #include #include "polynomial.h" #include "executionresult.h" #include #include #include #include #include const int iterations = 20; using namespace std; using namespace pol; using namespace CryptoPP; QString dir; CriptoSistemas::CriptoSistemas(QWidget *parent) : QMainWindow(parent), ui(new Ui::CriptoSistemas) { ui->setupUi(this); QFile ruta_priv; QFile ruta_publ; if ( ruta_priv.exists("/usr/share/criptosistema/keys/privkey.txt") && ruta_publ.exists("/usr/share/criptosistema/keys/pubkey.txt")) { ui->generarLlaves->setEnabled(false); ui->cifrar->setEnabled(true); ui->decifrar->setEnabled(true); connect(ui->cifrar,SIGNAL(clicked()),this,SLOT(CifrarArchivo())); connect(ui->decifrar, SIGNAL(clicked()), this, SLOT(DescifrarArchivo())); connect(ui->ayuda,SIGNAL(clicked()),this,SLOT(Ayuda())); ui->progressBar->setVisible(false); } else { connect(ui->generarLlaves,SIGNAL(clicked()),this,SLOT(OpcionLlaves())); connect(ui->ayuda,SIGNAL(clicked()),this,SLOT(Ayuda())); ui->progressBar->setVisible(false); } } CriptoSistemas::~CriptoSistemas() { delete ui; } /*! Funcion que despliega una pregunta para crear las llaves (privada y publica) @author Ing. Leonel P. Hernandez M (lhernandez at cenditel.gob.ve) @copyright GNU Public License versión 2 (GPLv2) @date 30/06/2016 @version 1.0.0 */ void CriptoSistemas::OpcionLlaves() { QPushButton *pushSi = new QPushButton("&Si", this); QPushButton *pushNo = new QPushButton("&No", this); QString generar_llaves = "

Generar Llaves

"; ui->titulo->setText(generar_llaves); QString pregunta = "

¿Deseas Generar las llave privada y publica?

"; ui->imgCentral->setText(pregunta); pushSi->setGeometry(QRect(233, 394, 80, 31)); pushNo->setGeometry(QRect(518, 394, 80, 31)); ui->centralPage->addWidget(ui->imgCentral, 0,2); ui->centralPage->addWidget(pushSi, 1,1); ui->centralPage->addWidget(pushNo, 1,3); connect(pushSi,SIGNAL(clicked()),this,SLOT(GenerarLlaves())); connect(pushNo,SIGNAL(clicked()),this,SLOT(Inicio())); connect(ui->cifrar,SIGNAL(clicked()),this,SLOT(CifrarArchivo())); connect(ui->decifrar, SIGNAL(clicked()), this, SLOT(DescifrarArchivo())); pushSi->setObjectName("si"); pushNo->setObjectName("no"); } void CriptoSistemas::Inicio() { } /*! Funcion que permite generar las llaves(privada y publica) @author Ing. Leonel P. Hernandez M (lhernandez at cenditel.gob.ve) @copyright GNU Public License versión 2 (GPLv2) @date 30/06/2016 @version 1.0.0 */ void CriptoSistemas::GenerarLlaves() { QFile ruta_priv; QFile ruta_publ; QPushButton *pushSi = findChild("si"); pushSi->setVisible(false); QPushButton *pushNo = findChild("no"); pushNo->setVisible(false); QPushButton *pushCifrar = new QPushButton("&Cifrar", this); QPushButton *pushDescifrar = new QPushButton("&Descifrar", this); pushCifrar->setObjectName("cifra"); pushDescifrar->setObjectName("descifrar"); QString exito = "

Éxito al generar las claves, ahora puedes cifrar o descifrar un archivo

"; if ( ruta_priv.exists("/usr/share/criptosistema/keys/privkey.txt") && ruta_publ.exists("/usr/share/criptosistema/keys/pubkey.txt")) { QMessageBox::information(this,"Informacion","Las llaves existen, las puedes usar para cifrar o descifrar un archivo!!!"); ui->generarLlaves->setEnabled(false); ui->cifrar->setEnabled(true); ui->decifrar->setEnabled(true); ui->imgCentral->setText(exito); ui->centralPage->addWidget(ui->imgCentral, 0,2); ui->centralPage->addWidget(pushCifrar, 1,1); ui->centralPage->addWidget(pushDescifrar, 1,3); } else { QMessageBox::information(this,"Alerta","Generando la clave......!!!"); pol_t kx = get_rand_pol(KEY_DEG, false); pol_t ky = get_rand_pol(KEY_DEG, false); pol3v_t D = get_open_key(kx, ky); AutoSeededRandomPool rng; InvertibleRSAFunction privkey; privkey.GenerateRandomWithKeySize(rng, 3072); Base64Encoder privkeysink(new FileSink("/usr/share/criptosistema/keys/privkey.txt")); privkey.DEREncode(privkeysink); privkeysink.MessageEnd(); RSAFunction pubkey(privkey); Base64Encoder pubkeysink(new FileSink("/usr/share/criptosistema/keys/pubkey.txt")); pubkey.DEREncode(pubkeysink); pubkeysink.MessageEnd(); ui->generarLlaves->setEnabled(false); ui->cifrar->setEnabled(true); ui->decifrar->setEnabled(true); QMessageBox::information(this,"Exito","Las llaves se crearon, las puedes usar para cifrar o descifrar un archivo!!!"); ui->imgCentral->setText(exito); ui->centralPage->addWidget(ui->imgCentral, 0,2); ui->centralPage->addWidget(pushCifrar, 1,1); ui->centralPage->addWidget(pushDescifrar, 1,3); } connect(pushCifrar,SIGNAL(clicked()),this,SLOT(CifrarArchivo())); connect(pushDescifrar,SIGNAL(clicked()),this,SLOT(DescifrarArchivo())); } /*! Funcion que muestra la carga del archivo que desea cifrar @author Ing. Leonel P. Hernandez M (lhernandez at cenditel.gob.ve) @copyright GNU Public License versión 2 (GPLv2) @date 15/08/2016 @version 1.0.0 */ void CriptoSistemas::CifrarArchivo() { QPushButton *pushSeleccionar = new QPushButton("&Seleccionar Archivo ...", this); QPushButton *pushDescargar = new QPushButton("&Descargar en ...", this); QString cifrando = "

Cifrar Archivo

"; ui->titulo->setText(cifrando); QString img = "

"; ui->imgCentral->setText(img); QPushButton *pushcifrar = findChild("cifra"); QPushButton *pushDescifrar = findChild("descifrar"); if(pushcifrar && pushDescifrar){ pushcifrar->setVisible(false); pushDescifrar->setVisible(false); } ui->centralPage->addWidget(ui->imgCentral, 0,2); ui->centralPage->addWidget(pushSeleccionar, 0,1); ui->centralPage->addWidget(pushDescargar, 2,2); pushDescargar->setObjectName("pushDescargar"); pushSeleccionar->setObjectName("pushSeleccionar1"); connect(pushSeleccionar, &QPushButton::clicked,[=] { emit OpenFolderForCrifrar(); }); connect(pushDescargar, SIGNAL(clicked()), this, SLOT(SaveFile())); } /*! Funcion permite montar un archivo para cifrar @author Ing. Leonel P. Hernandez M (lhernandez at cenditel.gob.ve) @copyright GNU Public License versión 2 (GPLv2) @date 26/09/2016 @version 1.0.0 */ void CriptoSistemas::OpenFolderForCrifrar() { dir = QFileDialog::getOpenFileName(this,tr("Selleccione Archivo"),"/home",tr("Archivos (*.txt);;Todos los Archivos(*.*)")); string ruta = dir.toStdString(); QFile archivo(ruta.c_str()); int size = archivo.size(); if (size > 256) { QString style = "QLabel{ background-color: #FCDFDF; font-size: 13px; font-style: italic; margin-left: 10px; }"; this->ui->flujo_mensajes->setText("El archivo que desea Cifrar debe tener un tamaño maximo de 256 Bytes, vuelve a seleccionar un archivo."); ui->flujo_mensajes->setStyleSheet(style); dir = ""; } } /*! Funcion que permite guardar en una ruta dada el txt cifrado @author Ing. Leonel P. Hernandez M (lhernandez at cenditel.gob.ve) @copyright GNU Public License versión 2 (GPLv2) @date 26/09/2016 @version 1.0.0 */ void CriptoSistemas::SaveFile() { string ruta = dir.toStdString(); QFile archivo(ruta.c_str()); int size = archivo.size(); if (dir.size() > 0 && size <= 256) { QString dir_save = QFileDialog::getSaveFileName(0,"Save file",QDir::currentPath(), "Text files (*.txt)", new QString("Text files (*.txt)")); if (size <= 256) { string plain; string save = dir_save.toStdString(); FileSource texto_plano(ruta.c_str(), true, new StringSink(plain)); FileSource file("/usr/share/criptosistema/keys/pubkey.txt", true, new Base64Decoder); // Cifrado RSAES_OAEP_SHA_Encryptor pubkey(file); AutoSeededRandomPool rng; StringSource ss1( plain, true, new PK_EncryptorFilter( rng, pubkey, new FileSink( save.c_str() ) ) // PK_EncryptorFilter ); // StringSource QString style = "QLabel{ background-color: #5CB85C; font-size: 13px; font-style: italic; margin-left: 10px; }"; this->ui->flujo_mensajes->setText("El archivo se Cifro con exito, se encuentra en la ruta " + dir_save); ui->flujo_mensajes->setStyleSheet(style); dir = ""; } else { QString style = "QLabel{ background-color: #FCDFDF; font-size: 13px; font-style: italic; margin-left: 10px; }"; this->ui->flujo_mensajes->setText("El archivo que desea Cifrar debe tener un tamaño maximo de 256 Bytes, vuelve a seleccionar un archivo."); ui->flujo_mensajes->setStyleSheet(style); dir = ""; } } else { QString style = "QLabel{ background-color: #FCDFDF; font-size: 13px; font-style: italic; margin-left: 10px; }"; this->ui->flujo_mensajes->setText("Error, Debes seleccionar un archivo para cifrar"); ui->flujo_mensajes->setStyleSheet(style); } } /*! Funcion que muestra el formulario para la carga del archivo que desea Decifrar @author Ing. Leonel P. Hernandez M (lhernandez at cenditel.gob.ve) @copyright GNU Public License versión 2 (GPLv2) @date 26/09/2016 @version 1.0.0 */ void CriptoSistemas::DescifrarArchivo() { QPushButton *pushSeleccionar = new QPushButton("&Seleccionar Archivo ...", this); QPushButton *pushDescargar = new QPushButton("&Descifrar en ...", this); QString cifrando = "

Decifrar Archivo

"; ui->titulo->setText(cifrando); QString img = "

"; ui->imgCentral->setText(img); QPushButton *pushcifrar = findChild("cifra"); QPushButton *pushDescifrar = findChild("descifrar"); if(pushcifrar && pushDescifrar){ pushcifrar->setVisible(false); pushDescifrar->setVisible(false); } ui->centralPage->addWidget(ui->imgCentral, 0,2); ui->centralPage->addWidget(pushSeleccionar, 0,1); ui->centralPage->addWidget(pushDescargar, 2,2); pushDescargar->setObjectName("pushDescargarEn"); pushSeleccionar->setObjectName("pushSeleccionar"); connect(pushSeleccionar, SIGNAL(clicked()), this, SLOT(OpenFolderForDescifrar())); connect(pushDescargar, SIGNAL(clicked()), this, SLOT(SaveFileForDescifrado())); } /*! Funcion permite montar un archivo el cual sera Decifrado @author Ing. Leonel P. Hernandez M (lhernandez at cenditel.gob.ve) @copyright GNU Public License versión 2 (GPLv2) @date 26/09/2016 @version 1.0.0 */ void CriptoSistemas::OpenFolderForDescifrar() { dir = QFileDialog::getOpenFileName(this,tr("Selleccione Archivo"),"/home",tr("Archivos (*.txt);;Todos los Archivos(*.*)")); QPushButton *pushDescarga = findChild("pushDescargar"); if (pushDescarga) { pushDescarga->setVisible(false); } } /*! Funcion que permite guardar en una ruta dada el txt Decifrado @author Ing. Leonel P. Hernandez M (lhernandez at cenditel.gob.ve) @copyright GNU Public License versión 2 (GPLv2) @date 26/09/2016 @version 1.0.0 */ void CriptoSistemas::SaveFileForDescifrado() { if (dir.size() > 0 ) { QString dir_save = QFileDialog::getSaveFileName(0,"Save file",QDir::currentPath(), "Text files (*.txt)", new QString("Text files (*.txt)")); // Descifrado AutoSeededRandomPool rng; string str; string ruta = dir.toStdString(); string save = dir_save.toStdString(); FileSource file("/usr/share/criptosistema/keys/privkey.txt", true, new Base64Decoder); FileSource cifrado(ruta.c_str(), true, new StringSink(str)); RSAES_OAEP_SHA_Decryptor d(file); StringSource ss2(str, true, new PK_DecryptorFilter(rng, d, new FileSink( save.c_str() ) ) // PK_DecryptorFilter ); // StringSource QString style = "QLabel{ background-color: #5CB85C; font-size: 13px; font-style: italic; margin-left: 10px; }"; this->ui->flujo_mensajes->setText("El archivo se DesCifro con exito, el archivo se encuentra en la siguiente ruta: " + dir_save); ui->flujo_mensajes->setStyleSheet(style); dir = ""; } else { QString style = "QLabel{ background-color: #FCDFDF; font-size: 13px; font-style: italic; margin-left: 10px; }"; this->ui->flujo_mensajes->setText("Debes seleccionar un archivo para Decifrar"); ui->flujo_mensajes->setStyleSheet(style); } } /*! Funcion para mostrar la Ayuda del sistema @author Ing. Leonel P. Hernandez M (lhernandez at cenditel.gob.ve) @copyright GNU Public License versión 2 (GPLv2) @date 26/09/2016 @version 1.0.0 */ void CriptoSistemas::Ayuda() { QPushButton *pushSeleccionar = findChild("pushSeleccionar"); QPushButton *pushSelecciona = findChild("pushSeleccionar1"); QPushButton *pushDescargar = findChild("pushDescargarEn"); QPushButton *pushDescarga = findChild("pushDescargar"); QPushButton *pushSi = findChild("si"); QPushButton *pushNo = findChild("no"); QPushButton *pushcifrar = findChild("cifra"); QPushButton *pushDescifrar = findChild("descifrar"); if(pushcifrar && pushDescifrar){ delete pushcifrar; delete pushDescifrar; } if (pushSi) { delete pushSi; } if (pushNo) { delete pushNo; } if (pushDescargar) { delete pushDescargar; } if (pushDescarga) { delete pushDescarga; } if (pushSeleccionar) { delete pushSeleccionar; } if (pushSelecciona) { delete pushSelecciona; } QString bienvenida = "

Bienvenido

"; ui->titulo->setText(bienvenida); QString ayuda = "

Una de las herramientas principales para proveer seguridad a la información cuando

se transmite por un canal abierto es la criptografía. La criptografía es una rama

de la matemática que permite transformar la información de manera que su lectura

sea muy difícil si no se posee una clave criptográfica. Es de particular interés,

entonces, para este Centro de Desarrollo e Investigación en Tecnologías Libres-

CENDITEL, dedica parte de su potencial investigativo a estudiar los diferentes

sistemas criptográficos (criptosistemas) existentes, proponer mejoras a los mismos

o incluso, desarrollar soberanamente propuestas alternativas a los ya conocidos.

Es por ello que desde CENDITEL nos hemos propuesto el estudio de un

criptosistema novedoso que puede dar seguridad incluso en un computador cuántico,

si llegare a ser construido. Este estudio se llama Criptosistema de variedad

algebraica, su seguridad se basa en un problema matemático del área de geometría

permitiría ser seguro en el mencionado computador cuántico además de poder ser

utilizado en un computador clásico .

"; ui->imgCentral->setText(ayuda); ui->centralPage->addWidget(ui->imgCentral, 0,1); }