android 异或加密,Android文件的加密与解密

@return

*/

public static boolean decrypt(String filePath, CipherListener listener) {

try {

long startTime = System.currentTimeMillis();

File f = new File(filePath);

// if(!f.getPath().toLowerCase().endsWith(CIPHER_TEXT_SUFFIX)){

// //后缀不同,认为是不可解密的密文

// return false;

// }

RandomAccessFile raf = new RandomAccessFile(f, "rw");

long totalLenght = raf.length();

FileChannel channel = raf.getChannel();

long multiples = totalLenght / CIPHER_BUFFER_LENGHT;

long remainder = totalLenght % CIPHER_BUFFER_LENGHT;

MappedByteBuffer buffer = null;

byte tmp;

byte rawByte;

//先对整除部分解密

for(int i = 0; i < multiples; i++){

buffer = channel.map(

FileChannel.MapMode.READ_WRITE, i * CIPHER_BUFFER_LENGHT, (i + 1) * CIPHER_BUFFER_LENGHT);

//此处的解密方法很简单,只是简单的异或计算

for (int j = 0; j < CIPHER_BUFFER_LENGHT; ++j) {

rawByte = buffer.get(j);

tmp = (byte) (rawByte ^ j);

buffer.put(j, tmp);

if(null != listener){

listener.onProgress(i * CIPHER_BUFFER_LENGHT + j, totalLenght);

}

}

buffer.force();

buffer.clear();

}

//对余数部分解密

buffer = channel.map(

FileChannel.MapMode.READ_WRITE, multiples * CIPHER_BUFFER_LENGHT, multiples * CIPHER_BUFFER_LENGHT + remainder);

for (int j = 0; j < remainder; ++j) {

rawByte = buffer.get(j);

tmp = (byte) (rawByte ^ j);

buffer.put(j, tmp);

if(null != listener){

listener.onProgress(multiples * CIPHER_BUFFER_LENGHT + j, totalLenght);

}

}

buffer.force();

buffer.clear();

channel.close();

raf.close();

//对加密后的文件重命名,增加.cipher后缀

// f.renameTo(new File(f.getPath().substring(f.getPath().toLowerCase().indexOf(CIPHER_TEXT_SUFFIX))));

Log.d("解密用时:", (System.currentTimeMillis() - startTime) / 1000 + "s");

return true;

} catch (Exception e) {

e.printStackTrace();

return false;

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值