找回密码
 立即注册
收起左侧

aes加密

7
回复
9432
查看
[复制链接]
累计签到:103 天
连续签到:1 天
来源: 2016-6-1 10:40:01 显示全部楼层 |阅读模式
1Qter豆
这是我调用openssl AES加密的代码和运行的信息,大家帮忙看一下,有什么问题么,加密前面一部分是对的,后面就不对了,为什么呢?            
            unsigned char ch1[16];
            memcpy(ch1,systemRes.PKey.toStdString().c_str(),16);
            qDebug()<<"127"<<(char*)ch1;
            char* pkey;
            pkey =(char*)ch1;
            qDebug()<<"130"<<pkey;

            AES_set_encrypt_key((const unsigned char*)pkey,128,&aes);
            qDebug()<<(const unsigned char*)pkey;
            verftyRes.OID="AAA4";
            verftyRes.ST="0001";
            qDebug()<<verftyRes.R1<<"\n"<<verftyRes.R1.size();

            unsigned char ch2[16];
            memcpy(ch2,verftyRes.R1.toStdString().c_str(),16);
            qDebug()<<"143"<<(char*)ch2;
            char* R1;
            R1 =(char*)ch2;
            qDebug()<<"146"<<R1;

            unsigned char R1_new[44],r1_new[44];
            AES_ecb_encrypt((const unsigned char*)R1,R1_new,&aes,AES_ENCRYPT);
            char* outbase64Encode;

            Base64Encode((const unsigned char*)R1_new,32,&outbase64Encode);
            qDebug()<<outbase64Encode;
打印信息:
"5bc1a33325ff47db"   //这是PKey
16                 //16位
127 5bc1a33325ff47db
130 5bc1a33325ff47db
0x7fffaa8aefa0
"12345678fiksjfch"
16
143 12345678fiksjfch�J0   //这里为什么有乱码呢,这个是明文12345678fiksjfch
146 12345678fiksjfch�J0
W8rD2xZPSCFKaSaBgtuYb7D4iqr/fwAAh4z0HGl/AAA= 16 @  // 这个base64显示的,我用AES在线加密试一下加密出来是:W8rD2xZPSCFKaSaBgtuYbx0c5sBDEfbCmGr4NympxG8=,前部分是对的,这是为什么呢?谁知道帮忙下哈,谢谢!


回复

使用道具 举报

累计签到:103 天
连续签到:1 天
2016-6-1 13:46:42 显示全部楼层
我的乱码问题解决了,但是base64编码还是有问题,生成44位 前面一部分的对的,后面还是不对。。。大家知道么
回复

使用道具 举报

累计签到:11 天
连续签到:1 天
2016-6-2 16:53:37 显示全部楼层
知道怎么解决可以共享下给大家;这样其他人才有兴趣帮你看问题
回复

使用道具 举报

累计签到:410 天
连续签到:1 天
2016-6-3 18:02:12 显示全部楼层
我以前也遇到过,没解决.
我比较奇怪的是,后面有一截不一样,但是能解密出来,感觉 后面那个数据没起到作用
回复

使用道具 举报

累计签到:103 天
连续签到:1 天
2016-6-7 16:49:42 显示全部楼层
a408815041 发表于 2016-6-3 18:02
我以前也遇到过,没解决.
我比较奇怪的是,后面有一截不一样,但是能解密出来,感觉 后面那个数据没起到作用 ...

整了好几天,终于明白是怎么回事儿了,问题还是出在aes加密上,base64是标准的,它的输入不正确,后面就不对,aes是以块的方式进行加密的,明文是16位的也要计算它的块,block_num = mingwen_len/AES_BLOCK_SIZE +1;密文长度就是block_num*AES_BLOCK_SIZE;所以我们要计算pad,然后填充,然后再一块一块的加密,这样再base64就对了,然后解密也要这样反推回去,没问题了就。下面是我的一段aes+base64的代码,有兴趣可以看看
MainWindow::MainWindow(QWidget *parent)
   : QMainWindow(parent)
{
    QString PKey="5bc1a33325ff47db";
    QString R1 ="1234567890123456";
    AES_KEY aes;
    int length = strlen(R1.toAscii().data());
    qDebug()<<length;
    int block_num = (length/AES_BLOCK_SIZE)+1;
    int aes_length = block_num*AES_BLOCK_SIZE;

    qDebug()<<length<<"\n"<<aes_length <<block_num;

    char text[aes_length];


    memset(text,'\0',aes_length);
    memcpy(text,R1.toAscii().data(),length);
    AES_set_encrypt_key((unsigned char*)PKey.toAscii().data(),128,&aes);
    qDebug()<<"aaa:"<<PKey.toAscii().data();


    int pad;
    pad = AES_BLOCK_SIZE-length%AES_BLOCK_SIZE;
    qDebug()<<"pad"<<pad;

    unsigned char *alg_s = (typeof(alg_s)) malloc(aes_length);

    memcpy(alg_s,text,length);
    unsigned char *out = (typeof(out)) malloc(aes_length);

    for(int i=length;i<aes_length;i++)
    {
        alg_s =pad;
    }
    for(int i=0;i<block_num;i++)
    {
        AES_ecb_encrypt((const unsigned char*)OFFOF(alg_s, i * AES_BLOCK_SIZE),(unsigned char*)OFFOF(out, i * AES_BLOCK_SIZE),&aes,AES_ENCRYPT);
}
      QString ss;
      ss = QByteArray((char*)out,aes_length).toBase64();
      qDebug()<<"bbb"<<ss;
}
回复

