试过了在 Activity 中加密 /解密没有任何问题
然而在 Reciever 中解密会出现 javax.crypto.BadPaddingException: pad block corrupted 的错误,用了几个网上的库也都不行
还是贴个加密解密代码吧
private static byte[] encrypt(byte[] raw, byte[] clear) throws Exception {
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
byte[] encrypted = cipher.doFinal(clear);
return encrypted;
}
private static byte[] decrypt(byte[] raw, byte[] encrypted) throws Exception {
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.DECRYPT_MODE, skeySpec);
byte[] decrypted = cipher.doFinal(encrypted);
return decrypted;
}
private static byte[] getRawKey(byte[] seed) throws Exception {
KeyGenerator kgen = KeyGenerator.getInstance("AES");
SecureRandom sr = SecureRandom.getInstance("SHA1PRNG", "Crypto");
sr.setSeed(seed);
kgen.init(128, sr); // 192 and 256 bits may not be available
SecretKey skey = kgen.generateKey();
byte[] raw = skey.getEncoded();
return raw;
}
1
aWangami 2016-04-30 01:00:28 +08:00
代码呢?
|
2
autulin OP @aWangami 代码就是网络上流传的通用的, github 上专门给 Android 封装的包也有,我看了下源代码也都差不多。问题关键是他们在 Receiver 里面都会出同样的问题,很奇怪,我明天准备试下用 JNI 看看
|
3
limhiaoing 2016-04-30 13:25:46 +08:00
AES 有好几种工作模式,看这个异常我估计楼主解密用的是 ECB 或 CBC 。
ECB 和 CBC 在加密的时候需要对数据进行填充,然后再解密后要移除加密时填充的数据。 会出现这个异常我估计是,加密的时候没有填充,然后解密的时候尝试移除填充的时候,遇到了不正确的数据。 AES 的填充主要有 3 种: 1. NoPadding 不填充,要求带加密的数据大小刚好是 16 字节的整数倍; 2. ZorePadding 不可靠; 3. PKCS7Padding 。 |
4
autulin OP @limhiaoing 看来这加密在理论上还是有好多学习的地方呢。
不过我的问题的关键是,我在 Activity 中执行同样的加密解密方法是没有问题的,但是在 Receiver 中加密后传输到另外一个 Reciever 中解密就会报这个错。 不过值得一提的是,生成密钥和加密我都是用的默认设置,没有仔细研究是否需要设置填充的情况,但是默认情况他们应该是用的同一种填充方式吧?在 Activity 中能够正常加密解密也能证明这一点 我想这可能是 Android 本身的 bug 。 现在我能想到的点就是加密解密是否跟 Context 有关,因为我出错的环境目前能推测的唯一不同点就是:我在同一个 Activity 中加密解密,这都是相当于在同一个 Context 中完成的;而我用这个 Receiver 加密,另外一个 Receiver 解密,他们应该是在不同的 Context 中的。 |
7
special 2016-04-30 23:47:51 +08:00
「但是在 Receiver 中加密后传输到另外一个 Reciever 中解密就会报这个错」
传输前有没有做 base64 对二进制流编码,没有做的话会有失真,同样情况也适用于网络传输。 |
9
markkitty 2016-08-26 22:31:08 +08:00 via Android
楼主这个问题最后是怎么解决的?求告知
|