用perl识别加密Word文档

用perl识别加密Word文档,perl,encryption,ms-word,Perl,Encryption,Ms Word,我有一系列Word文档,需要密码才能解码,并且希望能够在一系列未加密的Word文档中识别它们是否具有密码 我遵循了stackoverflow链接提供的大部分指导: 以下是我当前使用的代码: sub _is_encrypted_doc { my ($data) = @_; if (_is_office_doc($data)) { if ($data =~ /(?:<encryption xmlns)/i) { return 1; }

我有一系列Word文档,需要密码才能解码,并且希望能够在一系列未加密的Word文档中识别它们是否具有密码

我遵循了stackoverflow链接提供的大部分指导:

以下是我当前使用的代码:

 sub _is_encrypted_doc {
   my ($data) = @_;

 if (_is_office_doc($data)) {
     if ($data =~ /(?:<encryption xmlns)/i) {
       return 1;
     }
     if (index($data, "\x13") == 523) {
       return 1;
     }
     if (index($data, "\x2f") == 532) {
       return 1;
     }
     if (index($data, "\xfe") == 520) {
       return 1;
     }
     my $tdata = substr $data, 2000;
     $tdata =~ s/\\0/ /g;
     if (index($tdata, "E n c r y p t e d P a c k a g e") > -1) {
       return 1;
     }
   }
 }
sub\u是加密的\u文档{
我的($数据)=@;
如果(_是_办公室_文件($data)){
如果($data=~/(?:-1){
返回1;
}
}
}
但是,我的代码似乎没有识别我们收到的所有变体。我在这里上传了一个这样的文件:


使用“NZlttUtz”解码。我在这方面比较新,所以我希望有人能在这里指导我。已经有更全面的代码可以做这件事了吗?

据我在您参考的链接中看到的,通常以ÐÏ前缀开头的文件是受保护的,我没有找到任何以该前缀开头的未受保护的word文档。因此,除非您需要区分Excel和Word以及文档的版本(通过文件ext可以更好地处理),您可以简单地测试以Ð开头的文件

use Fcntl qw(:seek);

my($fh, $FILE, $byte_position, $byte_value);

$FILE      = "path/to/file";
$byte_position = 0;

open($fh, "<", $FILE)
  || die "can't open $FILE: $!";

binmode($fh)
  || die "can't binmode $FILE";

sysseek($fh, $byte_position, SEEK_CUR)  # NB: 0-based
  || die "couldn't see to byte $byte_position in $FILE: $!";

sysread($fh, $byte_value, 1) == 1
  || die "couldn't read byte from $FILE: $!";

if (ord($byte_value) == 208){
  return 1;
}
else {
  return 0;
}
使用Fcntl qw(:seek);
我的($fh,$FILE,$byte\u位置,$byte\u值);
$FILE=“path/to/FILE”;
$byte_位置=0;

开放式($fh),"
\u is _office _doc
是什么?因为你的文件包含
你能告诉我你用什么方法读取文件来确定它包含
xxd g9kfak164.docx | less
那么问题又来了。
\u is _office _doc
方法做了什么?我已经上传了完整的代码,我相信这个问题e带有用于检测这些文件的标记,对于这些强加密word文档来说不再准确。非常感谢您的帮助。我想您的意思是
如果($data eq 208){
?它打印的
参数“”在数值eq(=)中不是数字
。它也从不等于208,总是只返回0。其他想法?这对我来说仍然不起作用:-(它总是在循环中为文件中的每个字符返回0。打印$data显示它确实是“”(零),但它从不匹配…好的。那么让我们尝试另一种方法。(答案编辑)