android Cipher.dofinal方法在5.0以上环境抛异常 求解(rsa加密相关用到)

kevinworkroom 2015-11-03 03:45:48
如下方法 在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());

}
}
...全文
772 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