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;
}
}