【发布时间】:2014-07-15 03:16:33
【问题描述】:
我有以下代码来解密通过 PHP mcrypt 函数加密的 Java 文件。
private String iv = "MYKEYHERE";//Dummy iv (CHANGE IT!)
private String SecretKey = "MYKEYHERE";//Dummy secretKey (CHANGE IT!)
private byte[] decrypt(String code)
{
byte[] decrypted = null;
try {
Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes());
SecretKeySpec keyspec = new SecretKeySpec(SecretKey.getBytes(), "AES");
if(code == null || code.length() == 0)
throw new Exception("Empty string");
cipher.init(Cipher.DECRYPT_MODE, keyspec, ivspec);
decrypted = cipher.doFinal(hexToBytes(code));
} catch (Exception e) {
e.printStackTrace();
}
return decrypted;
}
private static byte[] hexToBytes(String str) {
if (str==null) {
return null;
} else if (str.length() < 2) {
return null;
} else {
int len = str.length() / 2;
byte[] buffer = new byte[len];
for (int i=0; i<len; i++) {
try {
buffer[i] = (byte) Integer.parseInt(str.substring(i*2,i*2+2),16);
} catch (NumberFormatException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return buffer;
}
}
我正在从 SDCARD 读取和写入文件为
String encyptedData = readFileFromSDCard(params[0]);
byte[] decryptedByteArray = decrypt(encyptedData);
File rootFile = new File(Constants.folioTempLocation+params[1]);
rootFile.mkdirs();
File outFile = new File(rootFile, new File(params[0]).getName());
FileOutputStream out = new FileOutputStream(outFile);
//IOUtils.write(decryptedByteArray, out);
out.write(decryptedByteArray);
out.flush();
out.close();
解密并将文件写回SD_CARD没有问题。但是我在每个文件的末尾都有未知字符,这限制了整个解密文件的正常工作。
我附上了连接到字符串末尾的未知字符的屏幕截图。我还附上了encrypted_html_file,供任何想使用此文件测试代码的人使用。
截图
【问题讨论】:
-
@Andrew T. 感谢您的编辑,您知道我做错了什么吗?
-
其实我也不知道,因为我自己没遇到过。如果在其他文件上测试,是否总是返回 5 个 NULL 字符?
-
@AndrewT。
NUL字符是任意的,它在字符串末尾从 2 到 10 不等。 Notepad++ 将其显示为NUL字符,但记事本将其显示为空格。 -
它是一个null control character,以字节为单位表示为0x00。由于解密没有问题,我怀疑是加密神器。在任何情况下,可能都可以通过在解密文件后、保存文件之前删除尾随的空值来修复它。
-
@AndrewT。感谢您的研究,您能否发布如何删除尾随
NUL的答案,因为我也尝试从末尾修剪byte[],但没有运气。
标签: java php android encryption cryptography