现在我理解java没有无符号字节,但我不知道如果不解决这个问题。 我正在尝试在java中实现SHA256哈希,而我正在处理将消息转换为512位。
int l = bytes.length; //total amount of bytes in the original message
int k = 0;
while((l+1+k) % 512 != 448) {
k++;
}
//k is the total amount of 0's to be padded
int rest = k % 8; //get the amount of 0's to be added in the byte with the 1
byte tmp =(byte) Math.pow(2, rest);
因此,关键指令是最后一行,如果rest = 7,则结果int为128,但是字节在java中进行了签名,因此字节变为0x80而不是0xF0。 我怎样才能在Java中实现这一目标?
如果有人知道如何实施这部分,请告诉我。
答案 0 :(得分:1)
从假设你的消息由字节组成开始,填充总是作为8位的多个,也就是字节。这可确保最重要的填充位始终位于消息之后的第一个填充字节的第7位,因此填充(如果有)始终由0x80启动,并根据需要填充0x00。
这可以通过一种非常简单的方式实现:
public static byte[] padMsg(byte[] rawMsg) {
int rawLen = rawMsg.length;
int padLen = (64 - (rawLen & 0x3F)) & 0x3F;
if (padLen == 0)
return rawMsg;
// all extra bytes in padded msg are zeros.
byte[] paddedMsg = Arrays.copyOf(rawMsg, rawLen + padLen);
// ensure topmost pad bit is a one
paddedMsg[rawLen] = (byte) 0x80;
return paddedMsg;
}
这将获取消息长度并获取余数。功率为2的剩余部分(在这种情况下为64)最有效地通过简单地屏蔽(power-1),这就是代码中的0x3F来自(= 64-1)。 在计算(64 - 余数)作为初始填充长度之后再次取余数,以捕获余数为0的特殊情况,导致错误的填充长度为64字节(应该是0填充)。
一旦知道填充长度(以字节为单位),就会捕获大小写填充= 0。在任何其他情况下,消息长度增加(使用0x00字节,Arrays.copyOf自动执行此操作)。然后将第一个填充字节替换为0x80,并返回现在保证为64字节长的倍数的填充消息。