分享:身份证阅读器在ARM Linux系统调用libwlt2bmp.so解码库实现身份证头像解码

头像解码库:libwlt2bmp.so

照片文件名:photo.bmp

原始身份证相片数据:574C66007E00320000F........(此处省略)

调用身份证阅读器Linux开发包,然后调用libwlt2bmp.so解码库文件,传入身份证原始相片1024字节的加密信息,即可出来下面的明文相片信息。

测试X86_X64、ARM等有效。

以下编译工具实测有效。

arm-poky-linux-gnueabi-gcc

arm-xmv2-linux-uclibcgnueabi

gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf-32位

gcc-linaro-5.5.0-2017.10-x86_64_arm-linux-gnueabihf-32位

gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabihf

gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu

gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu

SDK-6.4-aarch64-cortexa53-linux-gnu

cpp 复制代码
typedef int (*wltdecode)(unsigned char *src, int nlen, unsigned char *dst, int *cbDst);
char imagePath[256] = "./photo.bmp";  //照片文件名


static int writePhoto(unsigned char photo[], unsigned char *bmpfileData, const char *image_file)
{
    int ret = 0;
    int nlen;
    int i, offset;
    unsigned char tmp[5] = {0};
    unsigned char *imageData = bmpfileData;

    char outbmpdata[40960] = {0};

    // printf("image_file = %s\n",image_file) ;

    wltdecode_t pFun = NULL;
    void *handle = dlopen("./libwlt2bmp.so", RTLD_LAZY);
    if (NULL == handle)
    {
        printf("调用相片解码库失败,返回值:%s.\n", dlerror());
        return 0;
    }

    pFun = (wltdecode_t)dlsym(handle, "_Unpack");
    if (NULL == pFun)
    {
        printf("pFun = (wltdecode) dlsym(handle, _Unpack == NULL \n");
        dlclose(handle);
        return 0;
    }

    if ((ret = (*pFun)((char *)photo, 1024, outbmpdata, &nlen)) == 1)
    {
        FILE *fpWrite = NULL;
        fpWrite = fopen(image_file, "wb");
        if (NULL != fpWrite)
        {
            fwrite(outbmpdata, 1, nlen, fpWrite);
            fclose(fpWrite);
        }
        else
        {
            printf("相片解码失败\n");
        }
    }
    else
    {

        // printf("ret = %d\n",ret) ;
    }
    dlclose(handle);
    return 0;
}

