我在Android和Java servlet环境中使用AES加密和弹性城堡实现。两种情况下加密部分都可以。但是,一旦我使用相同的密钥加密相同的文本,我会得到不同的结果。
我的目的是在Android中进行加密,并在网络环境中进行解密。
这是我为Android AES实施所做的唯一更改。
KeyGenerator kgen = KeyGenerator.getInstance("AES");
SecureRandom sr = null;
if (android.os.Build.VERSION.SDK_INT >= JELLY_BEAN_4_2) {
sr = SecureRandom.getInstance("SHA1PRNG", "Crypto");
} else {
sr = SecureRandom.getInstance("SHA1PRNG");
}
sr.setSeed(key);
kgen.init(128, sr);
SecretKey skey = kgen.generateKey();
byte[] raw = skey.getEncoded();
上面我只是将加密添加到get实例中。
我也使用了海绵城堡的实施来看看我能否做到这一点。它仍然给了我与Android给出的相同的结果。不确定我是否已正确加载它。我在API级别14和17上测试了这个。
这导致javax.crypto.BadPaddingException:pad块损坏。
答案 0 :(得分:4)
对于引用此线程的任何人来说,这是我对代码所做的更改。现在它在Android和服务器环境中运行良好。
回答来自,
Android 4.2 broke my encrypt/decrypt code and the provided solutions don't work
谢谢@kroot
/* Store these things on disk used to derive key later: */
int iterationCount = 1000;
int saltLength = 32; // bytes; should be the same size as the output
// (256 / 8 = 32)
int keyLength = 256; // 256-bits for AES-256, 128-bits for AES-128, etc
byte[] salt = new byte[saltLength]; // Should be of saltLength
/* When first creating the key, obtain a salt with this: */
SecureRandom random = new SecureRandom();
random.nextBytes(salt);
/* Use this to derive the key from the password: */
KeySpec keySpec = new PBEKeySpec(new String(key,
Constants.CHAR_ENCODING).toCharArray(), key, iterationCount,
keyLength);
SecretKeyFactory keyFactory = SecretKeyFactory
.getInstance("PBEWithSHA256And256BitAES-CBC-BC");
byte[] keyBytes = keyFactory.generateSecret(keySpec).getEncoded();
SecretKey secretKey = new SecretKeySpec(keyBytes, "AES");
return secretKey.getEncoded();