基于Java的非对称文件加密
我有一个包含公钥和私钥的pfx文件,我想使用这些密钥在我的机器上本地加密和解密文件。 这是我的代码:基于Java的非对称文件加密,java,encryption,rsa,x509certificate,jce,Java,Encryption,Rsa,X509certificate,Jce,我有一个包含公钥和私钥的pfx文件,我想使用这些密钥在我的机器上本地加密和解密文件。 这是我的代码: public static void encryptFile(File file, PublicKey key, String transformation) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IOException, Inva
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密钥,只需搜索网络即可 通常情况下,较长内容(文件)的加密方式为: (请注意有多种选择或模式,我在这里写的只是一个简单的建议) 加密: