可能であれば、棚から何かを取り出してください。独自の SHA-256 実装を展開する必要はありません。公式の承認を得るには、認証を受ける必要があるからです。
とは言え、仕様は
5.1.1 SHA-1、SHA-224、SHA-256
メッセージの長さMがlビットであるとします。1
メッセージの末尾にビットを追加し、その後にkゼロ ビットを追加します。ここで、kは方程式の最小の非負の解です。
l + 1 + k ≡ 448 mod 512
次に、バイナリ表現を使用して表現された数lに等しい 64 ビット ブロックを追加します。たとえば、(8 ビット ASCII) メッセージ「<strong>abc」の長さは 8 × 3 = 24 であるため、メッセージは 1 ビットでパディングされ、次に 448 - (24 + 1) = 423 ゼロ ビットでパディングされ、次に512 ビットの埋め込みメッセージになるメッセージ長
423 64
.-^-. .---^---.
01100001 01100010 01100011 1 00…00 00…011000
“a” “b” “c” '-v-'
l=24
次に、パディングされたメッセージの長さは 512 ビットの倍数になるはずです。
単一ビットをアドレス指定できるため、使用したくなるかもしれませんがvec
、ファンキーなアドレス指定を回避する必要があります。
ビットが 4 以下の場合、文字列はバイトに分割され、各バイトのビットは 8/ BITSグループに分割されます。0x01
バイトのビットは、0x02
、0x04
、0x08
、 、 、0x10
、0x20
の0x40
ように、リトル エンディアン風の方法で番号付けされ0x80
ます。たとえば、1 つの入力バイトchr(0x36)
を 2 つのグループに分割すると、リストが得られます(0x6, 0x3)
。それを 4 つのグループに分けると、 が得られ(0x2, 0x1, 0x3, 0x0)
ます。
代わりに、指定のpack
テンプレートB*
ビット文字列 (各バイト内の降順のビット順)。
とN
「ネットワーク」(ビッグエンディアン) 順の unsigned long (32 ビット)。
後者は、メッセージの長さを組み立てるのに役立ちます。quad のパラメーターがpack
ありQ
ますが、結果はネイティブの順序になります。
少し準備作業から始めます
our($UPPER32BITS,$LOWER32BITS);
BEGIN {
use Config;
die "$0: $^X not configured for 64-bit ints"
unless $Config{use64bitint};
# create non-portable 64-bit masks as constants
no warnings "portable";
*UPPER32BITS = \0xffff_ffff_0000_0000;
*LOWER32BITS = \0x0000_0000_ffff_ffff;
}
pad_message
次に、次のように定義できます
sub pad_message {
use bytes;
my($msg) = @_;
my $l = bytes::length($msg) * 8;
my $extra = $l % 512; # pad to 512-bit boundary
my $k = 448 - ($extra + 1);
# append 1 bit followed by $k zero bits
$msg .= pack "B*", 1 . 0 x $k;
# add big-endian length
$msg .= pack "NN", (($l & $UPPER32BITS) >> 32), ($l & $LOWER32BITS);
die "$0: bad length: ", bytes::length $msg
if (bytes::length($msg) * 8) % 512;
$msg;
}
コードがパディングされたメッセージを出力するとします
my $padded = pad_message "abc";
# break into multiple lines for readability
for (unpack("H*", $padded) =~ /(.{64})/g) {
print $_, "\n";
}
次に、出力は
616263800000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000018
これは仕様に一致します。