使用道具 举报

累计签到:103 天
连续签到:1 天
2016-6-7 16:57:11 显示全部楼层
冷月有情 发表于 2016-6-7 16:49
整了好几天,终于明白是怎么回事儿了,问题还是出在aes加密上,base64是标准的,它的输入不正确,后面就 ...

我还有一个问题想问你一下,给我点建议就行。我要调用这样的一个函数int MQTTSubscribe(Client* c, const char* topicFilter, enum QoS qos, messageHandler messageHandler);其中c库里面有这样的定义struct MessageData
{
    MQTTMessage* message;
    MQTTString* topicName;
};

typedef void (*messageHandler)(MessageData*);
用c写的话,这样就行
rc = MQTTSubscribe(&c, topic, opts.qos, messageArrived);
void messageArrived(MessageData* md){ ...}
但是在c++里就不行,说/Mqtt/mainwindow.cpp:83:63: error: cannot convert 'MainWindow::messageArrived' from type 'void (MainWindow:(MessageData*)' to type 'messageHandler {aka void (*)(MessageData*)}'
         rc = MQTTSubscribe(&client, topic,QOS1, messageArrived);
能帮我看看为什么么?谢谢啦
回复

使用道具 举报

累计签到:103 天
连续签到:1 天
2016-6-7 16:57:44 显示全部楼层
a408815041 发表于 2016-6-3 18:02
我以前也遇到过,没解决.
我比较奇怪的是,后面有一截不一样,但是能解密出来,感觉 后面那个数据没起到作用 ...


我还有一个问题想问你一下,给我点建议就行。我要调用这样的一个函数int MQTTSubscribe(Client* c, const char* topicFilter, enum QoS qos, messageHandler messageHandler);其中c库里面有这样的定义struct MessageData
{
    MQTTMessage* message;
    MQTTString* topicName;
};

typedef void (*messageHandler)(MessageData*);
用c写的话,这样就行
rc = MQTTSubscribe(&c, topic, opts.qos, messageArrived);
void messageArrived(MessageData* md){ ...}
但是在c++里就不行,说/Mqtt/mainwindow.cpp:83:63: error: cannot convert 'MainWindow::messageArrived' from type 'void (MainWindowMessageData*)' to type 'messageHandler {aka void (*)(MessageData*)}'
         rc = MQTTSubscribe(&client, topic,QOS1, messageArrived);
能帮我看看为什么么?谢谢啦
回复

使用道具 举报

累计签到:103 天
连续签到:1 天
2016-6-7 16:58:38 显示全部楼层
a408815041 发表于 2016-6-3 18:02
我以前也遇到过,没解决.
我比较奇怪的是,后面有一截不一样,但是能解密出来,感觉 后面那个数据没起到作用 ...


我还有一个问题想问你一下,给我点建议就行。我要调用这样的一个函数int MQTTSubscribe(Client* c, const char* topicFilter, enum QoS qos, messageHandler messageHandler);其中c库里面有这样的定义struct MessageData
{
    MQTTMessage* message;
    MQTTString* topicName;
};

typedef void (*messageHandler)(MessageData*);
用c写的话,这样就行
rc = MQTTSubscribe(&c, topic, opts.qos, messageArrived);
void messageArrived(MessageData* md){ ...}
但是在c++里就不行,说/Mqtt/mainwindow.cpp:83:63: error: cannot convert 'MainWindow::messageArrived' from type 'void (MainWindowMessageData*)' to type 'messageHandler {aka void (*)(MessageData*)}'
         rc = MQTTSubscribe(&client, topic,QOS1, messageArrived);
能帮我看看为什么么?谢谢啦
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了