android Cipher.dofinal方法在5.0以上环境抛异常 求解(rsa加密相关用到)
如下方法 在4.x环境下的没有问题 但是在5.x的环境下
dofinal方法抛出异常
异常内容为:input too large for RSA cipher.
出问题的方法如下 注释内的数字为下方变量的int值 或size length
public static byte[] ddddencrypt(Key key, byte[] data) throws Exception {
try {
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, key);
//获得加密块大小,如:加密前数据为128个byte,而key_size=1024 加密块大小为127 byte,加密后为128个byte;
//因此共有2个加密块,第一个127 byte第二个为1个byte
//127-blockSize
int blockSize = cipher.getBlockSize();
Log.d(TAG.Tag, "blockSize: "+blockSize);
//128-outputSize 117-data.length
int outputSize = cipher.getOutputSize(data.length);//获得加密块加密后块大小
Log.d(TAG.Tag, "data.length: "+data.length);
Log.d(TAG.Tag, "outputSize: "+outputSize);
//117-leavedSize
int leavedSize = data.length % blockSize;
Log.d(TAG.Tag, "leavedSize: "+leavedSize);
//1-blocksSize
int blocksSize = leavedSize != 0 ? data.length / blockSize + 1 : data.length / blockSize;
Log.d(TAG.Tag, "blocksSize: "+blocksSize);
//128-raw.length
byte[] raw = new byte[outputSize * blocksSize];
Log.d(TAG.Tag, "raw-Size: "+raw.length);
int i = 0;
raw = cipher.doFinal(data);
while (data.length - i * blockSize > 0) {
if (data.length - i * blockSize > blockSize){
Log.d(TAG.Tag, "do-true");
cipher.doFinal(data, i * blockSize, blockSize, raw, i * outputSize);
}
else
{
Log.d(TAG.Tag, "do-false");
cipher.doFinal(data, i * blockSize, data.length - i * blockSize, raw, i * outputSize);
}
//这里面doUpdate方法不可用,查看源代码后发现每次doUpdate后并没有什么实际动作除了把byte[]放到ByteArrayOutputStream中
//,而最后doFinal的时候才将所有的byte[]进行加密,可是到了此时加密块大小很可能已经超出了OutputSize所以只好用dofinal方法。
i++;
}
return raw;
} catch (Exception e) {
throw new Exception(e.getMessage());
}
}