簡體   English   中英

Android AES解密返回稀有字符

[英]Android AES decryption returning rare characters

我正在嘗試使用AES算法解密字符串文本,我發現了許多教程,但是當我嘗試解密字符串時仍然遇到相同的錯誤。

這是我的課:

   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;
}

問題是當我嘗試檢索Decrypted字符串時,因為它返回以下內容:

在此處輸入圖片說明

如您所見,輸出文本包含Unicode字符,而不包含我已加密的文本。 有什么問題嗎?

您忘記了實際在crypto方法中調用密碼。

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或反之時,應始終明確指定編碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM