Commit a96ba83d by 李定达

1.签名和加密移植到QT完成 80%

parent 31c70139
LIBS += -L"C:/openssl/openssl-1.0.1s/out32dll" -llibeay32
LIBS += -L"C:/openssl/openssl-1.0.1s/out32dll" -lssleay32
INCLUDEPATH += $$quote(C:/openssl/openssl-1.0.1s/inc32/)
HEADERS += \
$$PWD/dataprocess.h \
$$PWD/fmglobal.h \
$$PWD/cretopt.h
#ifndef CRETOPT
#define CRETOPT
#include "dataprocess.h"
#include <QFile>
#include <QString>
#include <QJsonObject>
#include <QJsonDocument>
#include <Windows.h>
#include "QsLog.h"
EXTERN_C IMAGE_DOS_HEADER __ImageBase;
class CretOperate
{
public:
static void GetProcPath(char * pathBuf)
{
int curPos;
GetModuleFileNameA((HMODULE)&__ImageBase, pathBuf, MAX_PATH);
curPos = strlen(pathBuf) - 1;
while('\\' != pathBuf[curPos])
{
curPos--;
}
curPos++;
pathBuf[curPos] = '\0';
}
static bool GetSign(QJsonObject &json, QString &sign = QString())
{
QString serpbk, clipbk;
if(!GetCret(serpbk, clipbk))
return false;
QStringList list;
QString values;
DataProcess::GetJsonKeyArray(list, json);
DataProcess::SortString(list);
DataProcess::GetValueFromJson(list, json, values);
QByteArray array = values.toUtf8();
char tmp[MAX_SIGN_LEN] = { 0 };
if(DataProcess::RSASign(array.data(), tmp, MAX_SIGN_LEN, clipbk.toUtf8().data()) == 0)
{
QLOG_ERROR() << "get RSASign failed";
return false;
}
QLOG_INFO() << "get RSA sign:" << tmp;
sign = QString(tmp);
json.insert(JSON_KEY_SIGN, sign);
return false;
}
static bool SetRSACret(QString &des3text)
{
}
private:
static bool GetCret(QString &serpublickey, QString &cleprivatekey)
{
char path[MAX_PATH] = { 0 };
GetProcPath(path);
QString p12path(path);
p12path.append(CRET_FILE_NAME);
QFile file(p12path);
if(!file.open(QFile::ReadOnly))
{
QLOG_ERROR() << QString("open %1 failed").arg(p12path);
return false;
}
QByteArray array = file.readAll();
file.close();
char rps[MAX_BUF_LEN] = {0};
char *buf = (char *)calloc(array.size() + 100, sizeof(char));
strcpy(buf, array.data());
if(DataProcess::DES3Decode((const unsigned char *)DES3_KEY, buf, strlen(buf), (unsigned char *)rps, MAX_BUF_LEN) == 0)
{
QLOG_ERROR() << "DES3Decode Client.p12 Failed";
return false;
}
QJsonDocument jsonDocument = QJsonDocument::fromJson(QByteArray(rps));
if( jsonDocument.isNull() )
{
QLOG_ERROR() << "DES3Decode not json:" << rps;
return false;
}
QJsonObject json = jsonDocument.object();
if(!json.contains(JSON_KEY_STATUS) || json[JSON_KEY_STATUS].toInt() != 100)
{
QLOG_ERROR() << "error client.p12 file:" << json;
return false;
}
serpublickey = json[JSON_KEY_SERPBLICKEY].toString();
cleprivatekey = json[JSON_KEY_CLIENTPRIKEY].toString();
QLOG_INFO() << "server public key : " << serpublickey;
QLOG_INFO() << "client private key : " << cleprivatekey;
return true;
}
};
#endif // CRETOPT
#ifndef FM_DATA_PROCESS_H
#define FM_DATA_PROCESS_H
#include <string>
#include <openssl/evp.h>
#include <openssl/bio.h>
#include <openssl/buffer.h>
#include <openssl/rsa.h>
#include <openssl/pem.h>
#include <openssl/err.h>
#include <openssl/des.h>
#include <sstream>
#include "fmglobal.h"
#include <QJsonObject>
#include <QString>
#include <QStringList>
class DataProcess
{
public:
static int base64(const char *input, size_t length, char *result, size_t size)
{
BIO * bmem = NULL;
BIO * b64 = NULL;
BUF_MEM * bptr = NULL;
int len = 0;
if(input == NULL)
return 0;
//assert(NULL != input);
b64 = BIO_new(BIO_f_base64());
bmem = BIO_new(BIO_s_mem());
if (NULL == b64 || NULL == bmem) {
perror("BIO_new");
return 0;
}
BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL);
b64 = BIO_push(b64, bmem);
BIO_write(b64, input, length);
BIO_flush(b64);
BIO_get_mem_ptr(b64, &bptr);
if ((unsigned int)(bptr->length + 1) > size) {
BIO_free_all(b64);
return 0;
}
memcpy(result, bptr->data, bptr->length);
result[bptr->length] = 0;
len = bptr->length;
BIO_free_all(b64);
return len;
}
static int debase64(const char *input, size_t length, char *result, size_t size)
{
BIO * b64 = NULL;
BIO * bmem = NULL;
int len;
if(input == NULL)
return 0;
//assert(NULL != input);
if (length > size)
return 0;
memset(result, 0, size);
b64 = BIO_new(BIO_f_base64());
bmem = BIO_new_mem_buf((void *)input, length);
BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL);
if (NULL == b64 || NULL == bmem) {
perror("BIO_new");
return 0;
}
bmem = BIO_push(b64, bmem);
len = BIO_read(bmem, result, length);
BIO_free_all(b64);
return len;
}
static int RSASign(const char *text, char *signature, size_t size,const char *private_key)
{
RSA *rsa;
unsigned char *sig;
unsigned int len;
unsigned int length = 0;
BIO* in = NULL;
unsigned char sha1[20] = { '\0' };
char tmpprivatekey[MAX_RSA_KEY_LEN] = {0};
if(GetPEMKey(private_key, strlen(private_key), tmpprivatekey, MAX_RSA_KEY_LEN, 0) == 0)
return 0;
OpenSSL_add_all_algorithms();
in = BIO_new_mem_buf((void*)tmpprivatekey, -1);
if (in == NULL) {
perror("read private failed");
return 0;
}
rsa = PEM_read_bio_RSAPrivateKey(in, NULL, NULL, NULL);
if (in != NULL)
BIO_free(in);
if (rsa == NULL) {
perror("PEM_read_bio_RSAPrivateKey");
return 0;
}
if (NULL == (sig = (unsigned char*)malloc(RSA_size(rsa)))) {
RSA_free(rsa);
return 0;
}
SHA1((const unsigned char *)text, strlen(text), sha1);
if (1 != RSA_sign(NID_sha1, sha1, 20, sig, &len, rsa)) {
free(sig);
RSA_free(rsa);
printf("RSA_sign error.\n");
return 0;
}
if ((length= base64((char *)sig, 128, signature, size)) == 0) {
free(sig);
RSA_free(rsa);
printf("base64 error.\n");
return 0;
}
free(sig);
RSA_free(rsa);
return length;
}
static int RSAVerify(const char *text,const char *signature, const char *public_key)
{
RSA *rsa;
BIO* in = NULL;
char * sig_debase = NULL;
unsigned char sha1[20];
char tmppublickey[MAX_RSA_KEY_LEN] = {0};
if(GetPEMKey(public_key, strlen(public_key), tmppublickey, MAX_RSA_KEY_LEN, 1) == 0)
return 0;
in = BIO_new_mem_buf((void*)tmppublickey, -1);
if (NULL == in) {
printf("BIO_read_filename error.\n");
return 0;
}
rsa = PEM_read_bio_RSA_PUBKEY(in, NULL, NULL, NULL);
if (in != NULL) BIO_free(in);
if (rsa == NULL) {
printf("PEM_read_bio_RSA_PUBKEY error.\n");
return 0;
}
sig_debase = (char *)malloc(250 * sizeof(char));
if (NULL == debase64(signature, strlen((char *)signature), sig_debase, 250)) {
RSA_free(rsa);
printf("debase64 error.\n");
return 0;
}
SHA1((const unsigned char *)text, strlen(text), sha1);
if (1 != RSA_verify(NID_sha1, sha1, 20, (unsigned char *)sig_debase, 128, rsa)) {
free(sig_debase);
RSA_free(rsa);
printf("RSA_verify error.\n");
return 0;
}
free(sig_debase);
RSA_free(rsa);
return 1;
}
static int DES3Encode(const unsigned char *key,const char *in, int inlen, unsigned char *out, int outmaxlen)
{
int iOutLen = 0;
int iTmpLen = 0;
int len;
char iv[KEY_SIZE] = {0};
unsigned char *tmp = (unsigned char *)malloc(outmaxlen * sizeof(unsigned char));
memset(tmp, 0, outmaxlen);
EVP_CIPHER_CTX ctx;
EVP_CIPHER_CTX_init(&ctx);
EVP_EncryptInit_ex(&ctx, EVP_des_ede3_ecb(), NULL, (const unsigned char *)key, (const unsigned char *)iv);
if(!EVP_EncryptUpdate(&ctx, (unsigned char*)tmp, &iOutLen, (const unsigned char *)in, inlen))
{
EVP_CIPHER_CTX_cleanup(&ctx);
return 0;
}
if(!EVP_EncryptFinal_ex(&ctx, (unsigned char *)(tmp + iOutLen), &iTmpLen))
{
EVP_CIPHER_CTX_cleanup(&ctx);
return 0;
}
iOutLen += iTmpLen;
EVP_CIPHER_CTX_cleanup(&ctx);
len = base64((char *)tmp, iOutLen, (char *)out, outmaxlen);
free(tmp);
return len;
}
static int DES3Decode(const unsigned char *key,const char * in, int inlen, unsigned char *out, int outmaxlen)
{
int iOutLen = 0;
int iTmpLen = 0;
int length = 0;
char iv[KEY_SIZE] = {0};
unsigned char *tmp = (unsigned char *)malloc(outmaxlen * sizeof(unsigned char));
memset(tmp, 0, outmaxlen);
if((length = debase64(in, inlen, (char *)tmp, outmaxlen)) == 0)
{
perror("debase64 failed");
return 0;
}
EVP_CIPHER_CTX ctx;
EVP_CIPHER_CTX_init(&ctx);
EVP_DecryptInit_ex(&ctx, EVP_des_ede3_ecb(), NULL, (const unsigned char *)key, (const unsigned char *)iv);
if(!EVP_DecryptUpdate(&ctx, (unsigned char*)out, &iOutLen, (const unsigned char *)tmp, length))
{
EVP_CIPHER_CTX_cleanup(&ctx);
return 0;
}
if(!EVP_DecryptFinal_ex(&ctx, (unsigned char *)(out + iOutLen), &iTmpLen))
{
EVP_CIPHER_CTX_cleanup(&ctx);
return 0;
}
iOutLen += iTmpLen;
EVP_CIPHER_CTX_cleanup(&ctx);
out[iOutLen] = 0;
return iOutLen;
}
static int GetPEMKey(const char *key, int keylen, char *outpemkey, int outpemkeymaxlen, int ispublickey)
{
std::stringstream sstm;
std::string str(key, keylen);
if (keylen > outpemkeymaxlen)
{
return 0;
}
if(ispublickey == 0)
{
int i = 0;
sstm << "-----BEGIN RSA PRIVATE KEY-----\n";
while(i + 64 < keylen)
{
sstm << str.substr(i, 64) << "\n";
i += 64;
}
if(keylen - i > 0)
sstm << str.substr(i, keylen - i) << "\n";
sstm << "-----END RSA PRIVATE KEY-----\n";
}
else
{
int i = 0;
sstm << "-----BEGIN PUBLIC KEY-----\n";
while(i + 64 < keylen)
{
sstm << str.substr(i, 64) << "\n";
i += 64;
}
if(keylen - i > 0)
sstm << str.substr(i, keylen - i) << "\n";
sstm << "-----END PUBLIC KEY-----\n";
}
if(strlen(sstm.str().c_str()) > outpemkeymaxlen)
return 0;
strcpy(outpemkey, sstm.str().c_str());
return 1;
}
static void GetJsonKeyArray(QStringList &keys, QJsonObject &json)
{
QJsonObject::Iterator it;
keys.clear();
for(it = json.begin(); it != json.end(); ++it)
{
if(it.value().isString() || it.value().isDouble())
keys.append(it.key());
}
}
static void SortString(QStringList &keys)
{
keys.removeOne(JSON_KEY_SIGN);
keys.sort();
}
static void GetValueFromJson(const QStringList &keys, const QJsonObject &json, QString &values)
{
values.clear();
for(int i = 0; i < keys.length(); ++i)
{
if(json[keys[i]].isString())
{
values.append(json[keys[i]].toString());
values.append("|");
}
else if(json[keys[i]].isDouble())
{
values.append(QString::number(json[keys[i]].toInt()));
values.append("|");
}
}
values = values.left(values.length() - 1);
qDebug() << values;
}
};
#endif
#ifndef FM_GLOBAL_H
#define FM_GLOBAL_H
#define NUM_SIZE 60
#define KEY_SIZE 24
#define MAX_LOG_LINE_NUM 1024
#define MAX_RSA_KEY_LEN 2048
#define MAX_BUF_LEN 25600
#define MAX_JSON_KEY_LEN 128
#define MAX_SIGN_LEN 256
#define CFG_FILE_NAME "fmclient.cfg"
#define RBG_FILE_NAME "fmclient.rbk"
#define DES3_KEY "ABCD@#9876DFSAAWKLDEOPDD"
#define CRET_FILE_NAME "client.p12"
#define JSON_KEY_ONLY "partnerOrderId"
#define JSON_KEY_MAC "mac"
#define JSON_KEY_SIGN "sign"
#define JSON_KEY_FMTEST "test"
#define JSON_KEY_STATUS "statusCode"
#define JSON_KEY_SERPBLICKEY "serverPublicKey"
#define JSON_KEY_CLIENTPRIKEY "clientPrivateKey"
#define CFG_KEY "template"
#define TMP_JSON "json.ini"
#define DB_ORDER "order.db"
#define DB_TABLE_NAME "orderlist"
#define MAX_ORDERID_LEN 200
#endif
......@@ -152,7 +152,7 @@ private:
json.insert(JSON_KEY_STATIONID, FMTool::GetString((const void *)&(request.DeviceNo), 6));
json.insert(JSON_KEY_OPERATORID, FMTool::GetString((const void *)&(request.CashierNo), 6));
json.insert(JSON_KEY_FMID, list[0]);
json.insert(JSON_KEY_PRINTACTION, QString("104"));
json.insert(JSON_KEY_PRINTACTION, QString("103"));
return true;
}
......
......@@ -77,6 +77,9 @@ extern "C" __declspec(dllexport) void Start(const char *indata, char *outdata)
#include "rspfactory.h"
#include <QDir>
#include <QApplication>
#include <QStringList>
#include "DataProcess/dataprocess.h"
#include "DataProcess/cretopt.h"
void TestSetString()
{
......@@ -198,6 +201,62 @@ void TestDllFmclient()
}
void TestDataProcess()
{
QJsonObject json;
QJsonObject obj;
json.insert("awqwe", 2);
json.insert("Sklhfwj", "hello");
json.insert("oiueqw","");
json.insert("sign","jeqweqwje287398217");
obj.insert("ldd", "hahahah");
json.insert("lcd", obj);
qDebug() << json;
QStringList list;
DataProcess::GetJsonKeyArray(list, json);
qDebug() << "not sort" << list;
DataProcess::SortString(list);
qDebug() << "sort" << list;
QString value;
DataProcess::GetValueFromJson(list, json, value);
qDebug() << value;
}
void TestCret()
{
QJsonObject json;
QJsonObject obj;
QString sign;
json.insert("awqwe", 2);
json.insert("Sklhfwj", "hello");
json.insert("oiueqw","");
json.insert("sign","jeqweqwje287398217");
obj.insert("ldd", "hahahah");
json.insert("lcd", obj);
qDebug() << json;
CretOperate::GetSign(json, sign);
qDebug() << json;
}
int main(int argc, char *argv[])
{
......@@ -232,6 +291,11 @@ int main(int argc, char *argv[])
//
//TestDllFmclient();
//pass
TestDataProcess();
TestCret();
qDebug() << "1212367123";
AlipayRequest req;
......@@ -287,7 +351,7 @@ int main(int argc, char *argv[])
//char as[] = "ak10dh171300000000000 *#dhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh";
char b[MAX_BUF_LEN] = {0};
control.Start(as, b);
//control.Start(as, b);
return a.exec();
}
......
......@@ -4,13 +4,14 @@
#
#-------------------------------------------------
QT += core gui concurrent
QT += core gui concurrent sql
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = sbkpay
include("./QsLog/QsLog.pri")
include("./DataProcess/DataProcess.pri")
CONFIG += C++11
......@@ -55,3 +56,5 @@ LIBS += -luser32
RESOURCES += \
res.qrc
DISTFILES +=
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE QtCreatorProject>
<!-- Written by QtCreator 3.5.1, 2017-08-24T16:03:42. -->
<!-- Written by QtCreator 3.5.1, 2017-08-25T00:09:40. -->
<qtcreator>
<data>
<variable>EnvironmentId</variable>
......@@ -61,7 +61,7 @@
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop Qt 5.5.1 MSVC2010 32bit</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop Qt 5.5.1 MSVC2010 32bit</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">qt.55.win32_msvc2010_kit</value>
<value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">1</value>
<value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
<value type="int" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
<value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
......@@ -226,12 +226,14 @@
</valuelist>
<value type="int" key="PE.EnvironmentAspect.Base">2</value>
<valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
<value type="QString" key="ProjectExplorer.CustomExecutableRunConfiguration.Arguments"></value>
<value type="QString" key="ProjectExplorer.CustomExecutableRunConfiguration.Executable"></value>
<value type="QString" key="ProjectExplorer.CustomExecutableRunConfiguration.WorkingDirectory">%{buildDir}</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">自定义执行档</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">sbkpay</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.CustomExecutableRunConfiguration</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4RunConfiguration:D:/gitcode/sbkpay/sbkpay/sbkpay.pro</value>
<value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.CommandLineArguments"></value>
<value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.ProFile">sbkpay.pro</value>
<value type="bool" key="Qt4ProjectManager.Qt4RunConfiguration.UseDyldImageSuffix">false</value>
<value type="bool" key="Qt4ProjectManager.Qt4RunConfiguration.UseTerminal">false</value>
<value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.UserWorkingDirectory"></value>
<value type="uint" key="RunConfiguration.QmlDebugServerPort">3768</value>
<value type="bool" key="RunConfiguration.UseCppDebugger">false</value>
<value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment