1. 首页
  2. Foxit PDF SDK(Windows版)
  3. 如何对PDF进行加密(Java)
  1. 首页
  2. Foxit PDF SDK(Mac版)
  3. 如何对PDF进行加密(Java)
  1. 首页
  2. Foxit PDF SDK(Linux版)
  3. 如何对PDF进行加密(Java)

如何对PDF进行加密(Java)

Foxit PDF SDK提供了一系列加密和解密功能,以满足不同级别的文档安全保护。用户可以使用常规密码加密和证书驱动加密,或使用自己的安全处理机制来自定义安全实现。另外,Foxit PDF SDK还提供了APIs用于集成第三方安全技术 (Microsoft RMS),允许开发人员使用Microsoft RMS SDK加密和解密PDF文档。

备注有关RMS加密和解密更详细的信息,请参考SDK包中 “\examples\simple_demo” 文件夹下的 security demo

Example:

如何使用证书加密PDF文件

import com.foxit.sdk.pdf.CertificateEncryptData;
import com.foxit.sdk.pdf.CertificateSecurityCallback;
import com.foxit.sdk.pdf.CertificateSecurityHandler;
import java.io.File;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.util.ArrayList;
import java.util.Random;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.util.Enumeration;
import java.security.Key;
import java.security.KeyStore;
import java.security.cert.CertificateFactory;
import javax.crypto.Cipher;
...
// Assuming PDFDoc doc has been loaded.
...

public static Key getPublicKey(String cerPath) {
    try {
        CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
        FileInputStream stream = new FileInputStream(cerPath);
        java.security.cert.Certificate certificate = certificateFactory.generateCertificate(stream);
        stream.close();
        return certificate.getPublicKey();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

private static byte[] cryptByKey(byte[] inputData, Key key, int opmode) {
    if (inputData == null) return null;
    // The max length of decrypted byte array: 128
    final int max_crypt_block = 128;
    try {
        Cipher cipher = Cipher.getInstance(key.getAlgorithm());
        cipher.init(opmode, key);
        int len = inputData.length;
        ByteArrayOutputStream stream = new ByteArrayOutputStream();
        int offSet = 0;
        byte[] data;
        // Decrypt data segment by segment
        while (len > offSet) {
              data = cipher.doFinal(inputData, offSet,
                     (len - offSet > max_crypt_block) ? max_crypt_block : (len - offSet));
              stream.write(data, 0, data.length);
              offSet += max_crypt_block;
        }
        byte[] outputData = stream.toByteArray();
        stream.close();
        return outputData;
    } catch (Exception e) {
            e.printStackTrace();
      }
    return null;
}

public static byte[] encryptByKey(byte[] plainData, Key key) {
        return cryptByKey(plainData, key, Cipher.ENCRYPT_MODE);
}

public class CertificateSecurityEvent extends CertificateSecurityCallback {
    private String filePath;
    private String password;

    public CertificateSecurityEvent(String filePath, String password) {
        this.filePath = filePath;
        this.password = password;
    }
    
    @Override
    public void release() {}

    @Override
    public byte[] getDecryptionKey(byte[] arg0) {
        return CryptUtil.decryptByKey(arg0, CryptUtil.getPrivateKey(filePath, password));
    }
}

Random rand = new Random(23);
byte[] seed = new byte[24];
rand.nextBytes(seed);
for (int i = 20; i < 24; i++) {
    seed[i] = (byte) 0xFF;
}

PDFDoc doc = new PDFDoc(input_file);
int error_code = doc.load(null);
if (error_code != e_ErrSuccess) {
    System.out.println("The Doc " + input_file + " Error: " + error_code);
    return;
}

// Do encryption.
String cert_file_path = input_path + "foxit.cer";
ArrayList<byte[]> envelopes = new ArrayList<byte[]>();
byte[] bytes=null;
try {
    bytes = CryptUtil.encryptByKey(seed, CryptUtil.getPublicKey(cert_file_path));
    envelopes.add(bytes);
} catch (Exception e) {
  System.out.println("[Failed] Cannot get certificate information from " + cert_file_path);
  return;
}
byte[] data=new byte[20+bytes.length];
System.arraycopy(seed, 0, data, 0, 20);
System.arraycopy(bytes, 0, data, 20, bytes.length);
MessageDigest messageDigest = MessageDigest.getInstance("SHA1");  
messageDigest.update(data);  
byte[] initial_key = new byte[16];
System.arraycopy(messageDigest.digest(),0,initial_key,0,16);  
CertificateSecurityHandler handler = new CertificateSecurityHandler();
CertificateEncryptData encrypt_data = new CertificateEncryptData(true, SecurityHandler.e_CipherAES, envelopes);
handler.initialize(encrypt_data, initial_key);

doc.setSecurityHandler(handler);
String output_file = output_directory + "certificate_encrypt.pdf";
doc.saveAs(output_file, PDFDoc.e_SaveFlagNoOriginal);
...

如何使用Foxit DRM加密PDF文件

import com.foxit.sdk.pdf.DRMSecurityCallback;
import com.foxit.sdk.pdf.PDFDoc;
import com.foxit.sdk.pdf.SecurityHandler;
...

public class DRMSecurityEvent extends DRMSecurityCallback {
    private String fileID;
    private byte[] initialKey;

    public DRMSecurityEvent(String fileID, byte[] initialKey) {
        this.fileID = fileID;
        this.initialKey = initialKey;
    }

    @Override
    public void release() {}
    
    @Override
    public int getCipherType(PDFDoc arg0, String arg1) {
        return SecurityHandler.e_CipherAES;
    }

    @Override
    public String getFileID(PDFDoc arg0, String arg1) {
        return fileID;
    }

    @Override
    public byte[] getInitialKey(PDFDoc arg0, String arg1) {
        return initialKey;
    }

    @Override
    public int getKeyLength(PDFDoc arg0, String arg1) {
        return 16;
    }

    @Override
    public int getUserPermissions(PDFDoc arg0, String arg1) {
        return 0xFFFFFFFC;
    }

    @Override
    public boolean isOwner(PDFDoc arg0, String arg1) {
        return true;
    }

}

PDFDoc doc = new PDFDoc(input_file);
int error_code = doc.load(null);
if (error_code != e_ErrSuccess) {
    return;
}

// Do encryption.
DRMSecurityHandler handler = new DRMSecurityHandler();
String file_id = "Simple-DRM-file-ID";
String initialize_key = "Simple-DRM-initialize-key";
DRMEncryptData encrypt_data = new DRMEncryptData(true, "Simple-DRM-filter", SecurityHandler.e_CipherAES, 16, true, 0xfffffffc);
handler.initialize(encrypt_data, file_id, initialize_key);
doc.setSecurityHandler(handler);

String output_file = output_directory + "foxit_drm_encrypt.pdf";
doc.saveAs(output_file, PDFDoc.e_SaveFlagNoOriginal);
...
更新于 2020年4月22日

这篇文章有用吗?

相关文章