【发布时间】:2012-11-06 23:49:38
【问题描述】:
我正在尝试解密从后端服务器收到的字符串"~9?8?m???=?T?G",该后端服务器使用 OpenSSL 使用 AES-256-CBC 加密字符串。有代码块:
public static String decryptText(String textToDecrypt) {
try {
byte[] base64TextToDecrypt = Base64.encodeBase64(textToDecrypt.getBytes("UTF-8"));
byte[] guid = "fjakdsjkld;asfj".getBytes("UTF-8");
byte[] iv = new byte[16];
System.arraycopy(guid, 0, iv, 0, guid.length);
IvParameterSpec ips = new IvParameterSpec(iv);
byte[] secret = DECRYPTION_SECRET_HASH.getBytes("UTF-8");
SecretKeySpec secretKey = new SecretKeySpec(secret, "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
// decryption pass
cipher.init(Cipher.DECRYPT_MODE, secretKey, ips);
byte[] converted = cipher.doFinal(base64TextToDecrypt);
System.out.println(new String(converted));
} catch (Exception e) {
e.printStackTrace();
Log.e(TAG, "Decipher error for " + textToDecrypt, e);
}
return "";
}
不幸的是,当我到达时
byte[] converted = cipher.doFinal(base64TextToDecrypt);
声明抛出以下异常:
javax.crypto.IllegalBlockSizeException: last block incomplete in decryption
有什么想法吗?
【问题讨论】:
-
请注意,如果您从服务器接收到字符串
"~9?8?m???=?T?G",而不是基于 64 位编码的字符串或纯字节(从InputStream接收),则服务器不会生成有效密码文本。这些问号是不可打印的字符,当这些问号出现时,您可能会丢失信息。 -
谢谢@owlstead。你提出了一个很好的观点。
~9?8?m???=?T?G最初是使用字符串4创建的,我们希望解密并检索4,但没有成功。我希望得到一个基本的解密工作,然后从那里开始。这是第一步,我还没有完成。根据您的建议,我会根据您的建议进行更多尝试,了解更多信息后做出回应。 -
如果您不能直接传输字节,您必须使用 base 64 对服务器上的结果进行编码才能使代码正常工作。
标签: java encryption encoding character-encoding aes