Моя программа создает два случайных BigInteger с битовой длиной 255. Затем получается xor из этих двух BigInteger.
Проблема в том, что поскольку величина больших целых чисел минимальна, если первые биты равны 0, размер этого xor может быть меньше 255. И мне нужно, чтобы он был 32 байта, поэтому между 248 и 256 битами.
Вот мой код:
public class test {
public static void main(String[] args) throws Exception {
SecureRandom random;
BigInteger randomBigInteger1;
byte[] randomBytes;
do {
random = new SecureRandom();
randomBytes = new byte[32];
random.nextBytes(randomBytes);
randomBigInteger1 = new BigInteger(randomBytes);
}while(randomBigInteger1.bitLength() < 255);
BigInteger randomBigInteger2;
do {
random = new SecureRandom();
randomBytes = new byte[32];
random.nextBytes(randomBytes);
randomBigInteger2 = new BigInteger(randomBytes);
}while(randomBigInteger2.bitLength() < 255);
BigInteger finalXor = randomBigInteger1.xor(randomBigInteger2);
System.out.println(finalXor.bitLength());
byte[] key = finalXor.toByteArray();
System.out.println(key.length);
}
}
Вопрос: как убедиться, что ключ всегда будет 32 байта, даже если finalXor меньше 248 бит? (Я думаю, я могу сделать отступ с битами 0, но я не знаю как.)
Пример: давайте рассмотрим мои BigIntegers:
1111011010101101 ............. 11011100011
1111011001100111 ............. 01110011010
Тогда finalXor будет:
0000000011001010 ............. 10101111001
Все 8 старших битов равны нулю, поэтому длина finalXor составляет всего 255-8 = 247 бит. Когда я сделаю ключ byte [], он будет 31 байтом, а не 32.
Мне нужно, чтобы это было 32 байта. И все же будь хорошим хором.
Вот почему я сказал, что должен сделать отступ, где все "отсутствующие старшие биты" равны 0, но я не знаю, как это сделать.