int main()
{
//广东东信智能科技有限公司
//EST-100多功能智能卡读写器
//照片原始数据示例
    char pic1024[1024*5]="111166888800111100FF85175151513E710DD564F335902D039CB4F2528DBAF0CC39213ED161D92FA5A926C853ECD2A1012F80DF523E1BC5256084DDADBE510C3A46E08DD31B3BC495A2DE1B7506FE57D4C27151AEDC5251515A3E9246D6C208748C2D3A5BCCE7451E57929F31522C75FDABEECBD6C8557372BF9181CE1EE460E1111FE8E77B1AA6902E1E41A28F479888839CA6BC73B4874295BFB7A6D839EADBF54D6C8E4AC63041D32A07045EDF136A8175A6F22A538A017293140904FC1111F3AAB75EC0404F58744D5FA8AD714F71573819625ED9EA15E715F4140035E337D55FAA0AA434D10F4542C5BCD80D526C1FE8AC62336BCDDB8A2BFDB29E33A96E287AD75983C11C24348D7B5779775E4B9D8F7A51111126ED5C1723B325F22B3ADB810A4D1111143D9F92FC23BECD204F8B76943F70A128C0E6AB07CB57FB2F61C4B45D6102D256E93AB59B5F228A58F33141825C6C617E5ADB2D186F7481D145A9167213FF450C5F1AE749344415B5CBD2DD608906DD30835D7D59F5BB1B5B80A38740E63AFFA6A4638B7426869B79FBA120EF925D9BFBC56918B79D9993D08DA9AD81171AD9F6357EF3F9549BE8088C08F30EFC160B85BA8A07EBBB9CB25DEAAAD7F3FB21444A0AD8ED6949499D01111029B06E040CFD84FC3D7C4847887BB993334FA0437624B0BE7C318AD02A73580A8029829760039986DA8BEA1192B502726391E9B598AD50D33FE917028716E1316098A24E64851E1568E410EC0BA1E6FC6605FB33894B02E48BA5BC30542DCF352F9836C3B7736C5D5BD2F12CB56436220111118B632908CA8336C4BE3A5CFDDD4B7C109BC5E983C3AE512A23F9BFB4C839491057CC502B2EB5D092EB9DCB2BA890D45AF3A9D9AC98888630963CB4F99A00D1E5C6C510F82055FFDCB3B69DCDFBBC3C8C766CDF59AF8EC68D95E1498C66796D6A686D511D3234990D9A22DF2213E7A06F3A60828F98824A15C350CF94B06B2E6FBD165D0CAA0897C4AC4F9783CB356814D52B8E4C11FB67287282F27777B1785AB0B22EF45BCD51C47D16F2A148DF57D1EDAFF71EBE481E6DC7DF495B562E899417BFD5FC8F43FDEA29B5250E5F275B62DD4E09FC06239D6AEA6CBF0075762E9FBA2AFC35F01BA9D2BA02878A78ED1767585170E990DD42FA0E1EF25E82BEFB3FE6BD5C394C3509EE70938119B284A45E67CAC44DC57ABE6711D60E7CB8B2A45A3EA6016C3DCE110A12A6AE51B03EAFF5665DB259D38F0F77B98DDFB476A55519E7680E2A797154416028888136F82DE0A516F8F49790145E9B0B46CB01E6A92218AE512393E8EFEE8126CF0401B34198125A3EC64EA738CF8820C5E22EACB3853A2CF2CEA7768F2B3B6147C8F424B89C92CCE20103839E0B6F6424022DEDE4C09D8A55D51111C6BCBD6D03A2E1769645A5248DBEFD9F0E02601234";

        unsigned char temp[300];
	unsigned char OutReport[2048];
	unsigned char Response_APDU[1024] = {0};
	int t_nCmdLen;
	unsigned char t_arrCmdRe[1024] = {0};
	char t_arrCmdSend[1024] = {0};
	t_nCmdLen = util_putHex2Char(pic1024, t_arrCmdSend, 0);
       unsigned char t_charTempEDZ[5 * 1024 * 1024] = {0} ;
       writePhoto(t_arrCmdSend, t_charTempEDZ, imagePath);
       return 0 ;
}
相关推荐
pk_xz12345639 分钟前
Shell 脚本中变量和字符串的入门介绍
linux·运维·服务器
小珑也要变强42 分钟前
Linux之sed命令详解
linux·运维·服务器
Lary_Rock3 小时前
RK3576 LINUX RKNN SDK 测试
linux·运维·服务器
云飞云共享云桌面5 小时前
8位机械工程师如何共享一台图形工作站算力?
linux·服务器·网络
Peter_chq5 小时前
【操作系统】基于环形队列的生产消费模型
linux·c语言·开发语言·c++·后端
一坨阿亮6 小时前
Linux 使用中的问题
linux·运维
dsywws7 小时前
Linux学习笔记之vim入门
linux·笔记·学习
幺零九零零8 小时前
【C++】socket套接字编程
linux·服务器·网络·c++
小林熬夜学编程9 小时前
【Linux系统编程】第四十一弹---线程深度解析:从地址空间到多线程实践
linux·c语言·开发语言·c++·算法
程思扬10 小时前
为什么Uptime+Kuma本地部署与远程使用是网站监控新选择?
linux·服务器·网络·经验分享·后端·网络协议·1024程序员节