2024/04/26 SHA-1を実装したい
t6o_o6t.icon
RFCにリファレンス実装も付いていたので、試行錯誤中
方法1のやり方で一通り実装した(約1時間)が、正しく動かない
できた!
Method 1の下記の記述を理解できていなかった
a. Divide M(i) into 16 words W(0), W(1), ... , W(15), where W(0) is the left-most word.
t6o_o6t.iconは、byteのポインタをそのままwordのポインタにして扱っていた(リトルエンディアンのまま)
まだ正しく動かないケースがある
メッセージをまたぐ必要がある(8ビットバイトなら56バイト以上)場合
リファレンス実装に、処理中ブロックのindexが55バイトを超える場合の分岐がある
1を打ったうえでゼロ埋めするが(これはバイト数に関わらず共通)
55バイト超えの場合は、現在のメッセージの64バイトと、次メッセージの55バイト目まで全てゼロ埋めする リファレンス実装を読み直す
SHA1Input、SHA1Resultはそれぞれ「Test Driver」という項目のコードから呼び出されている
呼び出しタイミングが異なるということが分かる
SHA1Input
バイト列を入力する
長さが54バイトまでのとき
即座に1を入れて55まで埋めて、56からlを格納
55バイト以上のとき
RFCだけで実装するのは難しいのではないか
RFCを書いている側も、文章を書いているだけでは自身のRFCが正確かどうか判断することができないだろう
55バイトまでと56から63バイトまでは正しく動くようになった
とりあえず全て格納してみて、1と0埋めをしたあとlを格納できれば格納する
63バイトの場合、1を格納するとちょうど64バイトとなる
メッセージを全て格納できないとき、どうなるのか
すなわち64バイト以上のときどうなるのか
分かったt6o_o6t.icon
このアルゴリズムは、「1」を置けるようになるまでメッセージ内容をバッファに詰めて処理するループを繰り返す
したがって、たとえば200バイトのメッセージなら、まずは3回ループを繰り返して192バイトを処理する
その後、残った8バイトを処理するときには「1」を置けるので、1を置く
lを格納できるなら格納し、格納できないのなら次ループで格納する
完了t6o_o6t.icon
処理を抽象的に図示するために書くなら理解できるが
1対1でコードに対応するフローチャートに何の意味があろうか