免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: ryr1990
打印 上一主题 下一主题

[C] 请教疑问!读取png图片内容到字符串,类似java的byte数组 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2018-03-05 10:26 |只看该作者
回复 10# dorodaloo

不好意思,回复晚了。下面是验签的代码
int verify(char *data, char *resp)
{
    char *signBuf= malloc(BUFFER_SIZE);
    char *timeBuf = malloc(BUFFER_SIZE);
    char *contentLenBuf = malloc(BUFFER_SIZE);
    memcpy(signBuf, data, strlen(data));
    memcpy(timeBuf, data, strlen(data));
    memcpy(contentLenBuf, data, strlen(data));
    int r,headnum,m, contentnum;
    char sign[500];
    char *timestamp = malloc(100);
    char contentLen[5];
    while (1)
    {
        r=sscanf(contentLenBuf, "Content-Length: %[^\n]%n", contentLen, &contentnum);
        if (1==r) {
            contentLenBuf+=contentnum;
        } else if (0==r) contentLenBuf++;
        else break;

        r=sscanf(signBuf,"Signature: %[^\n]%n",sign,&headnum);
        if (1==r) {
            signBuf+=headnum;
        } else if (0==r) signBuf++;
        else break;

        r=sscanf(timeBuf,"Timestamp: %[^\n]%n",timestamp,&m);
        if (1==r) {
            timeBuf+=m;
        } else if (0==r) timeBuf++;
        else break;
    }
    char *body = malloc(BUFFER_SIZE);
    memcpy(body, data+(strlen(data)-atoi(contentLen)), atoi(contentLen));

    // 在这一步之前body如果是图片内容,打印出来是空的,下一步验证就失败;如果body是文本内容验证成功
    verifyByRSA(pubKey, body, strlen(body), sign);
    strcpy(resp, body);
}


int verifyByRSA(char* publicKey, const unsigned char * pData, size_t dataLength, unsigned char * sign)
{
    RSA* rsa_pub_key = createPublicRSA(publicKey);
    if (rsa_pub_key == NULL)
    {
        printf("\n创建公钥内容失败\n");
        return false;
    }

    unsigned char szSha1Data[SHA_DIGEST_LENGTH+1] = { 0 };
    memset(szSha1Data, 0, sizeof(szSha1Data));
    SHA_CTX c;
    if (!SHA1_Init(&c))
    {
        printf("\n初始化sha1算法失败!\n");
        return false;
    }
    SHA1_Update(&c, pData, strlen((char*)pData));
    SHA1_Final(szSha1Data, &c);
    OPENSSL_cleanse(&c, sizeof(c));

    unsigned char *outstr = base64_decode(sign);
    int r = RSA_verify(NID_sha1, szSha1Data, SHA_DIGEST_LENGTH, outstr, 256, rsa_pub_key);
    RSA_free(rsa_pub_key);
    if (1 == r)
    {
        printf("验签成功\n");
        return 0;   
    }
    else
    {
        printf("验签失败\n");
        return 1;
    }
}



论坛徽章:
6
数据库技术版块每日发帖之星
日期:2015-11-27 06:20:00程序设计版块每日发帖之星
日期:2015-12-01 06:20:00每日论坛发贴之星
日期:2015-12-01 06:20:0015-16赛季CBA联赛之佛山
日期:2017-03-26 23:38:0315-16赛季CBA联赛之江苏
日期:2017-07-17 10:08:4415-16赛季CBA联赛之北京
日期:2018-03-04 17:01:50
12 [报告]
发表于 2018-03-05 11:27 |只看该作者
回复 11# ryr1990




ret[0 ~ 8]
[137][80][78][71][13][10][26][10][0]

ret[8] = 0 又称结束符, 表示字符串结束

strlen(ret) 等于 8, 不等于 byte array 实际长度.

png应使用实际长度,不可使用 strlen

char good[] = {'h', 'e', 'l', 'l', 'o', '\0'};
char bad[] = {'h', 'e', '\0', 'l', 'l', 'o', '\0'};

printf("good strlen = %d\n", strlen(good));
printf("bad strlen = %d\n", strlen(bad));
good strlen = 5
bad strlen = 2

论坛徽章:
0
13 [报告]
发表于 2018-03-05 17:03 |只看该作者
回复 12# dorodaloo

OK,明天试下,现在不在电脑前,哈哈

论坛徽章:
0
14 [报告]
发表于 2018-03-06 10:47 |只看该作者
回复 12# dorodaloo

那个长度dataLength参数好像没用到,这就尴尬了,应该不是strlen导致的问题。

论坛徽章:
6
数据库技术版块每日发帖之星
日期:2015-11-27 06:20:00程序设计版块每日发帖之星
日期:2015-12-01 06:20:00每日论坛发贴之星
日期:2015-12-01 06:20:0015-16赛季CBA联赛之佛山
日期:2017-03-26 23:38:0315-16赛季CBA联赛之江苏
日期:2017-07-17 10:08:4415-16赛季CBA联赛之北京
日期:2018-03-04 17:01:50
15 [报告]
发表于 2018-03-06 13:26 |只看该作者
回复 14# ryr1990

那个长度dataLength参数好像没用到,应该不是strlen导致的问题。




    SHA1_Update(&c, pData, strlen((char*)pData));


    strcpy(resp, body); // 0 又称结束符, 表示字符串结束


    char *body = malloc(BUFFER_SIZE);
    memcpy(body, data+(strlen(data)-atoi(contentLen)), atoi(contentLen));


    memcpy(signBuf, data, strlen(data));
    memcpy(timeBuf, data, strlen(data));
    memcpy(contentLenBuf, data, strlen(data));


论坛徽章:
0
16 [报告]
发表于 2018-03-06 14:17 |只看该作者
回复 15# dorodaloo

是哦,已经修改好了,感谢感谢,给大佬递烟,哈哈。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP