java - Android AES解密返回稀有字符

标签 java android aes

我正在尝试使用 AES 算法解密字符串文本,我找到了很多教程,但当我尝试解密字符串时仍然遇到相同的错误。

这是我的类(class):

   EditText inputText, inputPass;
TextView out;
Button btnEnc, btnDec;
String outputString;
private static final String AES_MODE = "AES";

View.OnClickListener encryption= new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        try {
            outputString= encrypt(inputText.getText().toString(),inputPass.getText().toString());
        } catch (Exception e) {
            e.printStackTrace();
        }
        out.setText(outputString);
    }
};

View.OnClickListener decryption= new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        try {
            outputString= decrypt(outputString,inputPass.getText().toString());
        } catch (Exception e) {
            Toast.makeText(getApplicationContext(),e.getMessage(),Toast.LENGTH_LONG).show();
            e.printStackTrace();
        }
        out.setText(outputString);
    }
};

private String encrypt(String data, String pass)throws Exception{
    SecretKeySpec key= generateKey(pass);
    Cipher c= Cipher.getInstance(AES_MODE);
    c.init(Cipher.ENCRYPT_MODE,key);
    byte[] encVal= c.doFinal(data.getBytes());
    String encryptedValue= Base64.encodeToString(encVal,Base64.DEFAULT);
    return  encryptedValue;
}
private String decrypt(String cadena, String password)throws Exception{
    SecretKeySpec keySpec= generateKey(password);
    Cipher c= Cipher.getInstance(AES_MODE);
    c.init(Cipher.DECRYPT_MODE,keySpec);
    byte[] decValue= Base64.decode(cadena, Base64.DEFAULT);
    String decryptedValue= new String((decValue));
    return decryptedValue;
}
private SecretKeySpec generateKey(String password) throws NoSuchAlgorithmException, UnsupportedEncodingException {
    final MessageDigest digest= MessageDigest.getInstance("SHA-256");
    byte[] bytes= password.getBytes("UTF-8");
    digest.update(bytes,0,bytes.length);
    byte[] key= digest.digest();
    SecretKeySpec secretKeySpec= new SecretKeySpec(key, "AES");
    return secretKeySpec;
}

问题是当我尝试检索解密的字符串时,因为它返回:

enter image description here

如您所见,输出文本包含 Unicode 字符,而不是我加密的文本。会出现什么问题?

最佳答案

您忘记在解密方法中实际调用您的密码。

private String decrypt(String cadena, String password)throws Exception{
    SecretKeySpec keySpec= generateKey(password);
    Cipher c= Cipher.getInstance(AES_MODE);
    c.init(Cipher.DECRYPT_MODE,keySpec);
    byte[] decValue= c.doFinal(Base64.decode(cadena, Base64.DEFAULT));
    //               ^^^^^^^^^  add this
    String decryptedValue= new String((decValue));
    return decryptedValue;
}

此外,在从 byte[] 转换为 String 时,您应该始终显式指定编码,反之亦然。

关于java - Android AES解密返回稀有字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49345623/

相关文章:

java - 使用 apache commons 配置 xpath 查询具有属性的空 XML 元素

java - 如何使用命令行在 Windows 上查找 JRE 路径

java - 按像素在其图标上移动 JButton 文本

android - 为什么是android :transcriptMode ="normal" not working properly?

java - 以编程方式设置 java.awt.headless=true

java - 使用 OpenCV for Android 将小图像复制到相机框架中

android - 在 IntentService 中获取地理定位上下文

c# - Rijndael 填充错误

java - 字符串加密有效,byte[]数组类型加密无效

objective-c - 在 Objective-c iOS 应用程序中,我应该在哪里调用计算函数?