当前位置: 首页 > 工具软件 > Botan > 使用案例 >

windows下使用Botan的奇怪问题[已解决]

宗政权
2023-12-01

最近要移植一个linux的程序到windows,其中字符编码各种坑先不去说,在linux运行得好好的Botan库在windows下死活不行,按说我们只用了这个库的一个小功能,移植应该不存在大问题,折腾了两天,才发现是编译的库不支持Debug造成的,改用Release问题马上就解决了。

一. 问题

程序用到了botan的 CryptoBox::decrypt 函数用来解密原先加密的字符串,linux下正常工作,在visual studio 2017里,一运行就抛异常,而且这个异常显得神秘而又诡异:

vector<T> too long

应该是在库内部运行之时出的错误,当时怀疑是不是字符编码的问题,因为这之前刚好改了好几个地方都是编码问题,难道这个错误也是因为字符字节数不一致导致长度计算问题?按这个方向越走越远,查了Botan库的源码,不得要领。

后来又想到是不是因为平台不同,原先linux下加密的密文和windows下不一致导致了解密过程的错误。于是,干脆做一个windows下的加密工具,本来这个加密是可以在linux下做的没有计划要移植。

这一做,发现加密的过程也出现了神秘的异常,调用 CryptoBox::encrypt 函数的异常:

PBKDF2 cannot accept passphrase of the given size

什么?因为给定的长度不接受密码短语,难道还是编码问题? 结果刚刚回头的人又被导向编码问题的方向……

后来差点要相信玄学去了的时候,想到botan-test.exe能够正常运行,说明botan是能够支持编码的,而且tests的源码也并没有什么特殊之处,按理直接移植过来就OK了的。就干脆把tests项目导入到vs2017,结果让人捉摸不透的异常依旧存在。

二. 转机

后来实在是不愿意相信玄学,就到处看看其它和Botan相关的问题,看看别人都踩过什么坑,无意中看到这篇文章,我引用一下:

Botan在visual studio 2010下无法正常运行 [问题点数:40分]

    第一次发帖向各位有心人进行求助。因为项目需要对一些数据进行加密解密所以就选择了Botan这个包含加解密算法库。去官方网站下载Botan源码,对其进行编译生成 头文件,botan.lib,botan.dll文件,将其进行导入测试,问题随之出现

测试代码只有以下一句话

Botan::LibraryInitializer init;//库的初始化操作,库中的操作依赖该对象的生命周期

当程序执行到此处的时候,会发生中断
提示信息
“botan32.exe 中的 0x770115ee 处有未经处理的异常: 0xC0000005: 读取位置 0x001e0000 时发生访问冲突”

跟踪进去进入函数
void * __cdecl _malloc_base (size_t size)
{
    void *res = NULL;

    //  validate size
    if (size <= _HEAP_MAXREQ) {
        for (;;) {

            //  allocate memory block
            res = _heap_alloc(size);   //此处发生中断

            //  if successful allocation, return pointer to memory
            //  if new handling turned off altogether, return NULL

            if (res != NULL)
            {
                break;
            }
            if (_newmode == 0)
            {
                errno = ENOMEM;
                break;
            }

            //  call installed new handler
            if (!_callnewh(size))
                break;

            //  new handler was successful -- try to allocate again
        }
    } else {
        _callnewh(size);
        errno = ENOMEM;
        return NULL;
    }

    RTCCALLBACK(_RTC_Allocate_hook, (res, size, 0));
    if (res == NULL)
    {
        errno = ENOMEM;
    }
    return res;
}
或者
void __cdecl _free_base (void * pBlock)
{

        int retval = 0;


        if (pBlock == NULL)
            return;

        RTCCALLBACK(_RTC_Free_hook, (pBlock, 0));

        retval = HeapFree(_crtheap, 0, pBlock);  //此处发生中断
        if (retval == 0)
        {
            errno = _get_errno_from_oserr(GetLastError());
        }
}


运行环境是WIN 7 64位,visual studio 2010,本人换过好几个botan的版本包括32位,64位的都出现类似的问题,望有心人能够帮助我进行问题的解决,或者是提供一套能够运行Boton的环境,不胜感激!

虽然问题看来不是很相关,因为前面折腾时也时常遇到访问冲突,调试过程发现是读取越界,所以就继续往下看:

该问题导致的原因已经找到,跟踪进入botan 编译配置脚本发现有    
build_group.add_option('--enable-debug', dest='debug_build',
                           action='store_true', default=False,
                           help='enable debug build')
而问题导致的原因就是我在进行编译配置的时候没有指定--enable-debug,而默认的配置是--disable-debug,编译出来的库是release版本,而我进行测试的时候工程一直是debug版本导致出现了问题,希望能给遇到同样问题的同学提供一点帮助。

楼主 pullus_1st 的一番话立即引起了注意。原来如此!

马上把移植的项目切换到Release编译,OK!

三. 编译debug模式的Botan库

参考 https://blog.csdn.net/found/article/details/88988593 《在windows下编译Botan》

2. 安装python,如果没有的话,然后运行configure.py中的命令加上 --debug-mode 选项就好了:

python configure.py --cc=msvc --os=windows --cpu=x86_32 --debug-mode

https://github.com/randombit/botan/issues/136从这里看起来连owner都不太清楚这个选项有什么用了

 类似资料: