2024/04/26 SHA-1を実装したい
SHA-1
RFCがある
https://datatracker.ietf.org/doc/html/rfc3174
RFC3174
https://tex2e.github.io/rfc-translater/html/rfc3174.html
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
mysha1/main.c at main · coolwind0202/mysha1 · GitHub
これはプログラミングとアルゴリズム基礎(CISTの講義)で書いたものなので、フローチャートも書かないといけない
処理を抽象的に図示するために書くなら理解できるが
1対1でコードに対応するフローチャートに何の意味があろうか