Android 安卓AES加密和解密

Android 安卓AES加密和解密,android,aes,Android,Aes,我已经找到了数百个安卓AES加密和解密的例子,但我无法让它们工作,即使是最简单的。下面的代码进行了一些加密和解密,但在解密加密文本后会抛出垃圾。你能看一下并告诉我哪里错了吗 谢谢 KeyGenerator keyGenerator = KeyGenerator.getInstance("AES"); keyGenerator.init(128, new SecureRandom()); SecretKey secretKey = keyGenerator.generateKey(); Ciph

我已经找到了数百个安卓AES加密和解密的例子,但我无法让它们工作,即使是最简单的。下面的代码进行了一些加密和解密,但在解密加密文本后会抛出垃圾。你能看一下并告诉我哪里错了吗

谢谢

KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
keyGenerator.init(128, new SecureRandom());
SecretKey secretKey = keyGenerator.generateKey();

Cipher cipher = Cipher.getInstance("AES");

String plainText = "This is supposed to be encrypted";
String plainKey = Base64.encodeToString(secretKey.getEncoded(), Base64.DEFAULT);

//encrypt
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
byte[] encryptedBytes = cipher.doFinal(plainText.getBytes());
String encryptedText = Base64.encodeToString(encryptedBytes, Base64.DEFAULT);

//decrypt
cipher.init(Cipher.DECRYPT_MODE, secretKey);
byte[]decryptedBytes = cipher.doFinal(encryptedBytes);
String decryptedText = Base64.encodeToString(decryptedBytes, Base64.DEFAULT);
@巴伦德回答工程:
您的代码运行良好。@greenapps说了些什么。尝试打印新字符串(decryptedBytes)的输出,而不是Base64.encodeToString(..),您将看到它是您要查找的值。

decryptedBytes应与plainText.getBytes()相同。所以,只要将解密字节转换回字符串,您就应该返回纯文本。您的代码工作正常。@greenapps说了些什么。请尝试打印
新字符串(decryptedBytes)
的输出,而不是
Base64.encodeToString(..)
,您将看到它是您正在查找的值。谢谢Barend。成功了!请注意,目前的AES实现并不能为您提供良好的数据保护。它在ECB模式下使用AES,这非常弱。您必须使用CBC模式,要使其强大,您必须为初始化向量(IV)使用SecureRandom值。评论解释细节有点太多了,但是如果你用谷歌搜索“JavaAES CBC模式”,你会得到一些合理的文章。是的,这是第二步,谢谢。
    SecretKeySpec sks = null;
    try {
        SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");
        sr.setSeed("Complex Key for encryption".getBytes());
        KeyGenerator kg = KeyGenerator.getInstance("AES");
        kg.init(128, sr);
        sks = new SecretKeySpec((kg.generateKey()).getEncoded(), "AES");
    } catch (Exception e) {
        Log.e(TAG, "AES secret key spec error");
    }

    // Encode the original data with AES
    byte[] encodedBytes = null;
    try {
        Cipher c = Cipher.getInstance("AES");
        c.init(Cipher.ENCRYPT_MODE, sks);
        encodedBytes = c.doFinal(theTestText.getBytes());
    } catch (Exception e) {
        Log.e(TAG, "AES encryption error");
    }
    TextView tvencoded = (TextView)findViewById(R.id.textitem2);
    tvencoded.setText("[ENCODED]:\n" +
            Base64.encodeToString(encodedBytes, Base64.DEFAULT) + "\n");

    // Decode the encoded data with AES
    byte[] decodedBytes = null;
    try {
        Cipher c = Cipher.getInstance("AES");
        c.init(Cipher.DECRYPT_MODE, sks);
        decodedBytes = c.doFinal(encodedBytes);
    } catch (Exception e) {
        Log.e(TAG, "AES decryption error");
    }
    TextView tvdecoded = (TextView)findViewById(R.id.textitem3);
    tvdecoded.setText("[DECODED]:\n" + new String(decodedBytes) + "\n");