qt数据库及密钥操作

lhc.pro:

#-------------------------------------------------
#
# Project created by QtCreator 2016-07-31T13:55:54
#
#-------------------------------------------------

QT       += core gui
QT       += sql//数据库连接
QT       += network

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
//#Qt5运行Qt4的源码。要在pro中加入QT += core gui和greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = lhc
TEMPLATE = app


SOURCES += main.cpp\
        widget.cpp

HEADERS  += widget.h

FORMS    += widget.ui

widget.h:

#ifndef WIDGET_H
#define WIDGET_H
#include <QSqlTableModel>
#include <QWidget>

#include <QTcpServer>
#include <qtcpsocket.h>
#include <stdio.h>                   //用于printf等函数的调用
#include <winsock2.h>
#include <QApplication>
#include <iostream>
#include <QtSql/QSql>
#include <QtSql/QSqlDatabase>
#include <QtSql/QSqlRecord>
#include <QtSql/QSqlQuery>
#include <QtSql/QSqlError>
#include <QDebug>
#include <QMessageBox>

//Socket的函数调用
#pragma comment (lib, "ws2_32")      //C语言引用其他类

#include <QWidget>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);

    int ss(char *s);
    void Regest();
    void Item(int begin,int ends,char di[20]);

    ~Widget();

private slots:
    void on_search_clicked();
    void recvMessage();

private:
    Ui::Widget *ui;
    char ID[20] ;
    char end[20];
    char start[20];
    char mac[20] ;
    char time[20] ;
    QTcpServer *tcpServer;
    SOCKET s;
};

#endif // WIDGET_H

main.cpp:

#include "widget.h"
#include <QApplication>
#include <QSqlTableModel>
#include <QTextCodec>




int main(int argc, char *argv[])
{

    QApplication a(argc, argv);
    QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));
    Widget w;

    w.show();

    return a.exec();
}

widget.cpp:

#include "widget.h"
#include "ui_widget.h"
#include<QSqlQueryModel>
#include<QTableView>
#include<QFile>
#include<QIODevice>

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)//初始化一个Widget界面指针,其变量名为ui。
{
    tcpServer = new QTcpServer(this);
    if(!tcpServer->listen(QHostAddress::AnyIPv4,9000))
    {  //监听本地主机的9000端口,如果出错就输出错误信息,并关闭
        qDebug() << tcpServer->errorString();
        qDebug()<<" liseten error!";
        QMessageBox::warning(NULL,"Information","listen error!",QMessageBox::Yes);
        close();
    }
    connect(tcpServer,SIGNAL(newConnection()),this,SLOT(recvMessage()));
    ui->setupUi(this);
}


void Widget::recvMessage()
{
    char recvbuf[100];
    QTcpSocket  *clientConnection =tcpServer->nextPendingConnection() ;
    if( clientConnection->waitForReadyRead() == true) //注意::读取要设成阻塞状态 因为客户端的也是阻塞写
        clientConnection->read(recvbuf,100);
    strcpy(ID, recvbuf);
    strcpy(start, recvbuf + 20);
    strcpy(end, recvbuf + 40);
    strcpy(mac, recvbuf + 60);
    strcpy(time, recvbuf + 80);
    QMessageBox::information(this,"tip","Received succeed!",QMessageBox::Ok);
    ui->receive->setText(recvbuf);
    Regest();
}

void Widget::Regest()
{
    QSqlDatabase db;
//    if(QSqlDatabase::contains("qt_sql_default_connection"))
//      db = QSqlDatabase::database("qt_sql_default_connection");
//    else
//      db = QSqlDatabase::addDatabase("QSQLITE");
    db=QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName("User.db");
    if(!db.open())
    {
      qDebug()<<db.lastError();
      QMessageBox::warning(NULL,"Login fail","open Database fail",QMessageBox::Yes);
    }else
    {
       QSqlQuery my;
       bool ff=true;
       int sta=ss(start);
       int en=ss(end);
       my.exec("select * from User");
        while(my.next())
        {
            QString id=my.value(0).toString();
            if(strcmp(id.toLatin1().data(),ID)==0)
            {
                my.prepare("update User set start = :start,end=:end,mac=:mac,lasttime=:time where ID = :id");
                my.bindValue(":id",ID);//更新数据
                my.bindValue(":start",sta);
                my.bindValue(":end",en);
                my.bindValue(":mac",mac);
                my.bindValue(":time",time);
                if(!my.exec())
                {
                qDebug()<<my.lastError();
                }
                else
                {
                qDebug()<<"updated!";
                QMessageBox::information(this,"Information","updated",QMessageBox::Ok);
                ff=false;
                }
           }
        }
        if(ff)//如果false为true,表明无重名,没有要更新数据,将插入数据
        {
            my.prepare("insert into User values (?, ?, ?, ?, ?)");
            my.addBindValue(ID);
            my.addBindValue(sta);
            my.addBindValue(en);
            my.addBindValue(mac);
            my.addBindValue(time);
            if(!my.exec())
            {
              qDebug()<<my.lastError();
            }
            else
            {
              qDebug()<<"insert succeed!";
              QMessageBox::information(this,"Information","insert succeed",QMessageBox::Ok);
            }
        }

        char text[20];
        int i = 0, j = 0;
        while (i < strlen(mac))
        {
            if (mac[i] != ':')
            {
                text[j++] = mac[i];
            }
        i++;
        }
        text[j] = '\0';

        Item(sta,en,text);//提取密钥并放入mac文件夹

     }
    db.close();
}

