Google – Cipher Class
设计一个加密class,有一个方法encript(byte[] bytes)和一个16 bytes的increasing counter,要求是用这个counter和input做xor,input的长度任意。
返回一个和input长度一样的byte[] array作为加密的结果。
比如第一个Input是20个bytes,那么前16个bytes先和目前的counter做xor,后4bytes和下一个counter的前4个bytes做xor. 然后第二个input的前12个bytes再和当前counter剩下的12bytes做xor
[Solution]
没什么好方法,就死做。也不知道原题的input type是个什么,就直接用byte[] array了。counter我用了BigInteger, 因为16bytes早就超过integer的长度了。
[Note]
注意counter.toByteArray() 是不保证返回的array的长度的,但是也没关系,因为和0xor还是原来的数。
Read full article from Google – Cipher Class
设计一个加密class,有一个方法encript(byte[] bytes)和一个16 bytes的increasing counter,要求是用这个counter和input做xor,input的长度任意。
返回一个和input长度一样的byte[] array作为加密的结果。
比如第一个Input是20个bytes,那么前16个bytes先和目前的counter做xor,后4bytes和下一个counter的前4个bytes做xor. 然后第二个input的前12个bytes再和当前counter剩下的12bytes做xor
[Solution]
没什么好方法,就死做。也不知道原题的input type是个什么,就直接用byte[] array了。counter我用了BigInteger, 因为16bytes早就超过integer的长度了。
[Note]
注意counter.toByteArray() 是不保证返回的array的长度的,但是也没关系,因为和0xor还是原来的数。
class Solution { BigInteger counter; int idx; Solution() { this.counter = new BigInteger("1"); } public byte[] encript(byte[] input) { int n = input.length; byte[] result = new byte[n]; byte[] bytes = counter.toByteArray(); int len = bytes.length; int i = 0; while (i < input.length && idx < 16) { if (idx >= 16 - len) { result[i] = (byte) (input[i++] ^ bytes[16 - idx - 1]); } else { result[i] = input[i++]; } idx++; } while (i < input.length) { counter = counter.add(BigInteger.ONE); idx = 0; bytes = counter.toByteArray(); len = bytes.length; while (i < input.length && idx < 16) { if (idx >= 16 - len) { result[i] = (byte) (input[i++] ^ bytes[16 - idx]); } else { result[i] = input[i++]; } idx++; } } return result; }}