使用Java的非对称文件加密



我有一个包含公钥和私钥的PFX文件,我想使用这些键在我的计算机上本地加密和解密文件。那是我的代码:

public static void encryptFile(File file, PublicKey key,
        String transformation) throws NoSuchAlgorithmException,
        NoSuchPaddingException, InvalidKeyException, IOException,
        InvalidAlgorithmParameterException, NoSuchProviderException {
    Cipher c = Cipher.getInstance(transformation, "SunJCE");
    byte[] iv = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
    IvParameterSpec ivspec = new IvParameterSpec(iv);
    SecretKeySpec secretKeySpec = new SecretKeySpec(keyb, "AES");
    c.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivspec);
    FileInputStream is = new FileInputStream(file);
    CipherOutputStream os = new CipherOutputStream(new FileOutputStream(
            new File(file.getName() + "_enc")), c);
    copy(is, os);
}
public static void decryptFile(File encryptedFile, File decryptedFile,
        Key privateKey, String transformation) {
    try {
        Cipher c = Cipher.getInstance(transformation, "SunJCE");
        byte[] iv = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
        IvParameterSpec ivspec = new IvParameterSpec(iv);
        byte[] keyb = privateKey.getEncoded();
        SecretKeySpec secretKeySpec = new SecretKeySpec(keyb, "AES");
        c.init(Cipher.DECRYPT_MODE, secretKeySpec, ivspec);
        CipherInputStream is = new CipherInputStream(new FileInputStream(
                encryptedFile), c);
        FileOutputStream os = new FileOutputStream(decryptedFile);
        copy(is, os);
    } catch (Exception e) {
        e.printStackTrace();
    }
}
public static void copy(InputStream is, OutputStream os) {
    try {
        byte[] buf = new byte[1024];
        long total = 0;
        while (true) {
            int r = is.read(buf);
            if (r == -1) {
                break;
            }
            os.write(buf, 0, r);
            total += r;
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        try {
            is.close();
            os.flush();
            os.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}

我这样称呼:

            CertificateHandler.encryptFile(new File("test.pdf"), pb, "AES/CBC/PKCS5Padding");
        CertificateHandler.decryptFile(new File("test.pdf_enc"), new File("test.enc.pdf"), pk, "AES/CBC/NoPadding");

但是我得到了这个错误:

java.security.InvalidKeyException: Invalid AES key length: 294 bytes

我使用了无限的JCE政策,但没有任何改变。当我尝试使用消化键时,我认为它不起作用,因为它剪切的钥匙且不再有效

任何建议?

要正确执行加密,您缺少一些细节。

AES是一种对称密码,以128、192或256位的密钥大小为对称密码。您不能仅使用任何加密方案使用RSA私钥。

对于使用RSA密钥,只需搜索网络,例如http://www.java2s.com/code/code/android/security/rsaencryptdecryptdecryptfunctionrrsaecbpkcs1padding.htm

通常如何完成更长的内容(文件(的加密:

(请注意有多种选项或模式,我在这里写的是一个简单的建议(

加密:

  1. 生成一个随机AES密钥(128位会做(和nonce(iv( - 因为iv不使用固定向量,因为它在您的代码中
  2. 使用RSA加密生成的密钥(例如RSA/ECB/PKCS1PADDING(
  3. 计算内容的摘要(Hash((SHA-256(
  4. 到输出流写入加密的AES密钥,IV,摘要和加密内容(AES/CBC/PKCS5PADDING(。

解密

  1. 从流中读取AES密钥,nonce和Digest
  2. 用您的RSA私钥解密钥匙
  3. 阅读并解密内容
  4. 计算解密内容的摘要,并将其与已经读取的哈希进行比较,如果它们不匹配
  5. ,则会失败

看起来很复杂,但是跳过这些步骤中的任何一个可能(通常会(会导致加密被打破。即使这些步骤也需要具有一些属性(固定的执行时间等,但是要开始,您应该可以(。

相关内容

  • 没有找到相关文章

最新更新