背景
java端往ukey中写授权信息,C++端从ukey中读取授权信息。
java端写入的授权信息是加密的,并且要可逆。
因为java端采用的是AES加密的,所以我(C++端)也只好采用对等形式搞定了。
使用的库
开发环境:Win10 + Qt5.13
QT中AES加解密:采用Qt-AES
第三方库。
github:https://github.com/bricke/Qt-AES
AES在线加解密工具:https://tool.lmeee.com/jiami/aes
开始使用
1.
配置源码
在拉取的代码中,只需将qaesencryption.h和qaesencryption.cpp添加至代码当中即可使用。
2.
java端
java端AES的各属性采用以下:
(1)AES加密模式:CFB
(2)AES填充模式:zeropadding
(3)AES秘钥长度:128位
(4)AES秘钥:d4f7d5057af81ae9(16位,自定义即可)
(5)AES向量:a21186a7b484db71(16位,自定义即可)
最终java端 将原生json数据 采用以上形式加密得到密文,再将密文转为base64编码保存至ukey中。
3.
C++端
规则一定要迎合java端的,否则无法正确解密。
void Ukey::readAuthorizationCode(const QString& devnum)
{
// ...
qInfo() << ">>>>>> base64 data:> " << QByteArray(authorizationcode).data();
//qInfo() << QByteArray(authorizationcode).left(codelen+1);
QString decodeContext = Utils::decodeContext(QByteArray(authorizationcode)); // 传入base64, 解析为明文
qDebug() << ">>>>>> decodec data:> " << decodeContext;
// ...
}
QString Utils::decodeContext(QByteArray base64)
{
QAESEncryption encryption(QAESEncryption::AES_128, QAESEncryption::CFB, QAESEncryption::ISO);
// 此处秘钥和向量必须与java端保持一致
QString key("d4f7d5057af81ae9"); // 秘钥
QString iv("a21186a7b484db71"); // 向量
QByteArray encryContext = QByteArray::fromBase64(base64); // 解析base64, 还原为密文
// qDebug() << "密文:>>> " << encryContext;
QByteArray decodeText = encryption.decode(encryContext, key.toUtf8(), iv.toUtf8()); // 解析密文
// qDebug() << "明文1:>>> " << decodeText;
QString decodedString = QString(encryption.removePadding(decodeText));
// qDebug() << "明文2:>>> " << decodedString;
return decodedString;
}
看看运行数据
[json-debug] open(read) uKeyConfig.json successful.
"[json-debug] get PIN from uKeyConfig.json successful."
"[Debug-ukey] has 1 devices."
"-----------------[K1426211029B3351]-----------------"
"[Debug-ukey] connect to [K1426211029B3351] successful."
>>>>>> base64 data:> 6zANuEJL0oDH0GlVpnMm779EreNb9NT48ZLnqx5ZsuviAR/UAk4wFj3BA5VlQTAZdN3GCQA+Jja42HNONCgnYbBeGZIkPbQfN84XLcSZsrjT4AEI2Zbo
密文:>>> "\xEB""0\r\xB8""BK\xD2\x80\xC7\xD0iU\xA6s&\xEF\xBF""D\xAD\xE3[\xF4\xD4\xF8\xF1\x92\xE7\xAB\x1EY\xB2\xEB\xE2\x01\x1F\xD4\x02N0\x16=\xC1\x03\x95""eA0\x19t\xDD\xC6\t\x00>&6\xB8\xD8sN4('a\xB0^\x19\x92$=\xB4\x1F""7\xCE\x17-\xC4\x99\xB2\xB8\xD3\xE0\x01\b\xD9\x96\xE8"
明文1:>>> "{\"authorizationTimeDay\":12,\"authorizationTimeEnd\":\"\",\"hgAppName\":\"HG_SFC\",\"timetype\":1}"
明文2:>>> "{\"authorizationTimeDay\":12,\"authorizationTimeEnd\":\"\",\"hgAppName\":\"HG_SFC\",\"timetype\":1}"
>>>>>> decodec data:> "{\"authorizationTimeDay\":12,\"authorizationTimeEnd\":\"\",\"hgAppName\":\"HG_SFC\",\"timetype\":1}"
"[readAuth-debug] authorizationTimeDay is [12]."
"[readAuth-debug] hgAppName is [HG_SFC]."
"[readAuth-debug] timetype is [1(非永久)]."
此时ukey中的经java端加密的授权信息已被 充分的解析出来了。
好家伙,将得到的base64拿到 AES在线加解密工具去炮制一下。
更多基于AES的例子,参考该篇文章:
QT中AES的初步测试使用