我有两个功能,encrypt和decrypt。在encrypt我创建一个密钥,加密一个字符串,并将密钥本身添加到字符串的开头。首先,我从加密字符串中分离出decrypt密钥(密钥大小是固定的)并尝试解密,但结果与初始字符串不匹配,这就是问题所在。
检查调试,在两个函数中key调用时数组是相同decrypt(encrypt(string))的,显然问题出在SecretKeySpec(恕我直言)。
我该如何解决?
代码本身:
static String encrypt(String str) {
SecretKeySpec sks = null;
byte[] key = null;
try {
SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");
sr.setSeed("this is seed".getBytes());
KeyGenerator kg = KeyGenerator.getInstance("AES");
kg.init(128, sr);
key = kg.generateKey().getEncoded();
sks = new SecretKeySpec(key, "AES");
} catch (Exception e) {
Log.e("Crypto", "AES secret key spec error");
}
// Encode the original data with AES
byte[] encodedBytes = null;
try {
Cipher c = Cipher.getInstance("AES");
c.init(Cipher.ENCRYPT_MODE, sks);
encodedBytes = c.doFinal(str.getBytes());
} catch (Exception e) {
Log.e("Crypto", "AES encryption error");
}
return Base64.encodeToString(key, Base64.DEFAULT) +
Base64.encodeToString(encodedBytes, Base64.DEFAULT);
}
static String decrypt(String str) {
byte[] key = Base64.decode(str.substring(0, 25), Base64.DEFAULT);
byte[] strBytes =
Base64.decode(str.substring(25, str.length()), Base64.DEFAULT);
SecretKeySpec sks = new SecretKeySpec(key, "AES");
// Decode the encoded data with AES
byte[] decodedBytes = null;
try {
Cipher c = Cipher.getInstance("AES");
c.init(Cipher.DECRYPT_MODE, sks);
decodedBytes = c.doFinal(strBytes);
} catch (Exception e) {
Log.e("Crypto", "AES decryption error");
}
return Base64.encodeToString(decodedBytes, Base64.DEFAULT);
}
UPD调用方法:
editText.setText(Crypt.encrypt(editText.getText().toString()));
...
editText.setText(Crypt.decrypt(editText.getText().toString()));
您遇到的问题不在密钥中,而在返回字符串时的额外编码中。
在 JVM 上调试此类代码的最简单方法是使用测试。