void Widget::Item(int begin, int ends, char di[20])
{
      int len=ends-begin;
      char key[2048]={"\0"};
      QString fn = QString::fromLatin1(di);           //先转换成Qstring类型
      fn += ".txt";
      QFile file("D:/users/"+fn);
      file.open(QFile::WriteOnly|QFile::Text);   //open()可以创建文件
      file.close();

      file.open(QFile::WriteOnly|QFile::Text);

      FILE *QFile = fopen("Quantuam//Qkey.txt","r");//打开密钥文件
      if(QFile == NULL)
      {
          QMessageBox::warning(NULL,"Warring","Open File fail",QMessageBox::Yes);
      }
      if( fseek(QFile,begin,0)==0)//参数:第一个为文件指针,第二个是指针的偏移量,第三个是指针偏移起始位置
      {
           fread(key,1,len,QFile);//每次获取需要的量子密钥
      }
      fclose(QFile);

      file.write(key,strlen(key));   //写入文件
      file.close();                                   //最后要close





}

void Widget::on_search_clicked()
{

    QSqlDatabase db;
    if(QSqlDatabase::contains("qt_sql_default_connection"))
      db = QSqlDatabase::database("qt_sql_default_connection");
    else
      db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName("User.db");
    db.open();
    QSqlQueryModel *model = new QSqlQueryModel;
    model->setQuery("select * from User");
    model->setHeaderData(0,Qt::Horizontal,"ID");
    model->setHeaderData(1,Qt::Horizontal,"start");
    model->setHeaderData(2,Qt::Horizontal,"end");
    model->setHeaderData(3,Qt::Horizontal,"mac");
    model->setHeaderData(4,Qt::Horizontal,"lasttime");
    ui->show->setModel(model);
    db.close();

}

Widget::~Widget()
{
    delete ui;
}

int Widget::ss(char *s)//将字符串转化为数字
{
    int  i, sum = 0;
    for (i = 0; i < strlen(s); i++)
    {
        sum = (s[i] - '0') + sum * 10;
    }
    return sum;
}








QuickEncrypt,数据安全小工具,采用托盘图标、悬浮窗、鼠标拖拽、右键菜单的简单操作模式,提供文件、文本的加解密(RC4+AES)、Hash(MD5+SHA1)、安全擦除等功能。独有的“智能压缩”加密模式。 1.功能介绍 对鼠标拖入的文本进行加解密 对剪贴板中的文本进行加解密 对鼠标拖入的文件进行加解密 对鼠标拖入的文件进行擦除 对鼠标拖入的文本进行Hash计算 对剪贴板中的文本进行Hash计算 对鼠标拖入的文件进行Hash计算 针对文本和文件加解密的智能数据压缩技术 支持超过4GB的大文件 2.安全机制 2.1 文件擦除策略 a.修改文件名为随机串; b.以32字节的块向文件写入全0; c.刷新数据,关闭文件; d.修改文件名为随机串; e.以32字节的块向文件写入全1; f.刷新数据,关闭文件; g.截断文件大小为0; h.删除文件。 经测试常用数据恢复软件无法成功恢复原有数据。 2.2 Hash算法 使用OpenSSL 0.98提供的MD5(128位)和SHA1(160位)算法。 2.3 加解密密钥生成 将用户输入的密码明文转换成utf-8字节数组(不包含0结束符),计算MD5和SHA1,将MD5结果用作AES 128位密钥,将SHA1结果用作RC4密钥。 2.4 文本加密策略 a.将明文数据转换成utf-8字节数组(包含0结束符); b.对明文字节数组计算CRC32校验码,用于解密时校验,并将CRC32值放在明文首字节之前; c.尝试压缩步骤b的结果(zlib level9),若获得较小的压缩结果则输出压缩后的编码数组,否则放弃压缩,直接输出步骤b的结果; d.对步骤c的结果进行RC4流加密(OpenSSL 0.98); e.对步骤d的结果进行AES_CFB_128分组加密(OpenSSL 0.98); f.对步骤e的结果进行Base64编码(OpenSSL 0.98); g.将标记"QE:|"附加在步骤f的结果之前,输出结果。 2.5 文件加密策略 a.判断输入文件的扩展名是否是压缩格式,对常见压缩格式和流媒体编码文件不启用数据压缩功能; b.以1MB大小分块,读入明文文件数据; c.对分块的明文数据计算MD5,附加在待加密数据之前,用于解密时校验; d.尝试压缩1MB大小的分块,若获得较小的压缩结果则输出压缩后的编码数据,否则直接输出原文; e.对步骤d的结果进行RC4流加密(OpenSSL 0.98); f.对步骤e的结果进行AES_CFB_128分组加密(OpenSSL 0.98); g.将分块数据依次写入输出文件,输出文件的文件名是在原文件名后加".enc"。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值