我的程序生成两个随机 BigInteger,bitLength 为 255。然后它生成这两个 BigInteger 的异或。
问题是:由于大整数的大小是最小的,如果第一个位是 0,这个异或的大小可以小于 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);
}
}
问题是:即使 finalXor 小于 248 位,如何确保密钥始终为 32 字节?(我想我可以用位 0 填充,但我不知道如何。)
示例:让我们说我的 BigIntegers 是:
1111011010101101........11011100011
1111011001100111.................01110011010
那么 finalXor 将是:
0000000011001010................10101111001
高 8 位全为空,因此最终异或长度仅为 255-8 = 247 位长。当我制作 byte[] 键时,它将是 31 字节而不是 32。我需要它是 32 字节。并且仍然是好的异或。
这就是为什么我说我认为我应该做一个填充,其中所有“缺少的高位”都是 0,但我不知道该怎么做。
隔江千里
狐的传说
相关分类