Javascript 使用AES 256 CBC解密pdf文件会产生不可读的输出
我有一些加密的PDF文件列表。单击每个pdf文件时,应使用AES 256 CBC对其进行解密并使用pdf.Js查看。我有以下代码(很抱歉,代码稍微长了一点,我在JSFIDLE中尝试过,但遇到了保存和附加加密和解密文件的问题): app.phpJavascript 使用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”); })
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>
<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);
});
}