неправильное дешифрование с использованием AES / CBC / PKCS5Padding в Android - PullRequest
5 голосов
/ 12 марта 2011

Я написал следующий код в Android (v2.2 API 8), где вводится простой текст, код шифрует его, используя пароль пользователя и случайную соль, а затем расшифровывает его.После запуска кода я получаю только часть простого текста правильно.Например, пользователь вводит «Msg 1.5 для шифрования», а результатом дешифрования является «Msg15toencrypg ==»

Вот код:

 private EditText plain_msg;
    private EditText pwd;
    private TextView result;
    byte[] iv;</p>

<pre><code>@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();
    } 

}

}

Может кто-нибудь знает, почему это происходит, или какой-нибудь совет, чтобы получить правильное расшифрованное сообщение?

1 Ответ

1 голос
/ 12 марта 2011

Если вы возьмете шифрование-дешифрование, которое должно быть преобразованием идентичности, то останется:

Base64.encodeToString(Base64.decode(msg))

"Msg 1.5 to encrypt" не является строкой в ​​кодировке Base64, нет необходимости пытаться ее декодировать. Если вы делаете, как и вы, символы не-Base64 удаляются, и вы получаете несколько байтов, которые при кодировании обратно выглядят как результат, который вы получаете.

...