7.デジタル署名
"数字签名 --- 消息到底是谁写的"
この章では、デジタル署名の関連知識を学びます。デジタル署名は、コンピュータの世界ではスタンプ、署名技術機能の現実の世界と同じです。デジタル署名を使用すると、改ざんや偽装を識別することができます、だけでなく、拒否を防ぐために。
デジタル署名メッセージから7.1認定
制限事項メッセージ認証コード
第6章で説明したメッセージ認証コードを使用することにより、我々は、メッセージの整合性を検証することができる、メッセージがでたり、送信者の身元を偽装している場合は改ざんされているかどうかを識別することができ、メッセージも認証することができます。メッセージ認証コードが拒否防止することができないので、しかし、そのような使用は、シーンのメッセージ認証コードに約束手形を発行することはできません。
メッセージ認証コードの必要性は、送信者と受信者アリスボブの間に同じ鍵を共有するため、メッセージ認証コードを防止することができない理由は、拒否されました。送信者キーだけでなく、共有されているため、正しいMAC値を計算することができ、正しいメッセージ認証コードMAC計算値アリス、ボブの受信者を使用することが可能です。アリスとボブ両側が正しいMAC値を計算することができますので、第三者のために、私たちは、これは確かにアリスによって生成されたメッセージであることを証明することはできません。
デジタル署名を介して問題を解決
脳の体操を、次の起動してください。送信者アリスと、アリスとボブ異なるキーを使用して、それぞれのあるキーを、共有するための受信機ボブの必要性があるとします。
私たちは、アリスが使用する鍵は自分だけに知られている唯一の秘密鍵であることを前提としています。アリスがメッセージを送信すると、彼女は秘密鍵で「署名」を作成します。対照的に、受信機ボブは異なるキーを使用して、アリスは、署名を検証します。ボブのキーを使用すると、メッセージの署名から生成することはできませんが、アリスは、あなたが署名がアリスのキーで計算されているかどうかを知ることができた手段、ボブのキーを使用して計算署名を検証することができます。そのような方法があった場合は、問題が改ざん識別することで、迷彩または拒否を防ぐには、右に行うことができますか?
実際には、この一見魔法の技術はすでに、これはデジタル署名(デジタルsignat.ure)で、出てきました。
7.2署名生成と検証
少しアップしてみましょう整頓。
デジタル署名技術では、以下の2つの動作の出現:
- メッセージの署名行動を生成します
- メッセージ署名の動作を検証します
メッセージの署名生成アリスは完全に、またとして知られているメッセージの送信者によって、この動作のを「メッセージに署名します。」署名を生成するメッセージの内容に基づいて、デジタル署名の値を計算することで、この動作手段は、「私は、メッセージの内容を支持します」。
デジタル署名を検証し、この動作のは、通常、完全にメッセージボブの受信者によって提供されるが、メッセージを確認するために、サードパーティのニーズによって行うことができ、ここで我々はビクター検証という名前を付けます当分の間、サードパーティです。結果は、署名を検証するメッセージの署名が本当にアリスに属しているかどうかを確認することで、検証は成功は署名は、署名がアリスのにも属していないことをアリスの故障手段に属していることを意味し、成功または失敗することができます。
デジタル署名では、それぞれの秘密鍵を用いて署名を生成および検証の両方の活動が行われる必要があります。
アリスは、署名されたメッセージを生成するために、「署名鍵」を使用し、ボブとVictor使用署名「認証キー」は、メッセージを検証します。認証キーを使用してデジタル署名と鍵署名検証鍵の区別は、署名を生成することができません。これは非常に重要です。また、署名鍵署名は、人によって保持することができ、及び検証鍵は、すべての人の缶ホールドの署名を検証する必要があります。
ただ、この部分について話しました、お馴染みのものはまだないのですか?
はい、これは我々が非対称暗号化について語ったものです。上記発言する公開鍵暗号とデジタル署名の構造は非常に似ています。非対称暗号化では、暗号化鍵と復号鍵への鍵は、暗号化キーを使用して解読することはできません。また、復号鍵のみを復号化するために必要とする人々によって保持することができ、暗号化キーは、暗号化を必要とする人が保持することができます。あなたは、デジタル署名を確認し、非対称暗号化はそれのようではないでしょうか?
実際には、デジタル署名と非対称暗号化は非常に密接な関係を有している、要するに、デジタル署名は、非対称暗号化を介している「逆に」実現。私たちは、キーを要約下記は、テーブルを使用することです:
プライベートキー | 公開鍵 | |
---|---|---|
非対称暗号化 | 受信者の暗号化を解除するために使用します | 使用して、送信者の暗号化 |
デジタル署名 | 署名署名者を生成するために使用されます | 署名検証を検証するために使用されます |
鍵を誰が保持しますか? | 個人によって開催 | 必要な限り、誰もが保持することができます |
7.3非対称暗号化とデジタル署名
ここで私たちは、非対称暗号化とデジタル署名の詳細との関係についてお話しましょう。
デジタル署名を実現するために、我々は、第4章で説明した非対称暗号化を使用することができます。非対称暗号化キーは、公開鍵が復号用の秘密鍵を暗号化するために使用され、公開鍵と秘密鍵のペアを含みます。
デジタル署名は、また、秘密鍵と公開鍵のペアが、非対称暗号化の使用を使用し、2つのキーが秘密鍵が署名生成、公開鍵に対応する復号化と暗号化された反対側、すなわち、あります署名を検証することと等価。「と今度は」最終的にはどのような状況であるかを理解するために、2つを比較して示してください。
なぜ暗号化された署名、署名検証を生成することと等価であると復号化は、それに相当しているのですか?これを理解するために、私たちはリコール知識非対称暗号化に必要な2つの重要ペアの間の厳密な数学的関係の存在を構成する、と彼らは解体することができないパートナーであること、について話しました。
公共の結果の暗号文で暗号化されただけで、公開鍵暗号解読に秘密鍵とペアにすることができます:暗号文は唯一の秘密鍵とペアにされる公開鍵を使用することができた秘密鍵で、同様に解読。成功した暗号文を復号化する公開鍵言い換えれば、我々は暗号文でこれを証明することができます取得した公開鍵、秘密鍵暗号とペアになっています。
この動作は、秘密鍵だけを持っている人によって行うことができ、秘密鍵で暗号化され、それは、我々は、署名の御馳走として、暗号文の秘密鍵で暗号化することができるという事実に基づいています。
誰もが誰もが署名を検証できるという大きな利点を作成し、公開鍵と復号化することができるので、公開するので、一般に公開されています。
7.3デジタル署名法
私たちは、デジタル署名を生成し、検証するための2つの特定の方法をご紹介しましょう。
- ダイレクトメッセージの署名方法
- メッセージのハッシュ値の署名方法
簡単にメッセージの直接メソッドシグネチャは理解するが、実際には使用しないでください。メッセージの署名方式のハッシュ値は、もう少し複雑ですが、実際には、我々は一般的に、このメソッドを使用します。
メッセージの直接的なメソッドシグネチャを使用して、メッセージ全体を暗号化する必要があり、時間のかかる非対称暗号化アルゴリズムは非常に遅れているので、。だから、私たちは、自分たちが代わりに行う非常に短いデータメッセージを生成することができますか?これは一方向ハッシュ関数です。
私たちは、暗号化する必要がないように(すなわち、メッセージに署名)が、長い最初のメッセージのハッシュ値などとしてメッセージ全体の一方向ハッシュ関数によって決定され、その後、ハッシュ値(署名したハッシュ値)上を暗号化し、それは。ハッシュ値がいつも短いメッセージ、その暗号化されて(署名)が非常に簡単ですどのくらいどんなに。
メッセージ一方向ハッシュ関数アリスの計算されたハッシュ値(1)。
(2)アリスは、その秘密鍵でハッシュ値を暗号化します。
用私钥加密散列值所得到的密文就是Alice对这条散列值的签名,由于只有Alice才持有自己的私钥因此, 除了Alice以外,其他人是无法生成相同的签名(密文)的。
(3)Alice将消息和签名发送给Bob。
(4)Bob用Alice的公钥对收到的签名进行解密。
如果收到的签名确实是用Alice的私钥进行加密而得到的密文(签名),那么用Alice的公钥应该能够正确 解密,解密的结果应该等于消息的散列值。如果收到的签名不是用Alice的私钥进行加密而得到的密文, 那么就无法用Alice的公钥正确解密(解密后得到的数据看起来是随机的)。
(5)Bob将签名解密后得到的散列值与Alice直接发送的消息的散列值进行对比。
如果两者一致,则签名验证成功;如果两者不一致,则签名验证失败。
我们将数字签名中生成签名和验证签名的过程整理成一张时间流程图 。
**Alice对消息的散列值签名, Bob验证签名**
**Alice对消息的散列值签名, Bob验证签名(按时间顺序)**
7.4 通过RSA实现数字签名
前边章节已经介绍过了如何通过自己编写的go代码生成非对称加密算法RSA的公钥和私钥文件, 假设公钥文件的文件名为 public.pem,私钥文件对应的文件名为 private.pem。
7.4.1 生成数字签名
func SignatureRSA() ([]byte, error) {
// 1. 从秘钥文件中读生成的秘钥内容
fp, err := os.Open("private.pem")
if err != nil {
return nil, errors.New("打开私钥文件 - private.pem 失败!!!")
}
// 2. 读文件内容
fileInfo, _ := fp.Stat()
all := make([]byte, fileInfo.Size())
_, err = fp.Read(all)
if err != nil {
return nil, errors.New("读文件内容失败!!!")
}
fmt.Println("文件内容: ", string(all))
// 3. 关闭文件
defer fp.Close()
// 4. 将数据解析成pem格式的数据块
block, _ := pem.Decode(all)
// 5. 解析pem数据块, 得到私钥
priv_Key, err := x509.ParsePKCS1PrivateKey(block.Bytes)
if err != nil {
return nil, errors.New("解析私钥失败!!!")
}
// 待签名数据
myData := []byte("渡远荆门外,来从楚国游。山随平野尽,江入大荒流。月下飞天境,云生结海楼。仍怜故乡水,万里送行舟。")
// 6. 将数据通过哈希函数生成信息摘要
myHash := sha256.New()
myHash.Write(myData)
result := myHash.Sum(nil)
// 7. 生成签名
mySignature, err := rsa.SignPKCS1v15(rand.Reader, priv_Key, crypto.SHA256, result)
if err != nil {
return nil, errors.New("生成签名失败!!!")
}
return mySignature, nil
}
7.4.2 验证数字签名
func VerifyRSA(src []byte) (error){
// 1. 从秘钥文件中读生成的秘钥内容
fp, err := os.Open("public.pem")
if err != nil {
return errors.New("打开公钥文件 - public.pem 失败!!!")
}
// 2. 读文件内容
fileInfo, _ := fp.Stat()
all := make([]byte, fileInfo.Size())
num, err := fp.Read(all)
if err != nil {
return errors.New("读文件内容失败!!!")
}
fmt.Println("文件大小: ", num)
// 3. 关闭文件
defer fp.Close()
// 4. 将公钥数据解析为pem格式的数据块
block, _ := pem.Decode(all)
// 5. 将公钥从pem数据块中提取出来
pubInterface, err := x509.ParsePKIXPublicKey(block.Bytes)
if err != nil {
return errors.New("解析公钥失败!!!")
}
// 6. 公钥接口转换为公钥对象
pubKey := pubInterface.(*rsa.PublicKey)
// 待认证数据
myData := []byte("渡远荆门外,来从楚国游。山随平野尽,江入大荒流。月下飞天境,云生结海楼。仍怜故乡水,万里送行舟。")
// 7. 将数据通过哈希函数生成信息摘要
myHash := sha256.New()
myHash.Write(myData)
result := myHash.Sum(nil)
// 7. 数据认证
err = rsa.VerifyPKCS1v15(pubKey, crypto.SHA256, result, src)
if err != nil {
return err
}
fmt.Println("数字签名验证成功, 恭喜o(* ̄︶ ̄*)o恭喜")
return nil
}
7.5 使用椭圆曲线实现数字签名
7.6 数字签名无法解决的问题
用数字签名既可以识别出篡改和伪装,还可以防止否认。也就是说,我们同时实现了确认消息的完整性、进行认证以及否认防止。现代社会中的计算机通信从这一技术中获益匪浅。
然而,要正确使用数字签名,有一个大前提,那是用于验证签名的公钥必须属于真正的发送者。即便数字签名算法再强大,如果你得到的公钥是伪造的,那么数字签名也会完全失效。
现在我们发现自己陷人了一个死循环一一一数字签名是用来识别消息篡改、伪装以及否认的,但是为此我们又必须从没有被伪装的发送者得到没有被篡改的公钥才行。
为了能够确认自己得到的公钥是否合法,我们需要使用证书。所谓证书,就是将公钥当作一条消息,由一个可信的第三方对其签名后所得到的公钥。
当然,这样的方法只是把问题转移了而已。为了对证书上施加的数字签名进行验证,我们必定需要另一个公钥,那么如何才能构筑一个可信的数字签名链条呢?又由谁来颁发可信的证书呢?到这一步,我们就已经踏人了社会学的领域。我们需要让公钥以及数字签名技术成为一种社会性的基础设施,即公钥基础设施(Public Key Intrastructure),简称PKIO关于证书和PKI我们将在第8章中介绍。