首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >加载由blenc加密的页(C和PHP代码)时出错

加载由blenc加密的页(C和PHP代码)时出错
EN

Stack Overflow用户
提问于 2016-01-04 20:05:23
回答 1查看 846关注 0票数 4

当我在web服务器中加载以前用BLENC加密的页面时,如下所示:

代码语言:javascript
复制
Severity: Warning
Message: blenc_compile: Validation of script 'path\to\file\R2k_Controller.php' failed. MD5_FILE: 3f6958c4bee8ba0d4cb3a0e67e0e2bde MD5_CALC: 02998505e69466a2f7f3af5d4555a352

Severity: Error
Message: blenc_compile: Validation of script 'path\to\file\R2k_Controller.php' failed, cannot execute.

使用:

  • PHP5.6.14 x64 NTS
  • Blenc 1.1.4b
  • IIS 7.5

这是我加密的代码:

代码语言:javascript
复制
$oDir = NULL;
if(PHP_SAPI === 'cli'){
    $path   = $argv[1];
   $path2  = '';
    if(count($argv)>1){
        $oDir = new RecDir($path,false);
        while (false !== ($archivo = $oDir->read())) {
         if(strstr($archivo,".php") !== FALSE){
            $path2=substr_replace($archivo,$path,strpos($archivo,$path),strlen($path));
            $source_code = file_get_contents($path2);
            blenc_encrypt($source_code, $argv[2] . $path2,$FKEY);
            echo($archivo . " >>> " . $argv[2] . $path2 . PHP_EOL);
         }
        }
        $oDir->close();
      file_put_contents( $argv[2] ."blenc.key_file", $FKEY."\n"); //, FILE_APPEND
    }
   else{
      echo("Error: parametos incorrectos" . PHP_EOL);
   }
}
else{
    echo("<html><head>Error</head><body>Acceso denegado!</body></html>");
}

我怎么才能解决这个问题?

编辑

检查存储库中的blenc --我发现

代码语言:javascript
复制
for (zend_hash_internal_pointer_reset(php_bl_keys);
         zend_hash_get_current_data(php_bl_keys, (void **)&key) == SUCCESS;
         zend_hash_move_forward(php_bl_keys)) {

        decoded = php_blenc_decode(encoded, *key, script_len - sizeof(blenc_header), &decoded_len TSRMLS_CC);

        md5 = emalloc(33);
        php_blenc_make_md5(md5, decoded, decoded_len TSRMLS_CC);

        if(!strncmp(md5, header->md5, 32)) {

            validated = TRUE;
            efree(md5);
            break;

        }

        zend_error(E_WARNING, "blenc_compile: Validation of script '%s' failed. MD5_FILE: %s MD5_CALC: %s\n",
                                file_handle->filename, header->md5, md5);

        efree(md5);
        md5 = NULL;

        efree(decoded);
        decoded_len = 0;

    }

static void php_blenc_make_md5(char *result, void *data, unsigned int data_len TSRMLS_DC)
{
    PHP_MD5_CTX   context;
    unsigned char digest[16];

    PHP_MD5Init(&context);
    PHP_MD5Update(&context, data, data_len);
    PHP_MD5Final(digest, &context);

    make_digest(result, digest);

}

b_byte *php_blenc_decode(void *input, unsigned char *key, int in_len, int *out_len TSRMLS_DC)
{   
    BLOWFISH_CTX ctx;
    unsigned long hi, low;
    int i;
    b_byte *retval;

    Blowfish_Init (&ctx, (unsigned char*)key, strlen(key));

    if(in_len % 8) {

        zend_error(E_WARNING, "Attempted to decode non-blenc encrytped file.");
        return estrdup("");

    } else {

        retval = emalloc(in_len + 1);

    }

    memset(retval, '\0', sizeof(retval));

    hi = 0x0L;
    low = 0x0L;

    for(i = 0; i < in_len; i+=8) {

        hi |= (unsigned int)((char *)input)[i] & 0xFF;
        hi = hi << 8;
        hi |= (unsigned int)((char *)input)[i+1] & 0xFF;
        hi = hi << 8;
        hi |= (unsigned int)((char *)input)[i+2] & 0xFF;
        hi = hi << 8;
        hi |= (unsigned int)((char *)input)[i+3] & 0xFF;

        low |= (unsigned int)((char *)input)[i+4] & 0xFF;
        low = low << 8;
        low |= (unsigned int)((char *)input)[i+5] & 0xFF;
        low = low << 8;
        low |= (unsigned int)((char *)input)[i+6] & 0xFF;
        low = low << 8;
        low |= (unsigned int)((char *)input)[i+7] & 0xFF;

        Blowfish_Decrypt(&ctx, &hi, &low);

        retval[i] = hi >> 24;
        retval[i+1] = hi >> 16;
        retval[i+2] = hi >> 8;
        retval[i+3] = hi;
        retval[i+4] = low >> 24;
        retval[i+5] = low >> 16;
        retval[i+6] = low >> 8;
        retval[i+7] = low;

        hi = 0x0L;
        low = 0x0L;

    }

    retval[in_len] = '\0';
    *out_len = strlen(retval);

    return retval;
}

谁能解释这里发生了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-13 05:45:58

问题是您没有将适当的内容放入您的blenc.key_file中。

加密()解释说,它返回一个必须保存到密钥文件中的可再分发密钥。这不是传递给$encryption_key来加密代码的blenc_encrypt()。它是用于允许blenc解密代码以便运行的密钥。

在您的代码中,您正在调用blenc_encrypt(),而不是保存它返回的可再发行密钥。然后将加密密钥附加到密钥文件中,这是不正确的。

相反,你需要做的是:

代码语言:javascript
复制
$oDir = NULL;
if(PHP_SAPI === 'cli'){
    $path   = $argv[1];
    $path2  = '';
    if(count($argv)>1){
        $oDir = new RecDir($path,false);
        while (false !== ($archivo = $oDir->read())) {
         if(strstr($archivo,".php") !== FALSE){
            $path2=substr_replace($archivo,$path,strpos($archivo,$path),strlen($path));
            $source_code = file_get_contents($path2);

            // Save $redistributable_key and save it to the key file
            $redistributable_key =  blenc_encrypt($source_code, $argv[2] . $path2,$FKEY);
            file_put_contents($argv[2] . "blenc.key_file", $redistributable_key . "\n", FILE_APPEND);

            echo($archivo . " >>> " . $argv[2] . $path2 . PHP_EOL);
         }
        }
        $oDir->close();
    }
   else{
      echo("Error: parametos incorrectos" . PHP_EOL);
   }
}
else{
    echo("<html><head>Error</head><body>Acceso denegado!</body></html>");
}

然后,您需要确保生成的blenc.key_file的内容包含在文件 ini指令指定的文件中。

一旦您这样做,您的加密文件应该正确地加载到您的web服务器。然后,您可以将加密的文件和blenc.key_file分发给客户。

您在编辑中包含的C代码是blenc解密引擎的一部分。第一部分是blenc_compile()的主循环,它接受一个文件,对其进行解码,并(如果成功)将其传递给Zend进行编译。后两个函数只是用于生成MD5摘要和驱动实际的Blowfish解密的工具。对这些问题的充分理解是相当复杂的,不需要理解和解决问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34598949

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档