99 lines
2.2 KiB
Markdown
99 lines
2.2 KiB
Markdown
# RSAとは
|
|
|
|
RSAは公開鍵暗号(非対称鍵暗号)の代表例です。
|
|
RSAでは以下の3つの値が重要です。
|
|
|
|
| 名前 | 記号 | 役割 |
|
|
| ---------- | ---- | ---------------------------- |
|
|
| モジュラス | N | 公開鍵・秘密鍵で共通 |
|
|
| 公開指数 | e | 公開鍵側(暗号化・署名検証) |
|
|
| 秘密指数 | d | 秘密鍵側(復号・署名生成) |
|
|
|
|
## RSAの基本的な使い方
|
|
|
|
### 機密情報の暗号化
|
|
|
|
```
|
|
暗号化: C = M^e mod N
|
|
復号: M = C^d mod N
|
|
```
|
|
|
|
* 公開鍵(e, N)で暗号化
|
|
* 秘密鍵(d, N)で復号
|
|
|
|
第三者は復号できない
|
|
|
|
```plantuml
|
|
@startuml
|
|
title RSA Encryption (Confidentiality)
|
|
|
|
actor Sender
|
|
actor Receiver
|
|
|
|
participant "Public Key\n(e, N)" as Pub
|
|
participant "Private Key\n(d, N)" as Priv
|
|
|
|
note over Sender,Receiver
|
|
公開鍵で暗号化し\n秘密鍵で復号する
|
|
end note
|
|
|
|
Sender -> Pub : Encrypt M\nC = M^e mod N
|
|
Pub --> Sender : Ciphertext C
|
|
Sender -> Receiver : Send C
|
|
Receiver -> Priv : Decrypt C\nM = C^d mod N
|
|
Priv --> Receiver : Plaintext M
|
|
|
|
@enduml
|
|
```
|
|
|
|
### デジタル署名
|
|
|
|
```
|
|
署名生成: S = M^d mod N
|
|
署名検証: M = S^e mod N
|
|
```
|
|
|
|
秘密鍵で「暗号化」して公開鍵で「復号」
|
|
→ 本人が署名したことを証明。
|
|
|
|
|
|
```plantuml
|
|
@startuml
|
|
title RSA Digital Signature
|
|
|
|
actor Sender
|
|
actor Receiver
|
|
|
|
participant "Private Key\n(d, N)" as Priv
|
|
participant "Public Key\n(e, N)" as Pub
|
|
|
|
note over Sender,Receiver
|
|
秘密鍵で署名し\n公開鍵で検証する
|
|
end note
|
|
|
|
Sender -> Priv : Sign H(M)\nSig = H(M)^d mod N
|
|
Priv --> Sender : Signature Sig
|
|
Sender -> Receiver : Send (M, Sig)
|
|
Receiver -> Pub : Verify Sig\nH'(M) = Sig^e mod N
|
|
Pub --> Receiver : Recovered hash H'(M)
|
|
Receiver -> Receiver : Compare\nH'(M) == H(M)
|
|
|
|
@enduml
|
|
```
|
|
|
|
デジタル署名は「暗号化(秘匿)」ではなく、
|
|
「正しさ・本人性の保証」なので
|
|
中身は隠し手おらず読めます。
|
|
|
|
|
|
|
|
### ビット数
|
|
|
|
| Nのビット長 | 現実的な安全性 |
|
|
| ----------- | -------------- |
|
|
| 256bit | 一瞬で破られる |
|
|
| 512bit | 数日〜数週間 |
|
|
| 1024bit | もはや危険 |
|
|
| 2048bit | 現在の標準 |
|
|
| 3072bit | 長期利用向け |
|