gpt4 book ai didi

java - 在 Android 中加密和解密 zip 文件?

转载 作者:行者123 更新时间:2023-12-01 15:25:29 27 4
gpt4 key购买 nike

我正在使用此代码:http://examples.javacodegeeks.com/core-java/crypto/encrypt-decrypt-file-stream-with-des用于加密 Android 应用程序中使用的 zip 文件。当我使用 java 代码尝试它时,它与 zip 文件一起工作得非常好,但是当我在 Android 应用程序中尝试相同的方法时 - 它解密了文件,但我得到的文件已损坏并且无法打开它。

日志:

         04-19 10:58:25.711: W/System.err(6752): net.lingala.zip4j.exception.ZipException: zip headers not found. probably not a zip file
04-19 10:58:25.721: W/System.err(6752): at net.lingala.zip4j.core.HeaderReader.readEndOfCentralDirectoryRecord(HeaderReader.java:122)

当我尝试在 Windows 上使用 winzip 打开同一文件时,它会显示:

   Does not appear to be a valid archive file.

更新::

public class EncryptDecryptFileStreamWithDES {

private static Cipher ecipher;
private static Cipher dcipher;

// 8-byte initialization vector
private static byte[] iv = {
(byte)0xB2, (byte)0x12, (byte)0xD5, (byte)0xB2,
(byte)0x44, (byte)0x21, (byte)0xC3, (byte)0xC3
};

public static void call() {

try {

SecretKey key = KeyGenerator.getInstance("DES").generateKey();

AlgorithmParameterSpec paramSpec = new IvParameterSpec(iv);

ecipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
dcipher = Cipher.getInstance("DES/CBC/PKCS5Padding");

ecipher.init(Cipher.ENCRYPT_MODE, key, paramSpec);
dcipher.init(Cipher.DECRYPT_MODE, key, paramSpec);

// encrypt(new FileInputStream("C:\\Users\\Admin\\Desktop\\zipped\\4.zip"), new FileOutputStream("C:\\Users\\Admin\\Desktop\\zipped\\4.dat"));
// decrypt(new FileInputStream("C:\\Users\\Admin\\Desktop\\zipped\\4.dat"), new FileOutputStream("C:\\Users\\Admin\\Desktop\\zipped\\4new.zip"));

//}
//catch (FileNotFoundException e) {
//System.out.println("File Not Found:" + e.getMessage());
//return;
}
catch (InvalidAlgorithmParameterException e) {
System.out.println("Invalid Alogorithm Parameter:" + e.getMessage());
return;
}
catch (NoSuchAlgorithmException e) {
System.out.println("No Such Algorithm:" + e.getMessage());
return;
}
catch (NoSuchPaddingException e) {
System.out.println("No Such Padding:" + e.getMessage());
return;
}
catch (InvalidKeyException e) {
System.out.println("Invalid Key:" + e.getMessage());
return;
}

}

public static void encrypt(InputStream is, OutputStream os) {

try {

call();

byte[] buf = new byte[1024];

// bytes at this stream are first encoded
os = new CipherOutputStream(os, ecipher);

// read in the clear text and write to out to encrypt
int numRead = 0;
while ((numRead = is.read(buf)) >= 0) {
os.write(buf, 0, numRead);
}

// close all streams
os.close();

}
catch (IOException e) {
System.out.println("I/O Error:" + e.getMessage());
}

}

public static void decrypt(InputStream is, OutputStream os) {

try {

call();

byte[] buf = new byte[1024];

// bytes read from stream will be decrypted
CipherInputStream cis = new CipherInputStream(is, dcipher);

// read in the decrypted bytes and write the clear text to out
int numRead = 0;
while ((numRead = cis.read(buf)) > 0) {
os.write(buf, 0, numRead);
}

// close all streams
cis.close();
is.close();
os.close();

}
catch (IOException e) {
System.out.println("I/O Error:" + e.getMessage());
}

}

}

这是我正在使用的类:

最佳答案

问题是您使用不同的 key 来加密和解密文件:

1) 您从 EncryptDecryptFileStreamWithDES 之外的某个地方调用 encrypt(..),后者又调用您的 call() 方法,初始化新 key :

SecretKey key = KeyGenerator.getInstance("DES").generateKey();

2) 然后您调用 decrypt(..),它再次调用您的 call() 方法,您将获得新的 SecretKey

您使用的示例中不存在这样的问题,这些方法调用的顺序相反。要扩展此示例,您需要在调用 encrypt(..)decrypt(..) 之间保存 key ,然后使用以下命令初始化 SecretKeySpec存储的 key :

byte[] keyBytes = KeyGenerator.getInstance("AES").getEncoded();

...

SecretKeySpec skeySpec = new SecretKeySpec(keyBytes, "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.DECRYPT_MODE, skeySpec);

Here这是一个更现实的例子。

附注正如前面提到的,使用 DES 算法不是最好的主意,请使用 AES 代替。

关于java - 在 Android 中加密和解密 zip 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10222284/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com