我正在 Vala 中为 Windows 和 Linux 编写一个跨平台应用程序。我需要实现 Hmac 以确保安全;但不幸的是,GHmac 类(链接)尚未移植到 Windows。我在维基百科(链接)上找到了 Hmac 的算法,我相信我正确地实现了它,但是与内置类相比,我没有得到相同的结果。如果有人可以帮我找到令人惊奇的错误,那么下面是我的功能。
public static string compute_for_data(ChecksumType type, uint8[] key,
uint8[] data) {
int block_size = 64;
uint8[] mod_key = key;
uint8[] outer = new uint8[block_size];
uint8[] inner = new uint8[block_size];
if (mod_key.length > block_size) {
mod_key = Checksum.compute_for_data(type, key).data;
}
mod_key.resize(block_size);
for (int i=0; i < mod_key.length; i++) {
outer[i] = mod_key[i] ^ 0x5c;
inner[i] = mod_key[i] ^ 0x36;
}
int i = inner.length;
inner.resize(i + data.length);
for (int j=0; j < data.length; j++) {
inner[i + j] = data[j];
}
inner = Checksum.compute_for_data(type, inner).data;
i = outer.length;
outer.resize(i + inner.length);
for (int j=0; j < inner.length; j++) {
outer[i + j] = inner[j];
}
return Checksum.compute_for_data(type, outer);
}