apolloトリップルーチン

6fa37f8b :Anonymous 2005-05-16 18:19
apollo.hに記述されている、署名のアルゴリズム

トリップ仕様ver0.2(apollo512-2) 2004/02/16
1)文字列変換ルール(base64.c)

多倍長整数<->文字列
最下位6bitからbase64テーブルに準拠して変換
文字列の先頭文字が整数の最下位6bit
文字列の最後尾が最上位

想定される字数に足りない時は0が補充される
(文字変換時にAが足される)

鍵文字圧縮
与えられた鍵文字列のMD5ハッシュをとり、
そのbase64エンコードの先頭11文字をとる

2)鍵の生成ルール

素数テストにはミラーテストを使用し、最初の10個の
素数に対してパスした擬素数を素数とみなす。

公開乗数eは65537

トリップ生成文字列から素数p,qを生成
生成文字列依存のランダムなp,qのとり方
hash1: トリップ生成文字列($key)のMD5ハッシュ
hash2: $key + 'pad1' のMD5ハッシュ
hash3: $key + 'pad2' のMD5ハッシュ
hash4: $key + 'pad3' のMD5ハッシュ

とし、hashsをその連結とする。

pのnum[0]-num[6] := hashs[0-27] (28byte)
qのnum[0]-num[8] := hashs[28-63](36byte)
(little-endianで処理する。つまりhashsの最初の
バイトがpの最下位バイトになるように)

pが216bitより小さな因数になるのを防ぐため
p.num[6]の下から24bit目(216bit目、第215bit)を1にする
qが280bitより小さな因数になるのを防ぐため
q.num[8]の下から24bit目(280bit目、第279bit)を1にする
これにより、nが496bitを下回ることはない

p,qをRSAに適する素数にする変換則
qをq以上で最小の擬素数とする
pをp以上で最小の擬素数とする

(p-1)(q-1)とe=65537が互いに素 かつ
t = 0x7743,de ≡ 1 mod(p-1)(q-1),n = pq なるt,d,nに対し
t^ed ≡ t (mod n)が成立

を満たすp,qが出るまでp+=2,q+=2して素数テストから繰り返す
ただし生成失敗回数(300=RSACreateGiveup)を超えるとエラー

こうして生成したnを公開鍵、dを秘密鍵と称する
文字列に変換する際は上記変換則を用いて86文字とする

3)署名ルール
RSA暗号化 m^d ≡ c (mod n)
に使用するmの変換ルール

与えられた署名対象ハッシュ文字列をMes[0-63]とする
64byteに満たない場合、空きには0が仮定され、
超える場合は超えた部分は無視される

m.num[0-15] := Mes[0-63](64byte)
(little-endianで処理する。Mesの最初のバイトはmの最下位バイト)
Powered by shinGETsu.