【发布时间】:2015-06-13 01:06:30
【问题描述】:
我正在 Android 中进行 AES 加密和解密,我使用下面的 Android 代码 sn-p 发布请求。
请求发帖
String urlParameters = "username=abc&password=abc";
String request = "http://abcd.co.uk/data_abc.php?";
String passkey = "mysecretkey";
URL url;
HttpURLConnection connection = null;
try {
//Create connection
url = new URL(request);
connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("POST");
connection.setRequestProperty("Content-Type",
"application/x-www-form-urlencoded");
connection.setRequestProperty("Content-Length", "" +
Integer.toString(urlParameters.getBytes().length));
connection.setRequestProperty("Content-Language", "en-US");
connection.setUseCaches(false);
connection.setDoInput(true);
connection.setDoOutput(true);
//Send request
DataOutputStream wr = new DataOutputStream(
connection.getOutputStream());
wr.writeBytes(urlParameters);
wr.flush();
wr.close();
//Get Response
InputStream is = connection.getInputStream();
BufferedReader rd = new BufferedReader(new InputStreamReader(is));
String line;
StringBuffer response = new StringBuffer();
while ((line = rd.readLine()) != null) {
response.append(line);
response.append('\r');
}
rd.close();
return response.toString();
} catch (Exception e) {
e.printStackTrace();
return null;
} finally {
if (connection != null) {
connection.disconnect();
}
}
我从上述请求中成功获得了 Base64 加密响应字符串,但是当我尝试使用以下代码 sn-p 解密响应字符串时,它返回不可读的字符串,如字符和框。
解密
String strDecriptedValue = decrypt(passkey, responseBase64);
public static String decrypt(String seed, String encrypted)
throws Exception {
byte[] rawKey = getRawKey(seed.getBytes());
byte[] enc = Base64.decode(encrypted.getBytes(), Base64.DEFAULT);
byte[] result = decrypt(rawKey, enc);
return new String(result);
}
private static byte[] getRawKey(byte[] seed) throws Exception {
KeyGenerator keygen = KeyGenerator.getInstance("AES");
SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
random.setSeed(seed);
keygen.init(128, random);
SecretKey key = keygen.generateKey();
byte[] raw = key.getEncoded();
return raw;
}
private static byte[] decrypt(byte[] raw, byte[] encrypted)
throws Exception {
SecretKeySpec keySpec = new SecretKeySpec(raw, "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/NoPadding");
cipher.init(Cipher.DECRYPT_MODE, keySpec);
byte[] decrypted = cipher.doFinal(encrypted);
return decrypted;
}
解密输出
��]ة*�]��O��Z���Q2�_
响应应为 JSON 格式,但实际输出如上。
请分享使用 AES 256 位解密数据的 sn-p,使用 Base 64 的安全密钥。
我还尝试使用 AES/CBC/NoPadding 、 AES/CBC/PKCS5Padding 等,但它没有工作。
【问题讨论】:
-
你在用
Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files吗? -
不,我用的是AES256解密
-
使用 256 位加密你应该有
Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files -
感谢您的快速回复,如果您分享教程/代码sn-p或任何其他参考以在android中实现AES256解密,将非常感激。
标签: java c# android encryption cryptography