我试图在Galois Field 256中实现一种用于逐位乘法的方法,以便构建AES的实现。我目前的乘法方法如下:
public static int multiplyPolynomials(int n, int m)
{
int result = 0x00000000;
String ns = toBitString(n);
String ms = toBitString(m);
for (int i = 0; i < ns.length(); i++)
{
if (ns.charAt(i) == '1')
{
/*
* If there's a 1 at place i, add the value of m left-shifted i places to the result.
*/
int temp = m;
for (int j = 0; j < i; j++) { temp = temp << 1; }
result += temp;
}
}
return result;
}
toBitString(int n)
方法纯粹是Integer.toBinaryString(int n)
的快捷方式。
给定(0x0000ef00, 2)
的输入,此函数的输出为494(应为478)。打印到toBitString(0x0000ef00)
的直接调用确认该函数的输出符合预期(在本例中为1110111100000000)。如果第一个输入向右移一个字节(0x000000ef),则输出仍为494.
通过上述输入,ns的值为1110111100000000
,而result
的位字符串为111101110
。 ns
因此是正确的。
上述方法中的错误是什么?
答案 0 :(得分:4)
你正在以错误的方式阅读二进制字符串。
试试这个......
public static int multiplyPolynomials(int n, int m) {
int result = 0x00000000;
String ns = Integer.toBinaryString(n);
for (int i = 0; i < ns.length(); i++) {
// Read the string the other way round...
int bitIndex = (ns.length() - i) - 1;
if (ns.charAt(bitIndex) == '1') {
/*
* If there's a 1 at place i, add the value of m left-shifted i
* places to the result.
*/
int temp = m;
// Don't need a loop here, just shift it by "i" places
temp = temp << i;
result += temp;
}
}
return result;
}
不是将数字变成二进制字符串,而是可以使用类似的东西......
public static int multiplyPolynomials(int n, int m) {
int result = 0x00000000;
for (int i = 0; i < 32; i++) {
int mask = 1 << i;
if ((n & mask) == mask) {
result += m << i;
}
}
return result;
}
您可能需要将答案存储为长时间以防止溢出,并且对于负数而言可能无法正常工作...