Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/475.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用AES 256 CBC解密pdf文件会产生不可读的输出_Javascript_Php_Pdf_Aes_Pdfjs - Fatal编程技术网

Javascript 使用AES 256 CBC解密pdf文件会产生不可读的输出

Javascript 使用AES 256 CBC解密pdf文件会产生不可读的输出,javascript,php,pdf,aes,pdfjs,Javascript,Php,Pdf,Aes,Pdfjs,我有一些加密的PDF文件列表。单击每个pdf文件时,应使用AES 256 CBC对其进行解密并使用pdf.Js查看。我有以下代码(很抱歉,代码稍微长了一点,我在JSFIDLE中尝试过,但遇到了保存和附加加密和解密文件的问题): app.php index.html 函数加密(文件名){ $.ajax({ 类型:“POST”, url:“app.php”, 数据:{操作:'encrypt',文件名:filename} }).done(函数(msg){ 警报(“返回的数据:+msg”); })

我有一些加密的PDF文件列表。单击每个pdf文件时,应使用AES 256 CBC对其进行解密并使用pdf.Js查看。我有以下代码(很抱歉,代码稍微长了一点,我在JSFIDLE中尝试过,但遇到了保存和附加加密和解密文件的问题):

app.php


index.html


函数加密(文件名){
$.ajax({
类型:“POST”,
url:“app.php”,
数据:{操作:'encrypt',文件名:filename}
}).done(函数(msg){
警报(“返回的数据:+msg”);
});
返回false;
}
函数解密(文件名){
$.ajax({
类型:“POST”,
url:“app.php”,
数据:{操作:'decrypt',文件名:filename},
成功:功能(响应){
警报(响应);
showPdf(回应);
}
})
返回false;
}



PDF.js上一个/下一个示例 以前的 下一个 页码:/
test.js

var canvas=document.getElementById('can');
var context=canvas.getContext('2d');
var pdfDoc=null,
pageNum=1,
pageRendering=false,
pageNumPending=null,
比例=1.5;
函数呈现页面(num){
pageRendering=true;
//使用promise获取页面
pdfDoc.getPage(num).然后(函数(第页){
var viewport=page.getViewport({scale:scale});
canvas.height=viewport.height;
canvas.width=viewport.width;
//将PDF页面呈现到画布上下文中
var renderContext={
背景:背景,
视口:视口
};
var renderTask=page.render(renderContext);
//等待渲染完成
promise.then(函数(){
pageRendering=false;
如果(pageNumPending!==null){
//新页面呈现挂起
渲染页面(pageNumPending);
pageNumPending=null;
}
});
});
//更新页面计数器
document.getElementById('page_num')。textContent=num;
}
函数queueRenderPage(num){
如果(页面渲染){
pageNumPending=num;
}否则{
渲染页面(num);
}
}
函数onPrevPage(){
如果(pageNum=pdfDoc.numPages){
返回;
}
pageNum++;
queueRenderPage(pageNum);
}
document.getElementById('next')。addEventListener('click',onNext');
函数showPdf(pdfData){
//通过标签加载,创建访问PDF.js导出的快捷方式。
var pdfjsLib=window['pdfjs-dist/build/pdf'];
//应规定工人的财产。
pdfjsLib.GlobalWorkerOptions.workerSrc='./build/pdf.worker.js';
//使用DocumentInitParameters对象加载二进制数据。
var loadingTask=pdfjsLib.getDocument({data:pdfData});
loadingTask.promise.then(函数(pdf){
console.log('PDF-loaded');
pdfDoc=pdf;
//显示总页码。
document.getElementById('page_count')。textContent=pdf.numPages;
渲染页面(pageNum);
},功能(原因){
//PDF加载错误
控制台错误(原因);
});
}
我正在使用PDFJS(文档中的示例base64编码PDF)来显示PDF文件。
有些文件可以使用此功能(非常小的示例文件)。但对于其他pdf文件,加密文件的解密会产生字符串输出,其中一些文本无法读取(如� �*�AK����^����0)并使用pdf.js加载,但不显示。如果我将这个解密的输出保存在一个文件中并打开该文件,它将如预期的那样。只有PDFJS无法显示它。我没有得到确切的问题。问题是在解密还是PDFJS代码中?请提供帮助。

获得了解决方案,在base64中转换了解密文件结果,并在PDF.js中解码此base-64编码字符串。添加了以下代码:

app.php

test.js

函数showPdf(pdfData){
//通过标签加载,创建访问PDF.js导出的快捷方式。
var pdfjsLib=window['pdfjs-dist/build/pdf'];
//应规定工人的财产。
pdfjsLib.GlobalWorkerOptions.workerSrc='./build/pdf.worker.js';
//使用DocumentInitParameters对象加载二进制数据。
var loadingTask=pdfjsLib.getDocument({data:atob(pdfData)});
loadingTask.promise.then(函数(pdf){
console.log('PDF-loaded');
pdfDoc=pdf;
//显示总页码。
document.getElementById('page_count')。textContent=pdf.numPages;
渲染页面(pageNum);
},功能(原因){
//PDF加载错误
控制台错误(原因);
});
}
谢谢大家!

<?php

if($_POST['action'] == 'encrypt') {
    my_encrypt($_POST['filename']);
}

if($_POST['action'] == 'decrypt') {
    $result = my_decrypt($_POST['filename']);
    echo $result;
}

function my_encrypt($filename) {
    
    $filedata = file_get_contents($filename);
    // Remove the base64 encoding from our key
    $key = '8479768f48481eeb9c8304ce0a58481eeb9c8304ce0a5e3cb5e3cb58479768f4';
    $encryption_key = base64_decode($key);
    // Generate an initialization vector
    $iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length('aes-256-cbc'));
    // Encrypt the data using AES 256 encryption in CBC mode using our encryption key and initialization vector.
    $encrypted = openssl_encrypt($filedata, 'aes-256-cbc', $encryption_key, 0, $iv);
    // The $iv is just as important as the key for decrypting, so save it with our encrypted data using a unique separator (::)
    $result =  base64_encode($encrypted . '::' . $iv);
    $file = fopen('./files/Sampleencrypt.pdf', 'wb');
    fwrite($file, $result);
    fclose($file);
    echo $result;
    return $result;
}

function my_decrypt($filename) {
    $filedata = file_get_contents($filename);
    // Remove the base64 encoding from our key
    $key = '8479768f48481eeb9c8304ce0a58481eeb9c8304ce0a5e3cb5e3cb58479768f4';
    $encryption_key = base64_decode($key);
    // To decrypt, split the encrypted data from our IV - our unique separator used was "::"
    list($encrypted_data, $iv) = explode('::', base64_decode($filedata), 2);
    $result = openssl_decrypt($encrypted_data, 'aes-256-cbc', $encryption_key, 0, $iv);

    return $result;
}
?>
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <title></title>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
    <script src="build/pdf.js"></script>
    <link rel="stylesheet" href="style.css">

    <script>
        function encrypt(filename){
           
            $.ajax({
                type: "POST",
                url: "app.php",
                data: { action:'encrypt', filename: filename }
            }).done(function( msg ) {
                alert( "Data returned: " + msg );
            });

            return false;
        }

        function decrypt(filename){
            
           $.ajax({
               type: "POST",
               url: "app.php",
               data: { action:'decrypt', filename: filename },
               success: function (response) {
                alert(response);
                showPdf(response);
                }
            })
           return false;
       }
    </script>
</head>
<body>
    
    <a href="./files/Sampleencrypt.pdf" onclick="return decrypt(this.href);">Decrypt Sample</a> </br>
    <a href="./files/A Sample PDF.pdf" onclick="return encrypt(this.href);">Encrypt Sample</a><br>
    <br>
    
    <h1>PDF.js Previous/Next example</h1>
    <div>
      <button id="prev">Previous</button>
      <button id="next">Next</button>
      &nbsp; &nbsp;
      <span>Page: <span id="page_num"></span> / <span id="page_count"></span></span>
    </div>
    <div>
        <canvas id="can"></canvas>
    </div>
    <script type="text/javascript" src="test.js"></script>
</body>
</html>
var canvas = document.getElementById('can');
var context = canvas.getContext('2d');

var pdfDoc = null,
  pageNum = 1,
  pageRendering = false,
  pageNumPending = null,
  scale = 1.5;

  function renderPage(num) {
    pageRendering = true;
    // Using promise to fetch the page
    pdfDoc.getPage(num).then(function(page) {
      var viewport = page.getViewport({scale: scale});
      canvas.height = viewport.height;
      canvas.width = viewport.width;
  
      // Render PDF page into canvas context
      var renderContext = {
        canvasContext: context,
        viewport: viewport
      };
      var renderTask = page.render(renderContext);
  
      // Wait for rendering to finish
      renderTask.promise.then(function() {
        pageRendering = false;
        if (pageNumPending !== null) {
          // New page rendering is pending
          renderPage(pageNumPending);
          pageNumPending = null;
        }
      });
    });
  
    // Update page counters
    document.getElementById('page_num').textContent = num;
  }

function queueRenderPage(num) {
    if (pageRendering) {
      pageNumPending = num;
    } else {
      renderPage(num);
    }
  }
  
  function onPrevPage() {
    if (pageNum <= 1) {
      return;
    }
    pageNum--;
    queueRenderPage(pageNum);
  }
  document.getElementById('prev').addEventListener('click', onPrevPage);
  
  function onNextPage() {
    if (pageNum >= pdfDoc.numPages) {
      return;
    }
    pageNum++;
    queueRenderPage(pageNum);
  }
  document.getElementById('next').addEventListener('click', onNextPage);


function showPdf(pdfData){
      // Loaded via <script> tag, create shortcut to access PDF.js exports.
      var pdfjsLib = window['pdfjs-dist/build/pdf'];
      
      // The workerSrc property shall be specified.
      pdfjsLib.GlobalWorkerOptions.workerSrc = './build/pdf.worker.js';
      
      // Using DocumentInitParameters object to load binary data.
      var loadingTask = pdfjsLib.getDocument({data: pdfData});
      loadingTask.promise.then(function(pdf) {
        console.log('PDF loaded');
        
        pdfDoc = pdf;
        //display total page number.
        document.getElementById('page_count').textContent = pdf.numPages;

        renderPage(pageNum);
      }, function (reason) {
        // PDF loading error
        console.error(reason);
      });

}
    function my_decrypt($filename) {
    $filedata = file_get_contents($filename);
    // Remove the base64 encoding from our key
    $key = '8479768f48481eeb9c8304ce0a58481eeb9c8304ce0a5e3cb5e3cb58479768f4';
    $encryption_key = base64_decode($key);
    // To decrypt, split the encrypted data from our IV - our unique separator used was "::"
    list($encrypted_data, $iv) = explode('::', base64_decode($filedata), 2);
    $result = openssl_decrypt($encrypted_data, 'aes-256-cbc', $encryption_key, 0, $iv);
    $result =  base64_encode($result);
    return $result;
}
    function showPdf(pdfData){
    
      // Loaded via <script> tag, create shortcut to access PDF.js exports.
      var pdfjsLib = window['pdfjs-dist/build/pdf'];
      
      // The workerSrc property shall be specified.
      pdfjsLib.GlobalWorkerOptions.workerSrc = './build/pdf.worker.js';
      
      // Using DocumentInitParameters object to load binary data.
      var loadingTask = pdfjsLib.getDocument({data: atob(pdfData)});
      loadingTask.promise.then(function(pdf) {
        console.log('PDF loaded');
        
        pdfDoc = pdf;
        //display total page number.
        document.getElementById('page_count').textContent = pdf.numPages;

        renderPage(pageNum);
      }, function (reason) {
        // PDF loading error
        console.error(reason);
      });

}