背景
目前用Qt和同事(他做服务器端)做一个第三方账号登录的东西:
用户在本地客户端输入账号和密码后,客户端将密码进行对称加密,将数据post给服务器。
服务器接收到数据之后,对密码进行解密,得到明文,然后用该账号+密码进行第三方平台登录。
问题(重点、难点)
无论是DES还是AES,不同的平台下,或者不同的人所实现的库一般很难对接上。尤其是那个DES,有一堆可自定义的初始化数据,一旦有一个参数没对上,那就差之千里了。
解决方案
java那边官方好像有自带的加解密函数库,第三方也很多(好像也是对官方的封装)。目前同事用的Hutool,挺好用的。
import cn.hutool.core.util.HexUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.Padding;
import cn.hutool.crypto.symmetric.SymmetricCrypto;
import cn.hutool.crypto.symmetric.DES;
import cn.hutool.crypto.Mode;
...
{
// 测试用的密钥,貌似要长度固定24,不然出问题
String key = "abcdefghijklmnop78945612";
// DES myCrypto = new DES(key.getBytes());
// DES myDes = new DES(
// Mode.ECB,
// Padding.PKCS5Padding,
// key.getBytes()
// );
AES myCrypto = new AES(key.getBytes());
// AES myCrypto = new AES(
// Mode.ECB,
// Padding.PKCS5Padding,
// key.getBytes()
// );
byte[] enData = myCrypto.encrypt("12345678abcdef");
String hexStr = HexUtil.encodeHexStr(enData);
System.out.println(hexStr);
hexStr = "0f5cba12ce291aeb42e12ffda5e08f441c0f896ba2de8791074fd9a50e1746a0";
byte[] hexData = HexUtil.decodeHex(hexStr);
byte[] deData = myCrypto.decrypt(hexData);
String deStr = new String(deData, "utf-8");
System.out.println(deStr);
}
Qt这边使用之前找到的那个库QtAes就行,但是要注意一下参数。下面的代码展示了具体的参数设置:
#include "QtAes/src/qaesencryption.h" //这个要看你具体放在哪个路径
...
// 这里的参数是经过我测试的,其余参数各位有空也可以配合后端一个个试一下。
QAESEncryption encryption(QAESEncryption::AES_192, QAESEncryption::ECB, QAESEncryption::PKCS7);
QByteArray enData = encryption.encode("12345678abcdef中文文本", "abcdefghijklmnop78945612"); //和服务器用同一个密钥
QString passwordData = enData.toHex();