Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Android中使用AES/CBC/PKCS5P进行不正确的解密_Android_Eclipse_Aes - Fatal编程技术网

在Android中使用AES/CBC/PKCS5P进行不正确的解密

在Android中使用AES/CBC/PKCS5P进行不正确的解密,android,eclipse,aes,Android,Eclipse,Aes,我在Android(v2.2 API 8)中编写了以下代码,其中输入纯文本,代码使用用户密码和随机salt对其进行加密,然后解密。在运行代码之后,我只得到了部分正确的纯文本。例如,用户输入“Msg 1.5加密”,解密代码的结果是“Msg15toencrypg=” 代码如下: private EditText plain_msg; private EditText pwd; private TextView result; byte[] iv; @Override pu

我在Android(v2.2 API 8)中编写了以下代码,其中输入纯文本,代码使用用户密码和随机salt对其进行加密,然后解密。在运行代码之后,我只得到了部分正确的纯文本。例如,用户输入“Msg 1.5加密”,解密代码的结果是“Msg15toencrypg=”

代码如下:
 private EditText plain_msg;
    private EditText pwd;
    private TextView result;
    byte[] iv;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    plain_msg = (EditText)findViewById(R.id.msg2encypt);
    pwd = (EditText)findViewById(R.id.password);
    result = (TextView)findViewById(R.id.decrypttxt);
}

public void mybuttonHandler(View view){
    String S_plain_msg = plain_msg.getText().toString();
    String S_pwd = pwd.getText().toString();
    setAES(S_plain_msg, S_pwd);
}


private byte[] generateSalt() throws NoSuchAlgorithmException{
    SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
    byte[] ransalt = new byte[20];
    random.nextBytes(ransalt);
    return ransalt;
}


private void setAES(String msg, String pwd){
    try {
        //Generation of Key
        byte[] salt = generateSalt();
        SecretKeyFactory factory = SecretKeyFactory.getInstance("PBEWITHSHA256AND256BITAES-CBC-BC");
        KeySpec spec = new PBEKeySpec(pwd.toCharArray(),salt,1024, 256);
        SecretKey tmp = factory.generateSecret(spec);
        SecretKey secret = new SecretKeySpec(tmp.getEncoded(), "AES");

        //Encryption process
        byte[] btxt = Base64.decode(msg, 0);
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, secret); 
        AlgorithmParameters params = cipher.getParameters(); 
        iv = params.getParameterSpec(IvParameterSpec.class).getIV(); 
        byte[] ciphertext = cipher.doFinal(btxt);
        String encryptedtext = Base64.encodeToString(ciphertext, 0);

        //Decryption process
        byte[] bencryptxt = Base64.decode(encryptedtext, 0);
        cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        cipher.init(Cipher.DECRYPT_MODE, secret, new IvParameterSpec(iv)); 
        ciphertext = cipher.doFinal(bencryptxt);
        String cipherS = Base64.encodeToString(ciphertext, 0); 

        result.setText(cipherS);
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    } catch (GeneralSecurityException e) {
        e.printStackTrace();
    } 

}
}


有人知道为什么会发生这种情况,或者有什么建议可以得到正确的解密消息吗?

如果您取出加密-解密(应该是身份转换),剩下的是:


“Msg 1.5加密”
不是Base64编码字符串,无需尝试对其进行解码。如果您这样做,非Base64字符会被剥离,您会得到一些字节,这些字节在重新编码后看起来就像您得到的结果。

就像在黑暗中随机插入一样,如果您将PKCS5PAdding替换为NoPadding呢?好的,我使用getBytes(“UTF-8”)和新字符串(byte[],“UTF-8”)来解析它。
Base64.encodeToString(Base64.decode(msg))