使用GPG加密文件的Perl脚本无效

时间:2016-09-13 14:15:30

标签: windows perl encryption gnupg pgp

我们目前在旧的Windows服务器(Windows Server 2003)上运行的作业需要移动到新的服务器,因为旧的服务器很快就会退役。此作业作为Windows计划任务运行,该任务以频繁的间隔运行,调用Perl脚本,使用供应商的公钥加密某些文件,并将加密的文件上载到供应商的外部FTP站点。

我是一名自学成才的程序员/开发人员/工程师,他不熟悉Perl,但我一直负责这项工作。

以下是我采取的步骤:

  1. 使用Strawberryperl.com的Windows二进制文件安装Perl(Strawberry Perl)
  2. 使用www.gnugp.com
  3. 中的exe安装GPG
  4. 将GPG可执行文件的路径添加到Windows环境变量“PATH”,以便可以从命令提示符下以“gpg”身份运行。
  5. 使用命令gpg --import [path to the key file]
  6. 将供应商的公钥添加到GPG
  7. 增加对导入密钥的信任,以防止每次使用命令时受到质疑:

    gpg –-edit-key [name of Prudential’s key] trust 5 y

  8. 然后我接受了现有的脚本,对文件路径等一些常量进行了一些更改,注释掉了FTP文件的命令(因为我此时只是运行一个临时测试)并且试图运行它来加密一些示例文件。该脚本成功运行完成,但由于文件加密的命令结果而生成了友好的错误消息。

    以下是加密发生的脚本部分:

    sub encrypt_outgoing_files {
    
        # open outgoing decrypted directory
        &message(sprintf("CD: %s\n", $out_dec_path), 0);
        if (opendir(OUT_DEC_DIR, $out_dec_path)) {
    
            # check for new files
            &message("Checking for new files\n", 0);
            my $file;
            my $new_flag;
            my %files_hash;
            foreach $file (readdir(OUT_DEC_DIR)) {
                if (-f $out_dec_path . $file) {
                    $files_hash{$file} = (stat($out_dec_path . $file))[9];              
                }       
            }
            my @files = sort { $files_hash{$a} cmp $files_hash{$b} } keys %files_hash; # sort by mtime
            foreach $file (@files) {
                if (-f $out_dec_path . $file) {
                    $new_flag = 1;                                              
    
                    # rename and encrypt this file
                    my $out_file = $file;
                    $out_file =~ s/\.?[0-9]+$//i; # rename outbound files according to this regex
                    &message(sprintf("Encrypting: %s (%s)\n", $file, $out_file), 1);                
                    if (!system(sprintf("%s -e \"print('%s')\" | %s --batch --passphrase-fd 0 --output %s --local-user %s --recipient %s --sign --encrypt --cipher-algo %s %s >NUL 2>&1", $perl_path, $pgp_passphrase, $pgp_exe_path, $out_enc_path . $out_file . $pgp_extension, $pgp_sender, $pgp_recipient, $pgp_cipher, $out_dec_path . $file))) {
    
                        # archive decrypted original
                        &message("Archiving decrypted version\n", 0);
                        rename($out_dec_path . $file, $out_dec_path . $archive_dir . $file);
                    }
    
                    # error encrypting this file
                    else {
                        unlink($out_enc_path . $out_file . $pgp_extension); # delete partially encrypted file (just in case)
                        &message("Error encrypting file (will try again next time around)\n", 1);
                    }
                }
            }
    
            # nothing new
            if (!defined($new_flag)) {
                &message("None found\n", 0);
            }
    
            # close directory
            closedir(OUT_DEC_DIR);
    
            # clean archive
            &message(sprintf("CD: %s\n", $out_dec_path . $archive_dir), 0);
            &clean_dir($out_dec_path . $archive_dir, $max_archive_age);
        }
    
        # invalid directory
        else {
            &message(sprintf("Directory not found: %s\n", $out_dec_path), 2);
        }
    }
    

    对于每个文件,我都会收到“错误加密文件(下次会再次尝试)”消息。

    但是,如果我尝试使用命令提示符单独使用GPG加密其中一个文件,则文件已成功加密。

    所以,我有三个问题:

    1. 有没有人知道可能导致错误的原因是什么?
    2. 如何找出错误原因?
    3. 有没有“更好”的方法来完成这项任务,因为这个脚本最初写于十多年前?该脚本现在将在运行IIS,Java和ColdFusion的Windows 2012虚拟机上运行。

1 个答案:

答案 0 :(得分:-1)

我发现困难的一件事是您用来导入密钥的任何帐户,您还必须使用与密钥相关的任何其他任务。试着调查那个