2 回答
TA贡献1829条经验 获得超6个赞
这一行是错误的:
plainText.setText(new String(cipher.doFinal(plainText.getText().toString().getBytes(StandardCharsets.UTF_8)), StandardCharsets.UTF_8));
如果我们把它分开,我们有类似的东西
byte [] cipherBytes = cipher.doFinal(plainText.getText().toString().getBytes(StandardCharsets.UTF_8)); plainText.setText(new String(cipherBytes, StandardCharsets.UTF_8);
问题是这cipherBytes
是一个任意字节序列而不是字符串的字符。String 构造函数会悄悄地用其他东西替换无效字符,这是一个破坏数据的过程。
如果要显示密码字节或以其他方式将其发送到面向字符的通道,则必须对其进行编码。通常编码是 base64 或十六进制。要解密字符串,您必须先将其解码为字节,然后再解密。
例子:
byte [] cipherBytes = cipher.doFinal(plainText.getText().toString().getBytes(StandardCharsets.UTF_8)); plainText.setText(Base64.encodeToString(cipherBytes, Base64.DEFAULT));
并解密:
byte[] cipherBytes = Base64.decode(plainText.getText().toString(), Base64.DEFAULT); byte[] decrypted = cipher.doFinal(cipherBytes);
TA贡献1862条经验 获得超7个赞
byte[] decrypted = cipher.doFinal(plainText.getText().toString().getBytes(StandardCharsets.UTF_8));
由于 的调用,此行可能无法正常工作getBytes(StandardCharsets.UTF_8)。如果您EditText是十六进制表示,请尝试将其转换为字符串,然后调用getBytes(). 例如
public static byte[] convertHexStringToByteArray(String hexString) {
int l = hexString.length();
byte[] data = new byte[l/2];
for (int i = 0; i < l; i += 2) {
data[i/2] = (byte)((Character.digit(hexString.charAt(i), 16) << 4) + Character.digit(hexString.charAt(i+1), 16));
}
return data;
}
添加回答
举报