使用Java在Android上解密OpenSSL加密的文件 [英] Decrypting OpenSSL-encrypted file on Android with Java
问题描述
我目前正在尝试在Android应用上实现文件解密.
I'm currently trying to implement file decryption on my Android app.
该文件将在主机(Linux)上使用类似以下方式进行加密:
The file will be encrypted on host(Linux) using something like :
openssl aes-128-ecb -salt -k $HASH -in somefile.in -out somefile
openssl aes-256-cbc -salt -K $HASH -iv $IV -md sha1 -in somefile.in -out somefile
openssl aes-256-cbc -d -salt -K $HASH -md sha1 -in somefile.in -out somefile
问题是,我无法获得这些组合中的任何一个(128/256,ecb/cbc,salt/nosalt,-K/-k,-md/none),无法在Android上正确解密.
The problem is that, I CANNOT get any of these combinations(128/256, ecb/cbc, salt/nosalt, -K/-k, -md/none) to properly decrypt on Android.
它要么完全解密(损坏),要么抛出异常.
It either decrypts completely wrong(corrupted), or throws an exception.
Exception at decryptAES
java.io.IOException: Error while finalizing cipher
at javax.crypto.CipherInputStream.fillBuffer(CipherInputStream.java:104)
at javax.crypto.CipherInputStream.read(CipherInputStream.java:155)
at java.io.InputStream.read(InputStream.java:162)
at com.temp.temp.CryptographyHelper.decryptAES(CryptographyHelper.java:58)
at com.temp.temp.MainActivity.__prepFirstLaunch(MainActivity.java:229)
at com.temp.temp.MainActivity.prepFirstLaunch(MainActivity.java:192)
at com.temp.temp.MainActivity$prepthread.run(MainActivity.java:42)
Caused by: javax.crypto.BadPaddingException: EVP_CipherFinal_ex
at com.android.org.conscrypt.NativeCrypto.EVP_CipherFinal_ex(Native Method)
at com.android.org.conscrypt.OpenSSLCipher.doFinalInternal(OpenSSLCipher.java:430)
at com.android.org.conscrypt.OpenSSLCipher.engineDoFinal(OpenSSLCipher.java:490)
at javax.crypto.Cipher.doFinal(Cipher.java:1314)
at javax.crypto.CipherInputStream.fillBuffer(CipherInputStream.java:102)
... 6 more
这是我的Android应用程序上当前的Java代码(不起作用).
Here's the current Java code(which is not working) on my Android app.
public static InputStream decryptAES(Context context) {
InputStream ris = null;
try {
InputStream fis = context.getAssets().open("somefile");
FileOutputStream baos = new FileOutputStream("/sdcard/decrypted");
String hash = "SOMEHASH";
String ivs = "SOMEIV";
IvParameterSpec iv = new IvParameterSpec(ivs.getBytes("UTF-8"));
SecretKeySpec sks = new SecretKeySpec(hash.getBytes("UTF-8"), "AES");
// None of these work
Cipher cipher = Cipher.getInstance("AES");
//Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
//Cipher cipher = Cipher.getInstance("AES/ECB/ZeroBytePadding");
//Cipher cipher = Cipher.getInstance("AES/CBC/ZeroBytePadding");
//Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, sks);
//cipher.init(Cipher.DECRYPT_MODE, sks, iv);
CipherInputStream cis = new CipherInputStream(fis, cipher);
int b;
byte[] d = new byte[1024 * 32];
while ((b = cis.read(d)) != -1) {
baos.write(d, 0, b);
}
baos.flush();
baos.close();
cis.close();
} catch (Exception e) {
// Meh
}
return ris;
}
我不在乎最终使用哪种加密方法(128/256,盐/诺萨特,ecb/cbc),因为一旦被破解,就不会发生任何严重的事故.
I don't care which encryption method(128/256, salt/nosalt, ecb/cbc) I end up with as nothing critical happens if it gets cracked.
谁能建议我如何调整代码或带有新的openssl命令组合的新代码?
Can anyone suggest me how to tweak the code or a new code with new openssl command combination?
TL; DR-我需要一个Android Java代码,该代码可以解密通过openssl命令在Linux上加密的文件.
推荐答案
如果我使用openssl加密这样的文件:
If I encrypt a file like this using openssl:
> echo "Some test" > test.txt
> openssl aes-128-cbc -K "000102030405060708090A0B0C0D0E0F" -iv "77665544332211000011223344556677" -in test.txt -out test.enc
我可以在Java中像这样解密它:
I can decrypt it like this in java:
public static void main(String[] args) {
try {
byte[] keyBytes = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F};
byte[] ivBytes = {0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x00, 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77};
SecretKeySpec sks = new SecretKeySpec(keyBytes, "AES");
IvParameterSpec iv = new IvParameterSpec(ivBytes);
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, sks, iv);
// read file to byte[]
InputStream is = new FileInputStream("test.enc");
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int b;
while ((b = is.read()) != -1) {
baos.write(b);
}
byte[] fileBytes = baos.toByteArray();
byte[] decrypted = cipher.doFinal(fileBytes);
System.out.println(new String(decrypted));
} catch (Exception e) {
e.printStackTrace();
}
}
结果:
Some test
这篇关于使用Java在Android上解密OpenSSL加密的文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!