block4
code:block3_hash
0x5e4f2654183258bd3b89ebd4635aa290cd70635b9bf72c3085468bec94ddcf0f
Agenda
RSA暗号について
RSA 暗号とは大きな「素数×素数」の因数分解が難しいことを利用した暗号
RSA 暗号は次の式で表現できる
$ 暗号文 = 平文^e mod N
暗号化したいものを e 乗して、mod N をとったもの
公開鍵にあたるものは
e と N の組が公開鍵
$ 平文 = 暗号文^d mod N
暗号文を d 乗して、mod N をとったもの
秘密鍵にあたるものは
d と N の組が秘密鍵
RSA デジタル署名は次の式で表現できる
$ 署名データ = メッセージ^d mod N
署名対象のメッセージを d 乗して、mod N をとったもの
$ メッセージ = 署名データ^e mod N
署名データを e 乗して、mod N をとったものをメッセージと比較する
どうやって d e N を用意するか?つまり、どうやって鍵ペアを生成するか?
下記の手順で生成する
1. N を用意する
大きな素数 p と q を生成する、普通は乱数生成器を使って見つける
1024 だったり、2048 だったりは、ここの p と q のビット数
$ 2^{2048}
10進数だと 617 桁以上
p と q をかけ合わせたものを N とする #todo なんでかけ合わせるのか $ N = p \times q
素因数分解問題hide.icon
2. L (鍵ペア生成時のみに利用される数)を用意する #todo L は p-1 q-1 の最小公倍数 - Least common multiple
$ L = lcm(p-1, q - 1)
下記の条件を満たす e
1 < e < L
e と L の最大公約数は 1
互いに素であるということ
よく見かける 65537 は、固定的に使われている
exponent hide.icon
4. d を用意する
1 < d < L
$ (e \times d) mod L = 1
PKCS#1 Ver1.5
メッセージ M に対し,次のようにブロック EB をパディング文字列 PS を用いて構成する.
EB = 00 || BT || PS || 00 || M
ここで,BT はブロックタイプで秘密鍵を用いた処理(署名)の場合 0x01,公開鍵を用いた処理(暗号化)の場合 0x02 の値を取る.
パディング文字列 PS は,k - 3 - |M| 個の文字(バイト)から構成される.ここで,k は鍵長である.パディング文字列 PS の値は,BT が 0x01 のとき FF,BT が 0x02 のとき 0 でない乱数バイトを設定する.この乱数バイトは各暗号化プロセスごとに異なった乱数を設定することが推奨されている.
メッセージ M の長さは,k - 11 より大きくてはならない.これは,少なくともパディング文字列 PS を 8 文字以上にするためで,セキュリティ上必要である.
ブロック EB の先頭の 0 を除いて次に現れる 0 までがパディング文字と判断でき,元のメッセージを取り出すことができる.
* #todo と記載したところはどういう数学的な根拠があるのか理解できていないところなので理解したい $ メッセージ = 署名データ^e mod M
昨日の勉強会 block3 の hash 登録を忘れていたので今日やった! digestinfo
pkcs1
modulus は N
PKCS-1.0 and PKCS-1.1
The length of the hash must be 11 bytes shorter than the number of bytes required to contain the modulus of the RSA key.
なぜ 11 bytes かわからないけど、そういう仕様?
staticcall
staticcall(sub(gas(), 2000), 5, add(input,0x20), inputlen, add(decipher,0x20), decipherlen)
gas, target contract address, input, input size, output, output size
precompiled contract
mod のやつ
gas
gas still available to execution
Note
暗号化/復号
RSA
公開鍵暗号
素因数分解問題
離散対数問題
暗号化
暗号文 = RSAEncrypt(平文, 公開鍵)
e mod N ≒ 公開鍵
* mod N をしている理由は、これがないと暗号文と e を知っていると暗号文の計算が容易になるから
ここで mod をつかうことで離散対数問題により計算を難しくしている
mod N ないバージョン
e = 3
平文 = 5
暗号文 = 125
mod N あるバージョン
N = 7
e = 3
平文 = 5
暗号文 = 6
6 = X^3 mod 7
復号
平文 = RSADecrypt(暗号文, 秘密鍵)
d mod N ≒ 秘密鍵
デジタル署名
署名データ == 暗号文 = RSAEncrypt(平文, 秘密鍵)
d mod N ≒ 秘密鍵
平文 = RSADecrypt(署名データ, 公開鍵)
e mod N ≒ 公開鍵
input の join は外でやってもいいかも