From 2dc03dbe1ff717df8c95b1d58d3569a80c94799e Mon Sep 17 00:00:00 2001 From: odyssey <32955570+NB-STAR@users.noreply.github.com> Date: Mon, 25 Feb 2019 20:29:55 +0800 Subject: [PATCH] Crypto add (#17) * add some crypto lesson * change some crypto lesson --- doc/CRYPT-1_密码学导论.md | 520 +++++++++++++++ doc/CRYPT-2_流密码.md | 506 +++++++++++++++ doc/CRYPT-3_分组密码.md | 409 ++++++++++++ doc/CRYPT-4_公钥密码.md | 749 ++++++++++++++++++++++ doc/CRYPT-5_消息认证和哈希(杂凑)函数.md | 618 ++++++++++++++++++ doc/CRYPT-6_数字签名.md | 629 ++++++++++++++++++ doc/CRYPT-7_密码协议.md | 375 +++++++++++ doc/CRYPT-8_密钥分配与管理.md | 440 +++++++++++++ doc/CRYPT-9_数字货币.md | 347 ++++++++++ doc/files/1-1-1.png | Bin 0 -> 79285 bytes doc/files/1-2-1-2.png | Bin 0 -> 31784 bytes doc/files/1-2-1-3.png | Bin 0 -> 39740 bytes doc/files/1-2-1.png | Bin 0 -> 14910 bytes doc/files/1-2-4.png | Bin 0 -> 18088 bytes doc/files/1-3-10.png | Bin 0 -> 92680 bytes doc/files/1-3-11.png | Bin 0 -> 68271 bytes doc/files/1-3-12.png | Bin 0 -> 148139 bytes doc/files/1-3-13.png | Bin 0 -> 9701 bytes doc/files/1-3-3.png | Bin 0 -> 42808 bytes doc/files/1-3-4.png | Bin 0 -> 53979 bytes doc/files/1-3-5.png | Bin 0 -> 9095 bytes doc/files/1-3-6-2.png | Bin 0 -> 39328 bytes doc/files/1-3-6.png | Bin 0 -> 23607 bytes doc/files/1-3-7-2.png | Bin 0 -> 17085 bytes doc/files/1-3-7.png | Bin 0 -> 8877 bytes doc/files/1-3-9.png | Bin 0 -> 8156 bytes doc/files/1-4-1.png | Bin 0 -> 183625 bytes doc/files/1-4-2-2.png | Bin 0 -> 96229 bytes doc/files/1-4-2-3.png | Bin 0 -> 15093 bytes doc/files/1-4-2.png | Bin 0 -> 28807 bytes doc/files/1-4-3-2.png | Bin 0 -> 5196 bytes doc/files/1-4-3-3.png | Bin 0 -> 5503 bytes doc/files/1-4-3.png | Bin 0 -> 8208 bytes doc/files/1-4-4-2.png | Bin 0 -> 304399 bytes doc/files/1-4-4.png | Bin 0 -> 61784 bytes doc/files/1-4-5-2.png | Bin 0 -> 244813 bytes doc/files/1-4-5-3.png | Bin 0 -> 213589 bytes doc/files/1-4-5-4.png | Bin 0 -> 156829 bytes doc/files/1-4-5-5.png | Bin 0 -> 276493 bytes doc/files/1-4-5-6.png | Bin 0 -> 38326 bytes doc/files/1-4-5.png | Bin 0 -> 240692 bytes doc/files/1-4-7.png | Bin 0 -> 111977 bytes doc/files/1532172224.jpg | Bin 0 -> 72850 bytes doc/files/1532172225.jpg | Bin 0 -> 78302 bytes doc/files/2-1-1.png | Bin 0 -> 16862 bytes doc/files/2-1-2-2.png | Bin 0 -> 40106 bytes doc/files/2-1-2.png | Bin 0 -> 4076 bytes doc/files/2-1-3.png | Bin 0 -> 6964 bytes doc/files/2-1-5.png | Bin 0 -> 9643 bytes doc/files/2-2-1-2.png | Bin 0 -> 5936 bytes doc/files/2-2-1-3.png | Bin 0 -> 6648 bytes doc/files/2-2-1-4.png | Bin 0 -> 7312 bytes doc/files/2-2-1-5.png | Bin 0 -> 3157 bytes doc/files/2-2-1-6.png | Bin 0 -> 3295 bytes doc/files/2-2-1.png | Bin 0 -> 11465 bytes doc/files/2-3-1-2.png | Bin 0 -> 8192 bytes doc/files/2-3-1.png | Bin 0 -> 6350 bytes doc/files/2-4-1-2.png | Bin 0 -> 6410 bytes doc/files/2-4-1-3.png | Bin 0 -> 2780 bytes doc/files/2-4-1-4.png | Bin 0 -> 3569 bytes doc/files/2-4-1-5.png | Bin 0 -> 36827 bytes doc/files/2-4-1.png | Bin 0 -> 23668 bytes doc/files/2-4-2-2.png | Bin 0 -> 22215 bytes doc/files/2-4-2-3.png | Bin 0 -> 3911 bytes doc/files/2-4-2-4.png | Bin 0 -> 9542 bytes doc/files/2-4-2-5.png | Bin 0 -> 5166 bytes doc/files/2-4-2.png | Bin 0 -> 2866 bytes doc/files/2-4-3.png | Bin 0 -> 54945 bytes doc/files/2-4-4-2.png | Bin 0 -> 4236 bytes doc/files/2-4-4-3.png | Bin 0 -> 2851 bytes doc/files/2-4-4-4.png | Bin 0 -> 2911 bytes doc/files/2-4-4.png | Bin 0 -> 15818 bytes doc/files/2-4-5.png | Bin 0 -> 78842 bytes doc/files/2-5-1.png | Bin 0 -> 38179 bytes doc/files/2-5-4-2.png | Bin 0 -> 8397 bytes doc/files/2018-04-02-16-50-51.png | Bin 0 -> 23119 bytes doc/files/2018-04-02-16-51-45.png | Bin 0 -> 160284 bytes doc/files/2018-04-02-16-52-02.png | Bin 0 -> 53221 bytes doc/files/2018-04-02-16-52-33.png | Bin 0 -> 198691 bytes doc/files/2018-04-02-16-54-38.png | Bin 0 -> 93209 bytes doc/files/2018-04-02-16-55-28.png | Bin 0 -> 94906 bytes doc/files/2018-04-02-16-56-04.png | Bin 0 -> 171143 bytes doc/files/2018-04-02-16-56-36.png | Bin 0 -> 169666 bytes doc/files/2018-04-02-16-56-51.png | Bin 0 -> 153955 bytes doc/files/2018-04-02-16-57-26.png | Bin 0 -> 182209 bytes doc/files/2018-04-02-16-58-51.png | Bin 0 -> 103415 bytes doc/files/2018-04-02-16-59-29.png | Bin 0 -> 155543 bytes doc/files/2018-04-02-16-59-50.png | Bin 0 -> 189116 bytes doc/files/2018-04-02-17-00-16.png | Bin 0 -> 50716 bytes doc/files/2018-04-02-17-00-38.png | Bin 0 -> 150962 bytes doc/files/2018-04-02-17-01-03.png | Bin 0 -> 59066 bytes doc/files/2018-04-08-12-05-44.png | Bin 0 -> 25616 bytes doc/files/2018-04-10-09-06-26.png | Bin 0 -> 47458 bytes doc/files/2018-04-10-09-12-21.png | Bin 0 -> 72335 bytes doc/files/2018-04-10-14-56-24.png | Bin 0 -> 119848 bytes doc/files/2018-04-10-15-11-18.png | Bin 0 -> 23845 bytes doc/files/2018-04-10-15-18-28.png | Bin 0 -> 65813 bytes doc/files/2018-04-10-15-52-46.png | Bin 0 -> 68697 bytes doc/files/2018-04-10-15-56-02.png | Bin 0 -> 19014 bytes doc/files/2018-04-10-15-58-02.png | Bin 0 -> 68580 bytes doc/files/2018-04-10-16-00-18.png | Bin 0 -> 69022 bytes doc/files/2018-04-10-16-01-22.png | Bin 0 -> 412311 bytes doc/files/2018-04-10-16-04-43.png | Bin 0 -> 91983 bytes doc/files/2018-04-10-16-08-50.png | Bin 0 -> 92933 bytes doc/files/2018-04-10-16-10-15.png | Bin 0 -> 90424 bytes doc/files/2018-04-10-16-12-53.png | Bin 0 -> 46989 bytes doc/files/2018-04-10-16-16-30.png | Bin 0 -> 51701 bytes doc/files/2018-04-10-16-20-27.png | Bin 0 -> 46794 bytes doc/files/2018-04-10-16-29-52.png | Bin 0 -> 68979 bytes doc/files/2018-04-10-16-31-30.png | Bin 0 -> 62988 bytes doc/files/2018-04-10-16-32-00.png | Bin 0 -> 63910 bytes doc/files/2018-04-10-16-38-12.png | Bin 0 -> 21184 bytes doc/files/2018-04-10-16-40-23.png | Bin 0 -> 35870 bytes doc/files/2018-04-10-16-46-08.png | Bin 0 -> 85269 bytes doc/files/2018-04-10-16-48-05.png | Bin 0 -> 81858 bytes doc/files/2018-04-10-16-50-52.png | Bin 0 -> 47080 bytes doc/files/2018-04-10-16-54-18.png | Bin 0 -> 87132 bytes doc/files/2018-04-10-16-59-10.png | Bin 0 -> 58738 bytes doc/files/2018-04-10-17-01-38.png | Bin 0 -> 150689 bytes doc/files/2018-04-11-09-06-24.png | Bin 0 -> 29816 bytes doc/files/2018-04-11-09-16-11.png | Bin 0 -> 83355 bytes doc/files/2018-04-11-09-53-16.png | Bin 0 -> 119932 bytes doc/files/2018-04-11-16-38-23.png | Bin 0 -> 110347 bytes doc/files/2018-04-11-16-40-40.png | Bin 0 -> 40552 bytes doc/files/2018-04-11-17-04-37.png | Bin 0 -> 78852 bytes doc/files/2018-04-11-17-12-47.png | Bin 0 -> 44818 bytes doc/files/2018-04-12-09-15-13.png | Bin 0 -> 44818 bytes doc/files/2018-04-12-09-23-54.png | Bin 0 -> 48377 bytes doc/files/2018-04-12-09-29-07.png | Bin 0 -> 26075 bytes doc/files/2018-04-12-09-40-24.png | Bin 0 -> 154546 bytes doc/files/2018-04-12-09-48-05.png | Bin 0 -> 101213 bytes doc/files/2018-05-15-11-28-30.png | Bin 0 -> 25816 bytes doc/files/2018-05-15-11-40-03.png | Bin 0 -> 50614 bytes doc/files/2018-05-15-16-12-55.png | Bin 0 -> 24932 bytes doc/files/2018-05-15-16-26-52.png | Bin 0 -> 33731 bytes doc/files/2018-05-15-20-10-58.png | Bin 0 -> 13557 bytes doc/files/2018-05-15-20-11-28.png | Bin 0 -> 12461 bytes doc/files/3-1.png | Bin 0 -> 10010 bytes doc/files/3-2-1-2.png | Bin 0 -> 5805 bytes doc/files/3-2-1.png | Bin 0 -> 5647 bytes doc/files/3-2-2-2.png | Bin 0 -> 17297 bytes doc/files/3-2-2-3.png | Bin 0 -> 20484 bytes doc/files/3-2-2-4.png | Bin 0 -> 16349 bytes doc/files/3-2-2.png | Bin 0 -> 12438 bytes doc/files/3-2-3-2.png | Bin 0 -> 11501 bytes doc/files/3-2-3-3.png | Bin 0 -> 22876 bytes doc/files/3-2-3.png | Bin 0 -> 11456 bytes doc/files/3-2-4.png | Bin 0 -> 11941 bytes doc/files/3-2-5-2.png | Bin 0 -> 6170 bytes doc/files/3-2-5.png | Bin 0 -> 11324 bytes doc/files/3-3-1.png | Bin 0 -> 109370 bytes doc/files/3-3-2.png | Bin 0 -> 70066 bytes doc/files/3-4-1-2.png | Bin 0 -> 14520 bytes doc/files/3-4-1.png | Bin 0 -> 4043 bytes doc/files/3-4-2-2.png | Bin 0 -> 18119 bytes doc/files/3-4-2.png | Bin 0 -> 17171 bytes doc/files/3-4-3-2.png | Bin 0 -> 13940 bytes doc/files/3-4-3-3.png | Bin 0 -> 11587 bytes doc/files/3-4-3.png | Bin 0 -> 23778 bytes doc/files/3-4-4-1.png | Bin 0 -> 9411 bytes doc/files/3-4-4-2.png | Bin 0 -> 9426 bytes doc/files/3-4-4-3.png | Bin 0 -> 8670 bytes doc/files/3-4-4-4.png | Bin 0 -> 8723 bytes doc/files/3-4-4-5.png | Bin 0 -> 8640 bytes doc/files/3-4-4-6.png | Bin 0 -> 8707 bytes doc/files/3-4-4-7.png | Bin 0 -> 8620 bytes doc/files/3-4-4-8.png | Bin 0 -> 8651 bytes doc/files/3-4-4-9.png | Bin 0 -> 6507 bytes doc/files/3-4-4.png | Bin 0 -> 14023 bytes doc/files/3-4-5-2.png | Bin 0 -> 10234 bytes doc/files/3-4-5-3.png | Bin 0 -> 9168 bytes doc/files/3-4-5.png | Bin 0 -> 12483 bytes doc/files/3-5-1.png | Bin 0 -> 149257 bytes doc/files/3-5-2-2.png | Bin 0 -> 6042 bytes doc/files/3-5-2-3.png | Bin 0 -> 31417 bytes doc/files/3-5-2.png | Bin 0 -> 6026 bytes doc/files/4-2-10-2.png | Bin 0 -> 147710 bytes doc/files/4-2-10-3.png | Bin 0 -> 49790 bytes doc/files/4-2-10-4.png | Bin 0 -> 31671 bytes doc/files/4-2-10-5.png | Bin 0 -> 34125 bytes doc/files/4-2-10-6.png | Bin 0 -> 52056 bytes doc/files/4-2-10-7.png | Bin 0 -> 209134 bytes doc/files/4-2-10-8.png | Bin 0 -> 119439 bytes doc/files/4-2-10.png | Bin 0 -> 218996 bytes doc/files/4-2-8.png | Bin 0 -> 41974 bytes doc/files/4-3-1-2.png | Bin 0 -> 49750 bytes doc/files/4-3-1-3.png | Bin 0 -> 77759 bytes doc/files/4-3-1-4.png | Bin 0 -> 37217 bytes doc/files/4-3-1.png | Bin 0 -> 48905 bytes doc/files/4-3-2.png | Bin 0 -> 6702 bytes doc/files/4-3-3-2.png | Bin 0 -> 59617 bytes doc/files/4-3-3-3.png | Bin 0 -> 47018 bytes doc/files/4-3-3-4.png | Bin 0 -> 45947 bytes doc/files/4-3-3-5.png | Bin 0 -> 60192 bytes doc/files/4-3-3.png | Bin 0 -> 9403 bytes doc/files/4-3.png | Bin 0 -> 327518 bytes doc/files/5-1-1.png | Bin 0 -> 17839 bytes doc/files/5-1-2-2.png | Bin 0 -> 68907 bytes doc/files/5-1-2.png | Bin 0 -> 88264 bytes doc/files/5-1-3.png | Bin 0 -> 38224 bytes doc/files/5-2-1-2.png | Bin 0 -> 32034 bytes doc/files/5-2-1-3.png | Bin 0 -> 7982 bytes doc/files/5-2-1-4.png | Bin 0 -> 66407 bytes doc/files/5-2-1.png | Bin 0 -> 86466 bytes doc/files/5-3-1-2.png | Bin 0 -> 16549 bytes doc/files/5-3-1-3.png | Bin 0 -> 8184 bytes doc/files/5-3-1.png | Bin 0 -> 33539 bytes doc/files/5-4-1-2.png | Bin 0 -> 8932 bytes doc/files/5-4-1.png | Bin 0 -> 8604 bytes doc/files/5-4-2-2.png | Bin 0 -> 3465 bytes doc/files/5-4-2-3.png | Bin 0 -> 16842 bytes doc/files/5-4-2-4.png | Bin 0 -> 7555 bytes doc/files/5-4-2.png | Bin 0 -> 3561 bytes doc/files/6-1-1-b.png | Bin 0 -> 40226 bytes doc/files/6-1-1-c.png | Bin 0 -> 51636 bytes doc/files/6-1-1.png | Bin 0 -> 25442 bytes doc/files/6-1-2-2.png | Bin 0 -> 48163 bytes doc/files/6-1-2-3.png | Bin 0 -> 42653 bytes doc/files/6-1-2-4.png | Bin 0 -> 48047 bytes doc/files/6-1-2.png | Bin 0 -> 24178 bytes doc/files/6-1-3 2.png | Bin 0 -> 42287 bytes doc/files/6-1-3-2.png | Bin 0 -> 7195 bytes doc/files/6-1-3.png | Bin 0 -> 41460 bytes doc/files/6-1.png | Bin 0 -> 67038 bytes doc/files/6-3-3.png | Bin 0 -> 83531 bytes doc/files/6-4-1-2.png | Bin 0 -> 6454 bytes doc/files/6-4-1.png | Bin 0 -> 6566 bytes doc/files/6-4-5-2.png | Bin 0 -> 83195 bytes doc/files/6-4-5.png | Bin 0 -> 43189 bytes doc/files/6-4-6.png | Bin 0 -> 33626 bytes doc/files/6-4-8.png | Bin 0 -> 76021 bytes doc/files/6-5-1-2.png | Bin 0 -> 112840 bytes doc/files/6-5-1-3.png | Bin 0 -> 82386 bytes doc/files/6-5-1.png | Bin 0 -> 84458 bytes doc/files/6-6-1.png | Bin 0 -> 18270 bytes doc/files/6-6-2.png | Bin 0 -> 34800 bytes doc/files/k-1.png | Bin 0 -> 6196 bytes doc/files/k-2.png | Bin 0 -> 6176 bytes 238 files changed, 4593 insertions(+) create mode 100644 doc/CRYPT-1_密码学导论.md create mode 100644 doc/CRYPT-2_流密码.md create mode 100644 doc/CRYPT-3_分组密码.md create mode 100644 doc/CRYPT-4_公钥密码.md create mode 100644 doc/CRYPT-5_消息认证和哈希(杂凑)函数.md create mode 100644 doc/CRYPT-6_数字签名.md create mode 100644 doc/CRYPT-7_密码协议.md create mode 100644 doc/CRYPT-8_密钥分配与管理.md create mode 100644 doc/CRYPT-9_数字货币.md create mode 100644 doc/files/1-1-1.png create mode 100644 doc/files/1-2-1-2.png create mode 100644 doc/files/1-2-1-3.png create mode 100644 doc/files/1-2-1.png create mode 100644 doc/files/1-2-4.png create mode 100644 doc/files/1-3-10.png create mode 100644 doc/files/1-3-11.png create mode 100644 doc/files/1-3-12.png create mode 100644 doc/files/1-3-13.png create mode 100644 doc/files/1-3-3.png create mode 100644 doc/files/1-3-4.png create mode 100644 doc/files/1-3-5.png create mode 100644 doc/files/1-3-6-2.png create mode 100644 doc/files/1-3-6.png create mode 100644 doc/files/1-3-7-2.png create mode 100644 doc/files/1-3-7.png create mode 100644 doc/files/1-3-9.png create mode 100644 doc/files/1-4-1.png create mode 100644 doc/files/1-4-2-2.png create mode 100644 doc/files/1-4-2-3.png create mode 100644 doc/files/1-4-2.png create mode 100644 doc/files/1-4-3-2.png create mode 100644 doc/files/1-4-3-3.png create mode 100644 doc/files/1-4-3.png create mode 100644 doc/files/1-4-4-2.png create mode 100644 doc/files/1-4-4.png create mode 100644 doc/files/1-4-5-2.png create mode 100644 doc/files/1-4-5-3.png create mode 100644 doc/files/1-4-5-4.png create mode 100644 doc/files/1-4-5-5.png create mode 100644 doc/files/1-4-5-6.png create mode 100644 doc/files/1-4-5.png create mode 100644 doc/files/1-4-7.png create mode 100644 doc/files/1532172224.jpg create mode 100644 doc/files/1532172225.jpg create mode 100644 doc/files/2-1-1.png create mode 100644 doc/files/2-1-2-2.png create mode 100644 doc/files/2-1-2.png create mode 100644 doc/files/2-1-3.png create mode 100644 doc/files/2-1-5.png create mode 100644 doc/files/2-2-1-2.png create mode 100644 doc/files/2-2-1-3.png create mode 100644 doc/files/2-2-1-4.png create mode 100644 doc/files/2-2-1-5.png create mode 100644 doc/files/2-2-1-6.png create mode 100644 doc/files/2-2-1.png create mode 100644 doc/files/2-3-1-2.png create mode 100644 doc/files/2-3-1.png create mode 100644 doc/files/2-4-1-2.png create mode 100644 doc/files/2-4-1-3.png create mode 100644 doc/files/2-4-1-4.png create mode 100644 doc/files/2-4-1-5.png create mode 100644 doc/files/2-4-1.png create mode 100644 doc/files/2-4-2-2.png create mode 100644 doc/files/2-4-2-3.png create mode 100644 doc/files/2-4-2-4.png create mode 100644 doc/files/2-4-2-5.png create mode 100644 doc/files/2-4-2.png create mode 100644 doc/files/2-4-3.png create mode 100644 doc/files/2-4-4-2.png create mode 100644 doc/files/2-4-4-3.png create mode 100644 doc/files/2-4-4-4.png create mode 100644 doc/files/2-4-4.png create mode 100644 doc/files/2-4-5.png create mode 100644 doc/files/2-5-1.png create mode 100644 doc/files/2-5-4-2.png create mode 100644 doc/files/2018-04-02-16-50-51.png create mode 100644 doc/files/2018-04-02-16-51-45.png create mode 100644 doc/files/2018-04-02-16-52-02.png create mode 100644 doc/files/2018-04-02-16-52-33.png create mode 100644 doc/files/2018-04-02-16-54-38.png create mode 100644 doc/files/2018-04-02-16-55-28.png create mode 100644 doc/files/2018-04-02-16-56-04.png create mode 100644 doc/files/2018-04-02-16-56-36.png create mode 100644 doc/files/2018-04-02-16-56-51.png create mode 100644 doc/files/2018-04-02-16-57-26.png create mode 100644 doc/files/2018-04-02-16-58-51.png create mode 100644 doc/files/2018-04-02-16-59-29.png create mode 100644 doc/files/2018-04-02-16-59-50.png create mode 100644 doc/files/2018-04-02-17-00-16.png create mode 100644 doc/files/2018-04-02-17-00-38.png create mode 100644 doc/files/2018-04-02-17-01-03.png create mode 100644 doc/files/2018-04-08-12-05-44.png create mode 100644 doc/files/2018-04-10-09-06-26.png create mode 100644 doc/files/2018-04-10-09-12-21.png create mode 100644 doc/files/2018-04-10-14-56-24.png create mode 100644 doc/files/2018-04-10-15-11-18.png create mode 100644 doc/files/2018-04-10-15-18-28.png create mode 100644 doc/files/2018-04-10-15-52-46.png create mode 100644 doc/files/2018-04-10-15-56-02.png create mode 100644 doc/files/2018-04-10-15-58-02.png create mode 100644 doc/files/2018-04-10-16-00-18.png create mode 100644 doc/files/2018-04-10-16-01-22.png create mode 100644 doc/files/2018-04-10-16-04-43.png create mode 100644 doc/files/2018-04-10-16-08-50.png create mode 100644 doc/files/2018-04-10-16-10-15.png create mode 100644 doc/files/2018-04-10-16-12-53.png create mode 100644 doc/files/2018-04-10-16-16-30.png create mode 100644 doc/files/2018-04-10-16-20-27.png create mode 100644 doc/files/2018-04-10-16-29-52.png create mode 100644 doc/files/2018-04-10-16-31-30.png create mode 100644 doc/files/2018-04-10-16-32-00.png create mode 100644 doc/files/2018-04-10-16-38-12.png create mode 100644 doc/files/2018-04-10-16-40-23.png create mode 100644 doc/files/2018-04-10-16-46-08.png create mode 100644 doc/files/2018-04-10-16-48-05.png create mode 100644 doc/files/2018-04-10-16-50-52.png create mode 100644 doc/files/2018-04-10-16-54-18.png create mode 100644 doc/files/2018-04-10-16-59-10.png create mode 100644 doc/files/2018-04-10-17-01-38.png create mode 100644 doc/files/2018-04-11-09-06-24.png create mode 100644 doc/files/2018-04-11-09-16-11.png create mode 100644 doc/files/2018-04-11-09-53-16.png create mode 100644 doc/files/2018-04-11-16-38-23.png create mode 100644 doc/files/2018-04-11-16-40-40.png create mode 100644 doc/files/2018-04-11-17-04-37.png create mode 100644 doc/files/2018-04-11-17-12-47.png create mode 100644 doc/files/2018-04-12-09-15-13.png create mode 100644 doc/files/2018-04-12-09-23-54.png create mode 100644 doc/files/2018-04-12-09-29-07.png create mode 100644 doc/files/2018-04-12-09-40-24.png create mode 100644 doc/files/2018-04-12-09-48-05.png create mode 100644 doc/files/2018-05-15-11-28-30.png create mode 100644 doc/files/2018-05-15-11-40-03.png create mode 100644 doc/files/2018-05-15-16-12-55.png create mode 100644 doc/files/2018-05-15-16-26-52.png create mode 100644 doc/files/2018-05-15-20-10-58.png create mode 100644 doc/files/2018-05-15-20-11-28.png create mode 100644 doc/files/3-1.png create mode 100644 doc/files/3-2-1-2.png create mode 100644 doc/files/3-2-1.png create mode 100644 doc/files/3-2-2-2.png create mode 100644 doc/files/3-2-2-3.png create mode 100644 doc/files/3-2-2-4.png create mode 100644 doc/files/3-2-2.png create mode 100644 doc/files/3-2-3-2.png create mode 100644 doc/files/3-2-3-3.png create mode 100644 doc/files/3-2-3.png create mode 100644 doc/files/3-2-4.png create mode 100644 doc/files/3-2-5-2.png create mode 100644 doc/files/3-2-5.png create mode 100644 doc/files/3-3-1.png create mode 100644 doc/files/3-3-2.png create mode 100644 doc/files/3-4-1-2.png create mode 100644 doc/files/3-4-1.png create mode 100644 doc/files/3-4-2-2.png create mode 100644 doc/files/3-4-2.png create mode 100644 doc/files/3-4-3-2.png create mode 100644 doc/files/3-4-3-3.png create mode 100644 doc/files/3-4-3.png create mode 100644 doc/files/3-4-4-1.png create mode 100644 doc/files/3-4-4-2.png create mode 100644 doc/files/3-4-4-3.png create mode 100644 doc/files/3-4-4-4.png create mode 100644 doc/files/3-4-4-5.png create mode 100644 doc/files/3-4-4-6.png create mode 100644 doc/files/3-4-4-7.png create mode 100644 doc/files/3-4-4-8.png create mode 100644 doc/files/3-4-4-9.png create mode 100644 doc/files/3-4-4.png create mode 100644 doc/files/3-4-5-2.png create mode 100644 doc/files/3-4-5-3.png create mode 100644 doc/files/3-4-5.png create mode 100644 doc/files/3-5-1.png create mode 100644 doc/files/3-5-2-2.png create mode 100644 doc/files/3-5-2-3.png create mode 100644 doc/files/3-5-2.png create mode 100644 doc/files/4-2-10-2.png create mode 100644 doc/files/4-2-10-3.png create mode 100644 doc/files/4-2-10-4.png create mode 100644 doc/files/4-2-10-5.png create mode 100644 doc/files/4-2-10-6.png create mode 100644 doc/files/4-2-10-7.png create mode 100644 doc/files/4-2-10-8.png create mode 100644 doc/files/4-2-10.png create mode 100644 doc/files/4-2-8.png create mode 100644 doc/files/4-3-1-2.png create mode 100644 doc/files/4-3-1-3.png create mode 100644 doc/files/4-3-1-4.png create mode 100644 doc/files/4-3-1.png create mode 100644 doc/files/4-3-2.png create mode 100644 doc/files/4-3-3-2.png create mode 100644 doc/files/4-3-3-3.png create mode 100644 doc/files/4-3-3-4.png create mode 100644 doc/files/4-3-3-5.png create mode 100644 doc/files/4-3-3.png create mode 100644 doc/files/4-3.png create mode 100644 doc/files/5-1-1.png create mode 100644 doc/files/5-1-2-2.png create mode 100644 doc/files/5-1-2.png create mode 100644 doc/files/5-1-3.png create mode 100644 doc/files/5-2-1-2.png create mode 100644 doc/files/5-2-1-3.png create mode 100644 doc/files/5-2-1-4.png create mode 100644 doc/files/5-2-1.png create mode 100644 doc/files/5-3-1-2.png create mode 100644 doc/files/5-3-1-3.png create mode 100644 doc/files/5-3-1.png create mode 100644 doc/files/5-4-1-2.png create mode 100644 doc/files/5-4-1.png create mode 100644 doc/files/5-4-2-2.png create mode 100644 doc/files/5-4-2-3.png create mode 100644 doc/files/5-4-2-4.png create mode 100644 doc/files/5-4-2.png create mode 100644 doc/files/6-1-1-b.png create mode 100644 doc/files/6-1-1-c.png create mode 100644 doc/files/6-1-1.png create mode 100644 doc/files/6-1-2-2.png create mode 100644 doc/files/6-1-2-3.png create mode 100644 doc/files/6-1-2-4.png create mode 100644 doc/files/6-1-2.png create mode 100644 doc/files/6-1-3 2.png create mode 100644 doc/files/6-1-3-2.png create mode 100644 doc/files/6-1-3.png create mode 100644 doc/files/6-1.png create mode 100644 doc/files/6-3-3.png create mode 100644 doc/files/6-4-1-2.png create mode 100644 doc/files/6-4-1.png create mode 100644 doc/files/6-4-5-2.png create mode 100644 doc/files/6-4-5.png create mode 100644 doc/files/6-4-6.png create mode 100644 doc/files/6-4-8.png create mode 100644 doc/files/6-5-1-2.png create mode 100644 doc/files/6-5-1-3.png create mode 100644 doc/files/6-5-1.png create mode 100644 doc/files/6-6-1.png create mode 100644 doc/files/6-6-2.png create mode 100644 doc/files/k-1.png create mode 100644 doc/files/k-2.png diff --git a/doc/CRYPT-1_密码学导论.md b/doc/CRYPT-1_密码学导论.md new file mode 100644 index 0000000..05e07d0 --- /dev/null +++ b/doc/CRYPT-1_密码学导论.md @@ -0,0 +1,520 @@ +# CRYPT-1 密码学导论 + +**author:Odyssey@cyberpeace** + +## 知识点 +- 密码体制 +- 古典密码 +- 密码安全性 + +## 学习目标 +- 掌握密码技术的基本思想 +- 掌握密码体制的组成结构 +- 熟悉置换、代替和代数等古典密码的编码方法 +- 掌握密码体制的分类 +- 掌握密码安全性的概念 +- 了解密码在信息安全领域的实际应用 + + +## 目录 +1.1 密码学基本思想 +1.2 密码体制组成 +1.3 古典密码学 +1.4 单表置换密码 +1.5 多表置换密码 + + +### 1.1 密码学基本思想 + +**为什么会有密码学** +![](files/1-1-1.png) + +**密码学的定义** +密码学是构建和分析不同加密解密方法的科学,该科学实际上包含两个部分: +- 密码使用学是构建功能更强大、更有效的新密码的加密解密方法的科学。 +- 密码分析学则是发现已有加密法的弱点,以便不用密钥就能还原成明文的科学。 + +密码分析是确保密码体制安全的唯一方法,是密码学不可缺少的部分。密码学与通信有着密不可分的关系,往往还能决定着战争的胜负。 + +**密码与信息安全** + +- 密码总会被破解 +- 密码的算法总会被公开 +- 弱密码比不加密更危险 +- 密码只是信息安全的一部分 + +**安全性原则** + +- 计算安全性 +- 可证明安全性 +- 无条件安全性 + +### 1.2 密码学分类 + +- 密码使用学 +- 密码分析学 + +#### 1.2.1 密码使用学分类 + +- 无秘钥算法 +- 对称秘钥算法 +- 公开秘钥算法 + +![](files/1-2-1.png) + +**对称密钥算法** +双方共享一个密钥,并使用相同的加密和解密方法。 +![](files/1-2-1-2.png) + +**对称密钥算法** + +对称密钥算法重要术语: + +明文:被传递的消息。用M表示,它可能是位序列、文本文件、位图、数字化的语音序列或数字化的视频图像等。对于计算机,M指的是二进制数据。 + +密文:加密后的消息。用C表示,对于计算机,C指的是二进制数据。 + +加密函数:作用于明文M得到密文C,用E表示。 +>数学公式:𝐶=𝐸(𝑀) + +解密函数:作用于密文C还原明文M,用D表示。 +>数学公式:𝑀=𝐷(𝐶) + +先加密后解密,原始明文将恢复:𝐷(𝐸(𝑀))=𝑀 + +**公开密钥算法** + +公钥密码体制使用不同的加密密钥与解密密钥,是一种“由已知加密密钥推导出解密密钥在计算上是不可行的”密码体制。解密密钥是接收者专用的秘钥,对其他人都保密。 + +![](files/1-2-1-3.png) + +公开密钥算法重要术语: + +发送者 A 用 B 的公钥 PKB 对明文 X 加密(E 运算)后,在接收者 B 用自己的私钥 SKB 解密(D 运算),即可恢复出明文: +$$D_{SK_{B}}(Y)=D_{SK_{B}}(E_{PK_B}(X))=X$$ +加密密钥是公开的,但不能用它来解密,即: +$$D_{PK_B}(E_{PK_B}(X))\neq X$$ + +#### 1.2.2 密码分析学分类 + +![](files/1-2-4.png) + +### 1.3 古典密码学 + +#### 1.3.1 古今密码学 + +密码学已经存在了几千年,密码学一词源于希腊语kryptós“隐藏的”,和gráphein“书写”。古典密码学的编码和破译通常依赖于设计者和敌手的创造力与技巧,作为一种实用性艺术存在,并没有对于密码学原理的清晰定义。而现代密码学则起源于20世纪末出现的大量相关理论,这些理论使得现代密码学成为了一种可以系统而严格地学习的科学。 + +#### 1.3.2 常见替换密码 + +单表替换加密法:明文中的同一字母在加密时被同一固定的字母代换。 +- 凯撒密码 +- 简单替换密码 +- 仿射密码 +- Polybius密码 + +多表替换加密法:明文中的同一字母在加密时不是完全被同一固定的字母代换,可能是多个。 +- 维吉尼亚密码 +- ADFGVX密码 +- Enigma密码机 + +### 1.4 单表置换密码 + +#### 1.4.1 凯撒密码 + +恺撒密码(英语:Caesar cipher),或称恺撒加密、恺撒变换、变换加密,是一种最简单且最广为人知的加密技术。当年恺撒曾用此方法与其将军们进行联系。 + +现在已经无法弄清恺撒密码在当时有多大的效果,但是有理由相信它是安全的。因为恺撒大部分敌人都是目不识丁的,而其余的则可能将这些消息当作是某个未知的外语。即使有某个敌人获取了恺撒的加密信息,根据现有的记载,当时也没有任何技术能够解决这一最基本、最简单的替换密码。 + +**算法:** + +明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。𝐶=(𝑀+𝑘)𝑚𝑜𝑑26 +例如,当偏移量是3的时候,所有的字母A将被替换成D,B变成E,以此类推。 + +![](files/1-3-3.png) + +**破解凯撒密码** + +由于使用恺撒密码进行加密的语言一般都是字母文字系统,因此密码中可使用的偏移量也是有限的,因此可以通过穷举法,很轻易地进行破解。 + +>密文:Q TQSM BW LZQVS UQTS +>明文:I LIKE TO DRINK MILK + +![](files/1-3-4.png) + +### 小实验 +破解一个凯撒密码 +密文:GR BRXO LNHF UBSWRJUDSKB + +凯撒秘密在线分析网站 +``` +https://planetcalc.com/1434/ +``` + +### 1.4.2 简单替换密码 +将明文中所使用的字母替换为另一套字母表,形成新的对应关系。这种替换可以是任意的一对一关系。 + +例如:现有一个简单替换密码表 + +![](files/1-3-5.png) + +``` +明文: crypto +密文: hzkrqb +``` + +简单替换密码很难通过穷举法来破译。 +密钥空间:26!=26×25×24×⋯×3×2×1 + +**破译简单替换密码** + +已知一段密文: +``` +UZQSOVUOHXMOPVGPOZPEVSGZWSZOPFPESXUDBMETSXAIZVUEPHZHMDZSHZOWSFPAPPDTSVPQUZWYMXUZUHSXEPYEPOPDZSZUFPOMBZWPFUPZHMDJUDTMOHMQ +``` + +>有用信息: +>明文使用标准英文书写 +>使用简单替换密码 +>每个明文字母被唯一的密文字母替代 + +语言的每个字母都有其自身的特性,这是就像语言的指纹一样 +最容易观察出的特性就是字母出现的频率 +![](files/1-3-6.png) + +- 高频字母可以成为线索 +- 低频字母可以成为线索 +- 常见的字母组合可以成为线索(the , it , here , per 等) +- 密文越长越容易被破解 +- 需要加入适当的猜测和推理 + +我们再次分析密文: +``` +UZQSOVUOHXMOPVGPOZPEVSGZWSZOPFPESXUDBMETSXAIZVUEPHZHMDZSHZOWSFPAPPDTSVPQUZWYMXUZUHSXEPYEPOPDZSZUFPOMBZWPFUPZHMDJUDTMOHMQ +``` + +频率分析: +![](files/1-3-6-2.png) + +1. 猜测P Z可能是e和t; +2. 统计字母的相对频率-双字母 +3. 猜测ZW可能是th,因此ZWP可能是the +4. 经过反复猜测、分析和处理,得到明文 + +>it was disclosed yesterday that several informal but direct contacts have been made with political representatives of the viet cong in moscow + +在线进行词频分析网站 +``` +https://quipqiup.com/ +``` + +### 1.4.3 仿射密码 +它的加密函数是$C=(aM+b) mod\space 26$,其中 +- 数字对(a,b)为密钥 +- a和26互素,既:$gcd⁡(a,26)=1$ +- b为小于26的正整数 +- 在英文中有26个字母,因此是 $mod\space 26$ + +它的解密函数是$M=a^{−1} (C−b)mod\space 26$ + +解密函数,推导过程如下: + +$$\begin{gathered} +C\equiv (aM+b)\space mod\space 26 \\ +aM+b\equiv C\space mod\space 26 \\ +M\equiv a^{−1}(C−b)\space mod\space 26 +\end{gathered}$$ + +$gcd⁡(a,26)=1$ 的原因:解密时需要求密钥参数a的逆元。如果a的逆元存在,则元素a与模数必须互素。 + +**实例** + +字母A-Z对应的数字 +![](files/1-3-7.png) +加密 +若密钥对为(5,8),即函数中a为5,b为8,我们使用的是英文字母,即m为26 +![](files/1-3-7-2.png) + +**破解仿射密码** + +仿射密码和简单替换密码类似,最后都会形成一个明文字母和密文字母一对一的关系,然而区别在于,仿射密码的对应关系是由加密函数生成的,我们可以通过给定一个已知的明文攻击,求解出仿射方程式。 +- 通过对密文进行频率分析,确定两个替换关系,例如e被替换成了c,t被替换成了f +- 将字母转换成数字,模拟加密过程,求方程组: +$2=(a×4+b)mod\space 26$【 e(对应数字4)被替换成c(对应数字2)的过程 】 +$5=(a×19+b)mod\space 26$【t(对应数字19)被替换成f(对应数字5)的过程】 + +- 得到密钥对(21,22) + +### 小实验 +用仿射密码传送一个消息: +offensive time tomorrow morning at ten o'clock +密钥对为(7,10) + +### 1.4.4 Polybius密码 +这是一种简单的单码加密法,它将字母表的字母填充在一个正方形中,加上行列编号。 + +![](files/1-3-9.png) + +由于只有25个位置,所以去除字母j,因为 j 出现的频率低,用 i 来替代,不影响文字的可读性。 +明文中的a被替换成11,b被替换成12,依次类推。 + +### 1.4.5 摩尔斯电码 + +![](files/1-3-10.png) + +### 1.4.6 PIGPEN密码(猪圈密码) + +![](files/1-3-11.png) + +### 1.4.7 跳舞小人 + +![](files/1-3-12.png) + +### 1.4.8 培根密码 + +由法兰西斯·培根发明的一种隐写术。 + +第一步:加密时,明文中的每个字母都会转换成一组五个英文字母。其转换依靠下表: + +![](files/1-3-13.png) + +第二步:加密者需使用两种不同字体。准备好一篇包含相同AB字数的假信息后,即两种字体分别代表A型和B型。然后假信息中的每个字母按字体来决定其代表“A”还是“B”。 + +例如: +>密文:LOVE +>密钥:对应的转换表 +>密码算法:普通字体为A,斜体为B +>密文载体:messages is in the words + +>第一步:ABABA ABBAB BAABB AABAA +>第二步:messages is in the words + +### 1.4.9 Hill密码 + +希尔密码(Hill Cipher)是基于线性代数多重代换密码,由Lester S. Hill在1929年发明。 +每个字母转换成26进制数字:A=0, B=1, C=2...Z=25一串字母当成n维向量,跟一个n×n的矩阵相乘,再将得出的结果MOD26。 +![](./files/1532172224.jpg) + +Hill密码的解密 + +![](./files/1532172225.jpg) + +Hill密码证明和求逆主要参考线性代数知识。 + +对于单表加密法,破译人员可以通过密文频率分析对密文进行破译,有些需要花费很大的耐心,有些则通过工具可以直接破解。总的来说,这种加密方法还是太过于脆弱,下一节 ,我们将使用更复杂的方法让频率分析法失效。 + +### 1.5 多表置换密码 + +#### 1.5.1 维吉尼亚密码 + +维吉尼亚密码(又译维热纳尔密码)是使用一系列凯撒密码组成密码字母表的加密算法,属于多表密码的一种简单形式。 + +维吉尼亚密码以其简单易用而著称,同时初学者通常难以破解,因而又被称为“不可破译的密码”。这也让很多人使用维吉尼亚密码来加密的目的就是为了将其破解。 + +维吉尼亚密码以布莱斯·德·维吉尼亚的名字来命名,然而其真正的发明者是莱昂·巴蒂斯塔·阿尔伯蒂。而维吉尼亚则发明过一种更强大的自动密钥密码。 + +为了生成密码,需要使用表格法。这一表格包括了26行字母表,每一行都由前一行向左偏移一位得到。具体使用哪一行字母表进行编译,是基于密钥进行的,在过程中会不断地变换。 + +>明文:ATTACKATDAWN +>密钥:LEMONLEMONLE +>密文:LXFOPVEFRNHR + +![](files/1-4-1.png) + +**破译维吉尼亚密码** + +对于维吉尼亚密码,直接的频率分析却并不适用。 +由于在维吉尼亚密码中,同一个字母可以被加密成不同的密文,因而简单的频率分析在这里并没有用。 +如右图所示,任意截取了一段英文文章,加密后频率分布趋向平滑。 + +![](files/1-4-2.png) + +破译维吉尼亚密码的关键在于它的密钥是循环重复的。如果我们知道了密钥的长度,那密文就可以被看作是交织在一起的凯撒密码,而其中每一个都可以单独破解。 + +此时,我们可以使用IC测试(也可以称为一致性索引),IC是基于凹凸度量理念。 + +如果字母完全平滑分布,说明密文中每个字母出现的概率相同,都为1/26。然而标准英文中字母频率分布不是平滑的,因此,凹凸度量是密文中字母实际频率与完全平滑频率(1/26)之差。 + +![](files/1-4-2-2.png) + +若选取的字母为:𝛼,出现频率为p_𝛼,密文总字数为n,𝑓𝛼是密文中字母𝛼的个数 +MR为完全偏差,a~z所有字母的偏差的平方和为: + +$$MR=\sum_{\alpha =a}^z(p_\alpha -\frac{1}{26})^2$$ + +进行一定的取舍计算后得到: + +$$MP=\sum_{\alpha =a}^zp_\alpha ^2 -0.038$$ + +IC的定义: + +$$IC=\frac{\sum_{\alpha =a}^z f_\alpha (f_\alpha -1)}{n(n-1)}$$ + +单码加密法的IC值大概为0.066,对于完全平滑文字,其值为0.038,如果IC值位于0.038与0.066之间,说明加密的密钥长度不同。不同长度的密钥对应不同的IC值。 + +![](files/1-4-2-3.png) + +如果明文中的字母组合重复出现,被关键字加密后,密文也可能包含重复的字母组合,并且间距是密钥长度倍数。 +有一段密文如下: + +>DYDUXRMHTVDVNQDQNWDYDUXRMHARTJGWNQD + +- 两个DYDUXRMH的出现相隔了18个字母,则密钥的长度是18的约数 +- 两个NQD相距20个字母,则密钥长度是20的约数 +- 最大公约数是2,则基本可以判断密钥长度为2 + +维吉尼亚在线解密网站 +``` +https://planetcalc.com/2468/ +``` + +#### 1.5.2 ADFGVX 密码 +ADFGVX密码是德军在第一次世界大战中使用的栏块密码。事实上,它是早先一种密码 ADFGX 的增补版。1918年3月Fritz Nebel上校发明了这种密码,并提倡使用。它结合了改良过的Polybius方格替代密码与单行换位密码。这个密码以使用于密文当中六个字母 A, D, F, G, V, X命名。ADFGVX 是被法国陆军中尉 Georges Painvin 所破解的。以古典密码学的标准来说,此密码破解的工作是属于格外困难的,在这期间,Painvin 更因此健康蒙受了严重损伤。他破解的方法是依靠于找到多份开头相同的讯息,这表示说它们是被相同的分解钥匙和移位钥匙加密的。 + +**加密方式:** + +第一步:替换 + +将25个字母( i / j 视为同一字母)任意填充至方格的灰色区域,不能重复或缺少,用字母所在的行列字母替代原有字母。如b为AA,g为GA + +![](files/1-4-3.png) + +第二步:排列 +假设我们需要发送明文讯息 “Attack at once” +替换后的密文为:AFADADAFGFDXAFADDFFXGFXF +将得到的密文按密钥的长度进行排列: + +![](files/1-4-3-2.png) + +第三步:移动 + +![](files/1-4-3-3.png) + +>A:FAXDF +>C:ADDDG +>G:DGFFF +>O:AFAXX +>R:AFAFX + +最终得到:FAXDF ADDDG DGFFF AFAXX AFAFX + + +#### 1.5.3 ENIGMA密码机 +恩尼格玛密码机在1920年代早期开始被用于商业,一些国家的军队与政府也曾使用过它,其中的主要使用者是第二次世界大战时的纳粹德国。 + +![谢尔比乌斯Arthur Scherbius](files/1-4-4.png) + +![ENIGMA密码机](files/1-4-4-2.png) + +**ENIGMA密码机工作原理** + +![](files/1-4-5.png) + +- 当键盘上的一个键被按下时,相应的密文在显示器上显示,然后转子的方向就自动地转动一个字母的位置(在示意图中就是转动1/6圈,而在实际中 转动1/26圈)。 +- 相当于有26 个替换表的Vigenere加密 + +![](files/1-4-5-2.png) + +为了解决转子转动一圈重复的问题,密码机多增加了几个转子 + +![](files/1-4-5-3.png) + +- ENIGMA里有三个转子不重复的方向个数达到26*26*26 =17576个 +- 相当于有17576个替换表的Vigenere密码 + +**ENIGMA密码机反射器** + +ENIGMA密码机反射器的加密与解密过程相同 + +- 反射器和 转子一样,把某一个字母连在另一个字母上,但是它并不转动。 +- 反射器可以使译码的过程和编码的过程完全一 样。 +- 反射器从不把输入映射成自身 + +![](files/1-4-5-4.png) + +**ENIGMA密码机连接板** + +从26个字母中取出6对进行交换,比如:A/J, S/O, T/D, B/W, K/F, U/Y +- 选择12个字母的可能性:$26!(12!\times 14!)$ +- 12个字母组合交换的可能性:$(\frac{12!}{6!\times 6!})\times 6!\div 2$ +两者相乘,共计:$3.21\times 10^{17}$ +另外,三个转子本身还有 17576 种可能性,所以,表的个数约有$3.38\times 10^{17}$ + +![](files/1-4-5-5.png) +**Enigma曾在13年时间里(1926-1939)被认为坚不可摧** + +**Enigma的密钥管理** + +- 算法公开 + - 连接板交换6对字符,如:A/L , P/R, T/D, B/W, K/F, O/Y + - 转子的顺序,比如: 2,3,1 + - 转子的初始方向,如:Q-C-W +- 密钥保密 + - 每月发送当月每天的密钥 + - 每条密文使用不同的密钥 + - 每条电文的开头是加密的临时密钥,由三个字母重复两次加密而成, 称为indicator + + +![](files/1-4-5-6.png) + + +**Enigma的破译:波兰人** + +- 可证明对于任何的连线变化都不影响循环圈的个数和每个循环圈上字母的个数; +- 尝试所有3 个rotors的初始位置,可以得到所有密钥的”fingerprint”,即循环圈的个数、每个循环圈上字母的个数: +- 需要操作的次数:26 * 26 * 26 =17576 +- 考虑3个转子交换顺序3!,用6台Enigma协作运算 +- 建立这样一个档案(book of fingerprints)用了一年时间 +- 1938年, 德国人提升了密码强度 +- Enigma密码机另外增加了2个转子: 5*4*3 = 60 +- 连接板交换6对字符提升至10对字符 +- 波兰人没有足够经费造出足够多的Enigma密码机 +- 德国人汉斯-提罗·施密特停止提供情报和密码本 +- 1939年4月, 德国撕毁与波兰签订的和平协定,波兰处于战争乌云阴影之中。 +- 1939年7月, 波兰人将破译成果展示给英法同行 +- 1939年9月, 希特勒下令闪电战入侵波兰,波兰亡国 + + +**Enigma的破译:布莱切利公园** + +破译小组于1939年在布莱切利公园组建,其中的成员包括: + +- 填字游戏爱好者 +- 国际象棋专家 +- 语言学家 +- 数学家 +- 电脑科学家 + + +**Enigma的弱点** + +* 过于简单的密钥:比如DFG +* 重复使用的密钥:比如,CIL (cillie), -> silly +* 已知明文攻击(Know plaintext),候选单词(crib) + - weather report + - Heil Hitler + - Nothing to report + - Seeding, to get cribs +* 明文中的同一个字母在密码中几乎可以变成任意的其它字母,但就是无法成为它本身。 +* 过分严格的规定 + - 转子的位置不得重复: 如对3个rotor位置, 不是6 ,而是 2 + - 连接板上的相邻的字符不得链接 +* 其他手段:盟军可以通过间谍偷取密码本 + +**Enigma的破译:图灵的方法** + +* Alan Turing(1912-1954) + - 1931年进入剑桥大学,提出图灵机模型 + - 1933年受聘于GCCS,1939进入布莱切利公园 +* 图灵认为:波兰的方法依赖密钥的重复,如果德军改变密钥规则怎么办? +* 图灵的方法在候选单词的明文和密文之间找到字母循环圈的特征指纹 +![](files/1-4-7.png) + +- 根据Enigma的弱点,明文中的同一个字母在密码中几乎可以变成任意的其它字母,但就是无法成为它本身。因此在破译时,我们可以确定:A 绝对不会是 A,B 绝对不会是 B ... +- 利用这个漏洞,破译者可以先尝试猜测一个可能会出现在密码中的词语或短语,比如德语 “Heil Hitler”(希特勒万岁),然后把这个词语放在密文中任意的位置上,与整段密码进行比对,如果发现有重合的字母,那就说明该词语与当前的位置不匹配,一旦找到了一个没有重复字母的位置,那么很有可能那段密码所对应的明文正是 “Heil Hitler”。 + +- 在确定了至少一组正确的对应字母的前提下,破译者便可以通过假设和推理的方法猜测出一些可能的接线板上的字母配对。由于接线板上的一条接线会将两个字母绑定在一起,因此,如果我们猜测 A 接 B ,而由此却推导出了 C 接 A 的话,那么 A 接 B 的方案就是错的,而且由 A 接 B 所推导出来的一切可能的方案也全部都是错的;当接线板上,一个字母与所有其它字母的配对都被否决后,就说明问题出在转子上。这时,破译者要么更换转子,要么变动转子的位置,要么设定新的转子起始位置,再继续排查下去 ... 这就是破译 “恩尼格玛” 的通用方法。 +- 由于人力操作需要耗费大量的时间,英国数学家艾伦·图灵专门设计制造了一台 “炸弹机”(Bombe),通过电子技术,运用上述的排除法来破译 “恩尼格玛”,最快的一次仅用了大约20分钟。 + +### 小结 +多表替换加密都具有这样的特征:一个明文字母可映射到多个密文字母,这种加密可以干扰字母频率分析法,通常来说,多表替换密码肯定比单表密码更加安全。尽管加密的方法看上去十分复杂,这并不意味着它就是安全的,解密者会通过多种方式来寻找加密方法的线索,社会工程学就是他们必要技能,他们会想尽一切办法去破译密码。 diff --git a/doc/CRYPT-2_流密码.md b/doc/CRYPT-2_流密码.md new file mode 100644 index 0000000..70df185 --- /dev/null +++ b/doc/CRYPT-2_流密码.md @@ -0,0 +1,506 @@ +# CRYPT-2 流密码 + +**author : Odyssey@cyberpeace** + +## 知识点 +- 流密码的基本概念 +- 线性反馈移位寄存器 +- m序列的伪随机性 +- m序列密码的破译 +- 非线性序列 + + +## 学习目标 +- 掌握流密码的基本概念; +- 了解常用伪随机性的评价方法; +- 掌握线性移位寄存器的结构与输出序列的伪随机性; +- 熟悉非线性序列的概念与基本产生方法; +- 掌握一种典型流密码,祖冲之密码或 RC4 密码。 + + +## 目录 +2.1 流密码的基本概念 +2.2 通用伪随机数生成器(PRNG) +2.3 基于位移寄存器的流密码 +2.4 非线性流密码 +2.5 常见的流密码 + + +### 2.1 流密码的基本概念 +流密码的基本思想: +密钥:$k$ +产生一个密钥序列:$z=z_0 z_1...z_i$ +明文串:$x=x_0 x_1 x_2…x_i$ +加密:$y=y_0 y_1 y_2…=E_{z_0}(x_0)E_{z_1}(x_1)E_{z_2}(x_2)…$ +密钥序列发生器f:$z_i=f(k,σ_i)$ +$σ_i$是加密器中的记忆元件(存储器)在时刻i的状态,f是由密钥$k$和$σ_i$产生的函数。 + + +#### 2.1.1 二元加法流密码 +二元加法流密码是目前最为常用的流密码体制,其单独加密明文的每一位。它通过将密钥序列S中的每个位与明文位进行异或(XOR)运算。 +我们用 $x_i,y_i,s_i$来分别代表明文、密文和密钥序列中的每一位,$x_i,y_i,s_i∈{0,1}$ + +加密:$y_i=e_{s_i}$ $x_i≡x_i+s_i\space mod\space 2$ +解密:$x_i=d_{s_i}$ $y_i≡y_i+s_i\space mod\space 2$ + +![](files/2-1-1.png) + + +#### 2.1.2 XOR运算 +逻辑运算之中,除了 AND 和 OR,还有一种 XOR 运算,中文称为“异或运算”,用符号 ⊕ 来表示。 +两个值相同时,返回false(0),否则返回true(1)。XOR可以用来判断两个值是否不同。 +XOR运算是模2加法,$a⊕b≡a+b\space mod\space 2$ + +![](files/2-1-2.png) + +XOR有一个特点:如果对一个值连续做两次 XOR,会返回这个**值本身**。 + +第一次XOR:𝟏𝟎𝟏𝟎⊕𝟏𝟏𝟏𝟏=𝟎𝟏𝟎𝟏 +第二次XOR:𝟎𝟏𝟎𝟏⊕𝟏𝟏𝟏𝟏=𝟏𝟎𝟏𝟎 + +![](files/2-1-2-2.png) + + +#### 2.1.3 密钥序列 +密钥序列的生成是流密码安全性的核心问题,它决定了流密码的安全性。为了让攻击者无法对序列进行猜测,那密钥序列看上去应该是随机的,也就是随机生成数字。 + +![](files/2-1-3.png) + + +#### 2.1.4 随机数 + +**随机数与伪随机数** +- 真正的随机数是使用物理现象产生的:比如掷钱币、骰子、转轮、使用电子元件的噪音、核裂变等等,这样的随机数发生器叫做物理性随机数发生器,它们的缺点是技术要求比较高。 +- 使用计算机产生真随机数的方法是获取cpu频率与温度的不确定性以及统计一段时间的运算次数每次都会产生不同的值,系统时间的误差以及声卡的底噪等。 +- 在实际应用中往往使用伪随机数就足够了。这些数列是“似乎”随机的数,实际上它们是通过一个固定的、可以重复的计算方法产生的。计算机或计算器产生的随机数有很长的周期性。它们不真正地随机,因为它们实际上是可以计算出来的,但是它们具有类似于随机数的统计特征。这样的发生器叫做伪随机数发生器。 + +**随机数的随机性检验可以分为三个标准:** + +- 统计学伪随机性。统计学伪随机性指的是在给定的随机比特流样本中,1的数量大致等于0的数量,同理,“10”“01”“00”“11”四者数量大致相等。类似的标准被称为统计学随机性。满足这类要求的数字在人类“一眼看上去”是随机的。 +- 密码学安全伪随机性。其定义为,给定随机样本的一部分和随机算法,不能有效的演算出随机样本的剩余部分。 +- 真随机性。其定义为随机样本不可重现。实际上只要给定边界条件,真随机数并不存在,可是如果产生一个真随机数样本的边界条件十分复杂且难以捕捉(比如计算机当地的本底辐射波动值),可以认为用这个方法演算出来了真随机数。 + + + +#### 2.1.5 OTP一次性密码本 + +一次性密码本(one-time pad,缩写为OTP)是古典密码学中的一种加密算法。是以随机的密钥(key)组成明文,且只使用一次。 +在理论上,此种密码具有完善保密性,是牢不可破的。它的安全性已由克劳德·艾尔伍德·香农所证明。要使用一次性密码本,必须满足一下条件: +- 通过真随机数生成密钥序列 +- 每个密钥序列位都只使用一次,也就是和明文等长 +- 只有合法的通信方才知道密钥序列,使用后立即销毁 + +**为什么无法破译** + +这里的无法破译指的不是无法暴力破解,而是无法确认破破译后的正确性。 + +**为什么没有被广泛使用** + +- 最大问题在于密钥的配送 +- 密钥的保存 +- 密钥的同步 +- 密钥的生成 + +### 2.2 通用伪随机数生成器(PRNG) + +伪随机数生成器从一个初始种子值开始通过各种计算得到序列。通常伪随机数序列是递归地执行以下计算得到的: + +$$S_0=seed$$ + +$$S_i+1\equiv f(S_i),i=0,1,...$$ + +此表达式的一个推广形式就是$S_{i+1}=f(s_i,s_{i-1},s_{i-2},...,s_{i-t})$所示的生成器,其中t是一个固定整数。最常见的例子就是线性同余生成器(a,b,m都是整型常量): + +$$S_0=seed$$ + +$$S_{i+1}\equiv (aS_i+b)\space mod\space m,i=0,1,2,...$$ + +许多数学测试都验证PRNG序列的统计行为(满足随机性检验标准1),也就是说它的输出近乎和真随机相同。 + + +#### 2.2.1 破译通用伪随机数生成器(PRNG) +PRNG的输出序列非常具有随机性,那我们是否可以用它来生成我们的密钥序列呢?答案是不能,已知明文攻击可以轻松算出PRNG的参数,从而对加密后的明文进行破解。 +定义一个线性同余发生器: + +$$S_0=seed$$ + +$$S_{i+1}\equiv (aS_i+b)\space mod\space m,i=0,1,2,...$$ + +其中,m为100位长, $S_i$,A,B∈{0,1,2,⋯,m−1}。模数m是加密方案的一部分,是公开已知的。密钥包含(A,B)以及种子𝑆_0,每个值得长度均为100位。此时,密钥长度为200位,可以抵挡暴力攻击。 +若有一段明文 X,加密后的密文为 Y, $x_i$为明文 X 的二进制表示的位, $s_i$为PRNG输出的$S_i$的二进制表示的位。加密表达式为: + +$$y_i\equiv (x_i+s_i)\space mod\space 2$$ + +根据之前仿射密码破译的经验,我们尝试使用已知明文攻击。 +假如现在通过猜测或者是文件固有的头文件信息,得到了明文的前300位(300/8=37.5个字节),那么我们可以利用以下表达式计算密钥序列的前300位: + +$$s_i\equiv (y_i+x_i)\space mod\space m ,i=1,2,...,300$$ + +因为m的长度为100,那么我们可以得出PRNG的前三个输出符号:$S_1=\{s_1,s_2,...,s_{100}\}$了,$S_2\{s_{101},s_{102},...,s_{200}\}$和$S_3=\{s_{201},s_{202},...,s_{300}\}$,得到两组等式: + +$$S_2=(AS_1+B)\space mod\space m$$ + +$$S_3=(AS_2+B)\space mod\space m$$ + +这是一个基于$Z_m$的线性等式系统,拥有两个未知数A和B。但是两个值都是密钥,我们可以立即求解该系统,得到: + +$$A\equiv \frac{S_2-S_3}{S_1-S_2}\space mod\space m$$ + +$$B\equiv \frac{S_1(S_2-S_3)}{S_1-S_2}\space mod\space m$$ + +在$gcd((S_1-S_2),m\not=1)$的情况下可以得到多个解,因为这个等式系统基于 $Z_m$。然而,在大多数情况下,如果得到已知明文的第四片消息,就可以唯一地检测出密钥。 + +**例题:** +假设窃密者得到密文串101101011110010和相应的明文串011001111111001,得密钥流为110100100001011。进一步假定窃密者还知道密钥流是使用5级线性反馈移位寄存器产生的,那么窃密者可分别用密文串中的前10个比特和明文串中的前10个比特建立如下方程: + +$$ +(a_6\space a_7\space a_8\space a_9\space a_{10})=(c_5\space c_4\space c_3\space c_2\space c_1) +\left\{ +\begin{matrix} +a_1& a_2& a_3& a_4& a_5 \\ +a_2& a_3& a_4& a_5& a_6 \\ +a_3& a_4& a_5& a_6& a_7 \\ +a_4& a_5& a_6& a_7& a_8 \\ +a_5& a_6& a_7& a_8& a_9 +\end{matrix} +\right\} +$$ + + + +$$ +(0\space 1\space 0\space 0\space 0)=\space (c_5\space c_4\space c_3\space c_2\space c_1) +\left\{ +\begin{matrix} +1&1&0&1&0 \\ +1&0&1&0&0 \\ +0&1&0&0&1 \\ +1&0&0&1&0 \\ +0&0&1&0&0 +\end{matrix} +\right\} +$$ + +$$ +\left\{ +\begin{matrix} +1&1&0&1&0 \\ +1&0&1&0&0 \\ +0&1&0&0&1 \\ +1&0&0&1&0 \\ +0&0&1&0&0 +\end{matrix} +\right\}^{-1}= +\left\{ +\begin{matrix} +0&1&0&0&1 \\ +1&0&0&1&0 \\ +0&0&0&0&1 \\ +0&1&0&1&1 \\ +1&0&1&1&0 +\end{matrix} +\right\} +$$ + + + +$$ +(C_5\space C_4\space C_3\space C_2\space C_1)=(0\space1\space0\space0\space0) +\left\{ +\begin{matrix} +0&1&0&0&1 \\ +1&0&0&1&0 \\ +0&0&0&0&1 \\ +0&1&0&1&1 \\ +1&0&1&1&0 +\end{matrix} +\right\} +$$ + +$$ +(C_5\space C_4\space C_3\space C_2\space C_1)=(1\space 0\space0\space1\space0) +$$ + +$$a_{i+5}=c_5a_i\oplus c_2a_{i+3}=a_i\oplus a_{i+3}$$ + + +### 2.3 基于位移寄存器的流密码 +#### 2.3.1 线性反馈移位寄存器(LFSR) +一个LFSR由若干时钟存储原件(触发器)和一个反馈路径(有多种情况,但只能选择使用一种)组成。存储原件的数目给出了LFSR的度。一个拥有m个触发器的LFSR可以称为“度为m”。在每个时钟周期内,内部状态位会右移一位,并执行XOR计算。 +以度m=3为例,此时LFSR有三个触发器FF0,FF1,FF2初始状态s_0,𝑠_1,𝑠_2,以及如图的反馈路径。工作方式如下: + +![](files/2-3-1.png) + +#### 2.3.1 线性反馈移位寄存器(LFSR) + +用一个简单的公式来表示这个LFSR的功能: + +$$s_3\equiv (s_1+s_0\space) mod\space 2$$ + +$$s_4\equiv (s_2+s_1\space) mod\space 2$$ + +$$s_5\equiv (s_3+s_2\space) mod\space 2$$ + +$$⋮$$ + +$$s_{i+3}\equiv (s_{i+1}+s_i\space) mod\space 2$$ + +当然,这只是在m=3的情况下成立的,接下来看一下通用的LFSR + + +如图显示了一个度为m的LFSR的通用形式。此LFSR拥有m个触发器和m个可能的反馈位置。反馈路径是否启用取决于反馈系数 $p_0,p_1,p_2,...,p_{m-1}$; +如果$p_i=1$(启用路径),对应触发器输出的值加入XOR运算 +如果$p_i=0$(中断路径),对应触发器输出的值不会加入XOR运算 + +![](files/2-3-1-2.png) + +假设某个LFSR初始加载的值为$s_0,s_1,...,s_{m-1}$,则LFSR的下一个输出位$s_m$可以表示为: + +$$s_m\equiv (s_{m-1}p_{m-1}+...+s_1p_1+s_0p_0)\space mod\space 2$$ + +同理可推得下一个LFSR输出的计算式: + +$$s_{i+m}\equiv \sum^{m-1}_{j=0}p_j\times s_{i+j}\space mod\space 2;s_i,p_j\in\{0,1\};i=0,1,2,...$$ + +线性反馈移位寄存器因其实现简单、速度快、有较为成熟的理论等优点而成为构造密钥流生成器的最重要的部件之一。 + +由于可重复性出现状态的数量有限,所以LFSR的输出序列会周期性重复。并且LFSR可以根据反馈系数的生成不同长度的输出序列,LFSR的最大长度与其度m有关:$2^m−1$ +只有设置特定的$(p_0,p_1,...,p_{m-1})$才能得到最大长度的LFSR。 +例如:同样度m=4 +(1)反馈路径为$(p_3=0,p_2=0,p_1=1,p_0=1)$的LFSR,输出序列的周期为$2^4-1=15$ +(2)反馈路径为$(p_3=1,p_2=1,p_1=1,p_0=1)$的LFSR,输出序列的周期为5 + +每个LFSR有一个关联多项式,它与决定下一个移入位的函数不同。该多项式与LFSR的数学结果相关。特征式为: + +$$p(x)=p_nx^n+p_{n-1}x^{n-1}+...+p_ix+1$$ + +如果$p_i$位的路径打开,那么$p_i=1$,否则为0。 +事实证明,如果LFSR的特征多项式是不可约分的,那么LFSR就有一个最大的序列。如果不能约分了,且将$p(x)$分为$x^k-1$的最小整数k为$2^n-1$,那么多项式的次数n、 𝑝(𝑥)是基本的。 + +在线性反馈移位寄存器中总是假定$p_0,p_1,...,p_{m-1}$中至少有一个不为0,否则$s_{i+m}\equiv 0$,这样的话,在n个脉冲后状态必然是00…0,且这个状态必将一直持续下去。 +若只有一个系数不为0,设仅有$p_i$为1,实际上是一种延迟装置。 +一般对于m级线性反馈移位寄存器,总是假定$p_i=1$。 + +流密码的安全性取决于密钥流的安全性,要求密钥流序列有好的随机性,以使密码分析者对它无法预测。也就是说,即使截获其中一段,也无法推测后面是什么。如果密钥流是周期的,要完全做到随机性是困难的。严格地说,这样的序列不可能做到随机,只能要求截获比周期短的一段时不会泄 +露更多信息,这样的序列称为伪随机序列。 + +#### 2.3.2 破译LFSR流密码 +由于LFSR是线性关系,由其输入输出之间的线性关系来决定。然而在密码体制中,线性关系会使密钥变得非常不安全,已知明文攻击通过求解可以对其进行破译。 +假设攻击者已知一段长度为2m的明文$x_0,x_1,x_2,⋯,x_(2m-1)$,它对应的密文$y_0,y_1,y_2,⋯y_(2m-1)$,此时攻击者可以重构开头的2m个密钥序列: + +$$s_i\equiv x_i+y_i\space mod \space 2;i=0,1,2,...,2m-1$$ + +由于每个 i 值都会生成不同的等式,因此我们可以得到 i 个等式: + +$$i=0,\space s_m\equiv s_{m-1}p_{m-1}+...+s_1p_1+s_0p_0\space mod2$$ + +$$i=1,\space s_{m+1}\equiv s_mp_{m-1}+...+s_2p_1+s_1p_0\space mod2$$ + +$$i=2,\space s_{m+2}\equiv s_{m+1}p_{m-1}+...+s_3p_1+s_2p_0\space mod2$$ + +$$⋮$$ + +$$i=m-1,\space s_{2m-2}p_{m-1}+...+s_mp_1+s_{m-1}p_0 \space mod2$$ + +对于这个等式,可以使用高斯消去法、矩阵求逆或其他方法来求解此线性等式系统。即使m的值非常大,现代计算机仍然能够在较短时间计算求解。 +当然这并不代表LFSR无法应用到密码体系中去,我们可以通过使用多个LFSR进行组合,构建一个健壮的密码体制。 + + +### 2.4 非线性流密码 +**非线性密钥流生成器可分解为驱动子系统和非线性组合子系统** +- 驱动子系统常用一个或多个线性反馈移位寄存器来实现 +- 非线性组合子系统用非线性组合函数F来实现 + +为了使密钥流生成器输出的二元序列尽可能复杂,应保证其周期尽可能大、线性复杂度和不可预测性尽可能高,因此常使用多个LFSR来构造二元序列,称每个LFSR的输出序列为驱动序列,显然密钥流生成器输出序列的周期不大于各驱动序列周期的乘积,因此,提高输出序列的线性复杂度应从极大化其周期开始。 +二元序列的线性复杂度指生成该序列的最短LFSR的级数,最短LFSR的特征多项式称为二元序列的极小特征多项式。 + +#### 2.4.1 Geffe 序列生成器 +Geffe序列生成器由3个LFSR组成,其中LFSR2作为控制生成器使用 + +![](files/2-4-1.png) + +当LFSR2输出1时,LFSR2与LFSR1相连接;当LFSR2输出0时,LFSR2与LFSR3相连接。 +若设LFSRi的输出序列为$\{a^{(i)}_k\} (i=1,2,3)$,则输出序列{$b_k$}可以表示为 + +$$b_k=a_k^{(1)}a_k^{(2)}+a_k^{(3)}\overline{a_k^{(2)}}=a_k^{(1)}a_k^{(2)}+a_k^{(3)}a_k^{(2)}+a_k^{(3)}$$ + +Geffe序列生成器也可以表示为图2.13的形式,其中LFSR1和LFSR3作为多路复合器的输入,LFSR2控制多路复合器的输出。设LFSRi的特征多项式分别为ni次本原多项式,且ni两两互素,则Geffe序列的周期为 + +$$\prod ^{3}_{i=1}(2^{n_i}-1)$$ + +线性复杂度为 + +$$(n_1+n_3)n_2+n_3$$ + +![](files/2-4-1-5.png) + +Geffe序列的周期实现了极大化,且0与1之间的分布大体上是平衡的。 + + +#### 2.4.2 J-K触发器 + +J-K触发器如图所示,它的两个输入端分别用$J(x_1)$和$K(x_2)$表示,其输出$c_k$不仅依赖于输入,还依赖于前一个输出位$c_{k-1}$,即 + +$$c_k=\overline{(x_1+x_2)}\space c_{k-1}+x_1$$ + +![](files/2-4-2-2.png) + +在图2.15中,令驱动序列{$a_k$}和{$b_k$}的度分别为m、n,则有 + +$$c_k=\overline{a_k+b_k}\space c_{k-1}+a_k=(a_k+b_k+1)c_{k-1}+a_k$$ + +如果令$c_{-1}=0$,则输出序列的最初3项为 +![](files/2-4-2-4.png) +当m与n互素且a0+b0=1时,序列{ck}的周期为:(2m-1)(2n-1) + +若:m=2, n=3,两个驱动m序列分别为 +${a_k}=0,1,1,…$ +${b_k}=1,0,0,1,0,1,1,…$ +于是,输出序列${c_k}$是 +0,1,1,0,1,0,0,1,1,1,0,1,0,1,0,0,1,0,0,1,0,…, +其周期为$(2^2-1)(2^3-1)=21$ + +由表达式$𝑐_𝑘=(𝑎_𝑘+𝑏_𝑘)\cdot 𝑐_{𝑘−1}+𝑎_𝑘$可得 + +![](files/2-4-2-5.png) + +因此,如果知道${c_k}$中相邻位的值$c_{k-1}$和$c_k$,就可以推断出$a_k$和$b_k$中的一个。而一旦知道足够多的这类信息,就可通过密码分析的方法得到序列${a_k}$和${b_k}$。为了克服上述缺点,Pless 提出了由多个J-K触发器序列驱动的多路复合序列方案,称为Pless 生成器。 + +#### 2.4.3 Pless生成器 + +Pless生成器由8个LFSR、4个J-K触发器和1个循环计数器构成,由循环计数器进行选通控制,假定在时刻t输出第t(mod 4)个单元,则输出序列为 +a0b1c2d3a4b5d6 + +![](files/2-4-3.png) + + +#### 2.4.4 钟控序列生成器 + +钟控序列最基本的模型是用一个LFSR控制另外一个LFSR的移位时钟脉冲,如图所示。 +![](files/2-4-4.png) + +假设LFSR1和LFSR2分别输出序列{ak}和{bk},其周期分别为p1和p2。当LFSR1输出1时,移位时钟脉冲通过与门使LFSR2进行一次移位,从而生成下一位。当LFSR1输出0时,移位时钟脉冲无法通过与门影响LFSR2。因此LFSR2重复输出前一位。假设钟控序列{ck}的周期为p,可得如下关系: + +![](files/2-4-4-2.png) + +![](files/2-4-4-3.png) + +又设{ak}和{bk}的极小特征多项式分别为GF(2)上的m和n次本原多项式f1(x)和f2(x),且m|n。因此,p1=2m-1, p2=2n-1。又知w1=2m-1, 因此 +gcd(w1, p2)=1,所以p=p1p2=(2m-1)(2n-1)。 +此外,也可推导出{ck}的线性复杂度为n(2m-1),极小特征多项式为 +![](files/2-4-4-4.png) + +#### 2.4.5 Trivium算法 +Trivium算法是一种对称密钥同步序列密码算法。它的设计目的是在计算能力有限的硬件上高效实现安全加密,同时兼顾软件实现效率。 +Trivium的标准输入为一个80位的密码和一个80位的起始向量(IV)。和大部分同步序列密码算法一样,Trivium的核心组件是一个密码学安全的伪随机数生成器(CSPRNG)。通过将密码和起始向量加载到该伪随机数生成器中,Trivium算法将计算出所需的密钥流。然后,通过将明文位依次与密文位进行异或操作,计算并输出密文。 +Trivium伪随机数生成器可以看作由三个线性反馈移位寄存器组成。它们的长度分别是93、84和111位。寄存器和寄存器之间通过非线性逻辑连接。 + +寄存器A、B、C的长度分别为:93、84和111位,加密过程分为两个阶段: +![](files/2-4-5.png) + +**第一阶段:** + +- 将80位的密钥加载到寄存器A的左边,并将寄存器A的剩余位以0填充。 +- 将80位的IV加载到寄存器B的左边,并将寄存器B的剩余位以0填充。 +- 将寄存器C的最后三位以1填充,并将寄存器C的剩余位以0填充。 +- 重复1152次“下一状态算法”中的操作,同时并不输出密钥。 + +**第二阶段:** + +使用$X_i$表示上一状态的第 $X$ 个寄存器中的第 $i$ 位,使用Xi表示当前状态的第X个寄存器中的第i位,使用i ^ j表示i 、j 两位的逻辑异或,使用 i & j表示 i、j 两位的逻辑与,使用:=表示赋值。各个寄存器的第一位以1标记。s表示密钥流。 +"s:=s+((C109&C110)^C111^C66)^((A91&A92)^A93^A66)^((B82&B83)^B84^B69)" +将所有寄存器向右移1位,丢弃最后一位,并将空出的首位按照下述规则填充: +"A1:=A69^((C109&C110)^C111^C66)" +"B1:=B78^((A91&A92)^A93^A66)" +"C1:=C87^((B82&B83)^B84^B69)" + +### 2.5 常见的流密码 +#### 2.5.1 A5/1 +A5 / 1是用于在GSM蜂窝电话标准中提供无线通信隐私的流密码。它是为GSM使用指定的七种算法之一。最初是保密的,但通过泄漏和逆向工程成为公众的知识。 密码中存在一些严重的弱点。 +A5/1算法使用3个线性反馈移位寄存器,简称为LFSR。三个寄存器的分别为19位、22位、23位。这里要使用三个共包含64位二进制的线性反馈移位寄存器,这个设计绝非偶然。A5/1算法的密钥K也是64位。该密钥用于三个线性反馈移位寄存器的初始填充,也就是说,该密钥用于充当三个寄存器的初始值。这三个寄存器用密钥填充之后,就可以开始生成密钥流了。 + +![](files/2-5-1.png) + +A5 / 1流密码使用三个LFSR。如果一个寄存器的时钟位(橙色)与其他两个寄存器中的一个或两个的时钟位一致,则该寄存器会被时钟控制。 + +A5 / 1的每个回合步骤可以拆分为:取KEY,反馈多项式(Feedback Polynomial),位移 +1. 取Key: +取三个寄存器的最后一位,也就是19位、22位、23位,进行XOR操作,得到的结果为这一轮Key的一位。 +2. 反馈多项式(Feedback Polynomial): +LFSR进行位移的前置操作,具体可以分成两步:判定是否需要进行位移,判定新的充填的值。 +判定是否需要进行位移: +这里使用的是择多原则,三个寄存器中选择三个钟控信号,19位中的第8位,22位,23位中皆为第10位,两种二进制0,1,必定有0或1数量居多,居多的寄存器需要进行位移操作。 +判定新的充填的值: +这里需要用到反馈多项式: +![](files/2-5-4-2.png) +XOR后得到的值是充填到第0位的值。 +3. 位移: +三个寄存器,由上一步的判定后进行位移,空出第0位用于充填反馈多项式得到的值。 + +**A5/1的安全性** +在欧洲和美国使用A5 / 1 。A5 / 2是对某些出口地区的算法的有意削弱。A5 / 1是在1987年开发的,当时GSM尚未考虑在欧洲以外使用,而A5 / 2是在1989年开发的。虽然两者最初都保密,但总体设计在1994年泄露,算法完全在1999年由Marc Briceno从GSM电话机中逆向工程。2000年,大约1.3亿GSM客户依靠A5 / 1来保护其语音通信的机密性; 到2014年为72亿。 +爱德华斯诺登在2013年泄露的文件称,NSA“可以处理加密的A5 / 1”。 + + +#### 2.5.2 RC4算法 +在密码学中,RC4(来自Rivest Cipher 4的缩写)是一种流加密算法,RC4是有线等效加密(WEP)中采用的加密算法,也曾经是TLS可采用的算法之一。 +由美国密码学家罗纳德·李维斯特(Ronald Rivest)在1987年设计的。由于RC4算法存在弱点,2015年2月所发布的 RFC 7465 规定禁止在TLS中使用RC4加密算法。 +RC4由伪随机数生成器和异或运算组成。RC4的密钥长度可变,范围是[1,255]。RC4一个字节一个字节地加解密。给定一个密钥,伪随机数生成器接受密钥并产生一个S盒。S盒用来加密数据,而且在加密过程中S盒会变化。 +RC4开始时是商业密码,没有公开发表出来,但是在1994年9月份的时候,它被人匿名公开在了Cypherpunks 邮件列表上,很快它就被发到了sci.crypt 新闻组上,随后从这传播到了互联网的许多站点。随之贴出的代码后来被证明是真实的,因为它的输出跟取得了RC4版权的私有软件的输出是完全相同的。由于算法已经公开,RC4也就不再是商业秘密了,只是它的名字“RC4”仍然是一个注册商标。 + +密钥序列由两部分算法生成: + +- 密钥调度算法(KSA) +密钥调度算法被用于初始化“S”盒,“密钥长度”被定义为密钥中的字节数,并且可以在1≤keylength≤256的范围内,通常在5和16比特之间,对应于密钥长度为40-128 位。 + +- 初始化长度为256的S盒。第一个for循环将0到255的互不重复的元素装入S盒。第二个for循环根据密钥打乱S盒。 + +```c +for i from 0 to 255 + S[i] := i +end for +j := 0 + +for( i=0 ; i<256 ; i++) + j := (j + S[i] + key[i mod keylength]) % 256 + swap values of S[i] and S[j] +end for + +``` +下面i,j是两个指针。每收到一个字节,就进行while循环。通过一定的算法$((a),(b))$定位S盒中的一个元素,并与输入字节异或,得到k。循环中还改变了S盒$((c))$。如果输入的是明文,输出的就是密文;如果输入的是密文,输出的就是明文。 + +```c +i := 0 +j := 0 + +while GeneratingOutput: + i := (i + 1) mod 256 //a + j := (j + S[i]) mod 256 //b + swap values of S[i] and S[j] //c + k := inputByte ^ S[(S[i] + S[j]) % 256] + output K +endwhile + +``` + +#### 2.5.4 破译RC4算法 + +CR4被广泛用于常用协议中,包括有线等效保密(WEP),用于无线网络的安全算法,以及HTTPS的安全套接字层(SSL)和传输层安全(TLS)协议;事实上,在所有TLS流量中,约有50%的流量目前在使用RC4算法来保护。 +一个256位的RC4密码共有256!种可能,即$2^{1600}$ 种可能,这样就使得穷举攻击变得不可能。 +但是RC4算法不可能从根本上模拟随机数,因此仍然存在一定的弱点。例如在第一阶段KSA中,KSA永远不会生成某类密钥,例如:$j=j+1$与$S(j)=1$。事实证明这类密钥的数量是所有可能密钥数的2^(−2n)。在256位中(28),就是256/2^16 。 +40比特的RC4密码曾被广泛使用在WEP中,然而攻击者通过已知明文攻击,借助字典在几分钟之内进行快速破解。 + + +#### 2.5.5 祖冲之密码算法 +祖冲之算法集(ZUC算法)是由我国学者自主设计的加密和完整性算法,包括祖冲之算法、加密算法128-EEA3和完整性算法128-EIA3。ZUC算法由3个基本部分组成,依次为:1、比特重组;2、非线性函数F;3、线性反馈移位寄存器(LFSR)。 +应用领域:4G无线通信、新一代宽带无线移动通信系统(LTE)国际标准 +在2011年9月19日至21日日本福岗召开的第53次第三代合作伙伴计划(3GPP)系统架构组(SA)会议上,我国祖冲之密码算法(ZUC)被批准成为新一代宽带无线移动通信系统(LTE)国际标准。这是我国商用密码算法首次走出国门参与国际标准竞争,并取得重大突破。 + + +### 小结 +流密码的算法可以分成两种: +- 针对软件设计:CR4、SEAL等 +- 针对硬件设计:基于LFSR算法的A5/1、A5/2、Trivium等 +在过去的许多年里,许多流密码已经被认为安全性未知,在一些安全性要求比较高的地方不适合使用。 +但流密码仍然具有很多天然优势,尤其是一些存储空间有限、功耗要求苛刻、性能羸弱的硬件应用程序中,流密码仍然被广泛使用。 +即使一个伪随机数生成器生成的随机数具有良好的统计学属性,但不一定适用于加密。 diff --git a/doc/CRYPT-3_分组密码.md b/doc/CRYPT-3_分组密码.md new file mode 100644 index 0000000..9e6c280 --- /dev/null +++ b/doc/CRYPT-3_分组密码.md @@ -0,0 +1,409 @@ +# CRYPT-3 分组密码 + +**author : Odyssey@cyberpeace** + +## 目录 +3.1 分组密码概述 +3.2 分组加密法的模式 +3.3 乘积加密法 +3.4 DES加密技术 +3.5 差分密码分析与线性密码分析 +3.6 3DES加密技术 +3.7 AES算法 + + +## 3.1 分组密码概述 +在今天我们所使用的加密法中,分组加密是最常见的类型。分组加密法每次作用于固定大小的分组(与流密码相反,流密码每次只加密一位)。此外,一个分组的比特数就称为分组长度。 + +![](files/3-1.png) + + +## 3.1 分组密码概述 +在许多密码系统中,单钥分组密码是系统安全的一个重要组成部分,用分组密码易于构造伪随机数生成器、流密码、消息认证码(MAC)和杂凑函数等,还可进而成为消息认证技术、数据完整性机制、实体认证协议以及单钥数字签字体制的核心组成部分。实际应用中对于分组密码可能提出多方面的要求,除了安全性外,还有运行速度、存储量(程序的长度、数据分组长度、高速缓存大小)、实现平台(硬件、软件、芯片)、运行模式等限制条件。这些都需要与安全性要求之间进行适当的折中选择。 + + +#### 3.1.1 分组密码的设计原则 + +**设计的算法应满足下述要求** + +① 分组长度n要足够大,使分组代换字母表中的元素个数2n足够大,防止明文穷举攻击法奏效。 +DES、IDEA、FEAL和LOKI等分组密码都采用n=64,在生日攻击下用232组密文成功概率为1/2,同时要求232×64b=215MB存贮,故采用穷举攻击是不现实的。 +② 密钥量要足够大(即置换子集中的元素足够多),尽可能消除弱密钥并使所有密钥同等地好,以防止密钥穷举攻击奏效。 +但密钥又不能过长,以便于密钥的管理。 +DES采用56比特密钥,太短了,IDEA采用128比特密钥,据估计,在今后30~40年内采用80 比特密钥是足够安全的。 +③ 由密钥确定置换的算法要足够复杂,充分实现明文与密钥的扩散和混淆,没有简单的关系可循,能抗击各种已知的攻击,如差分攻击和线性攻击;有高的非线性阶数,实现复杂的密码变换;使对手破译时除了用穷举法外,无其它捷径可循。 +④ 加密和解密运算简单,易于软件和硬件高速实现。如将分组n化分为子段,每段长为8、16或者32。在以软件实现时,应选用简单的运算,使作用于子段上的密码运算易于以标准处理器的基本运算,如加、乘、移位等实现,避免用以软件难于实现的逐比特置换。为了便于硬件实现,加密和解密过程之间的差别应仅在于由秘密密钥所生成的密钥表不同而已。这样,加密和解密就可用同一器件实现。设计的算法采用规则的模块结构,如多轮迭代等,以便于软件和VLSI快速实现。此外,差错传播和数据扩展要尽可能地小。 +⑤ 数据扩展尽可能地小。一般无数据扩展,在采用同态置换和随机化加密技术时可引入数据扩展。 +⑥ 差错传播尽可能地小。 + + +#### 3.1.2 混淆与扩散 +扩散和混淆是由Shannon提出的设计密码系统的两个基本方法,目的是抗击攻击者对密码系统的统计分析。 +如果攻击者知道明文的某些统计特性,如消息中不同字母出现的频率、可能出现的特定单词或短语,而且这些统计特性以某种方式在密文中反映出来,那么攻击者就有可能得出加密密钥或其一部分,或者得出包含加密密钥的一个可能的密钥集合。 + +- 混淆(Confusion):是一种使密钥与密文之间的关系尽可能模糊的加密操作。设计者希望让密文的统计特性与密钥的取值之间的关系尽可能复杂化,以使密钥和明文以及密文之间的依赖性对密码分析者来说是无法利用的。实现混淆常用的一个元素就是替换;这个元素都在DES和AES中都有使用。 +- 扩散(Diffusion):是一种为了隐藏明文的统计属性而将一个明文符号的影响扩散到多个密文符号的加密操作,以便在大量的密文中消除明文的统计结构。最简单的扩散元素就是置换,它常用于DES中;而AES则使用更高级的Mixcolunm操作。 +扩散和混淆成功地实现了分组密码的本质属性,因而成为设计现代分组密码的基础。 + +### 3.2 分组加密法的模式 + +**什么是模式** +分组密码只能加密固定长度的分组,但是我们需要加密的明文长度可能会超过分组密码的分组长度,这时就需要对分组密码算法进行迭代,以便将一段很长的明文全部加密。这个迭代的方法就称为分组密码的模式(mode)。 +在介绍模式前我们引入两个术语: +明文分组($M_n$):指分组密码算法中作为加密对象的明文,明文分组的长度与分组密码算法的分组长度是等长的。 +密文分组($C_n$):指使用分组密码算法将明文分组加密之后所生成的密文。 + + +#### 3.2.1 电子编码薄模式(ECB) +这是分组加密最简单的一种模式,即明文的每一个块加密成密文的每一个块。明文被分为若干块$(M_1,M_2,M_3,M_4, … ,M_n)$,通过加密方法$E_k$,得到密文$(C_1,C_2,C_3,C_4,…,C_n)$,当最后一个明文分组小于分组长度时,需要用一些特定的数据进行填充。 + +![](files/3-2-1.png) + +解密过程也是一次对一个分组解密,而且每次解密都使用同一密钥。 +![](files/3-2-1-2.png) + + +- ECB模式的特点 +ECB模式是所有模式中最简单的一种。ECB模式中,明文分组与密文分组是一一对应关系,因此,如果明文中存在多个相同的明文分组,则这些明文分组最终都将被转换为相同的 密文分组。这样一来,只要观察一下密文,就可以知道明文中存在怎么样的重复组合,并可以以此为线索来破译密码,因此ECB模式是存在一定风险的。 + +- 对ECB模式的攻击 +ECB模式中,每个明文分组都是各自独立地进行加密和解密,但这其实是一个很大的弱点。假如存在一个攻击者,当他作为中间人截获两方的通信时,他能够改变密文的分组顺序,当接收者对密文进行解密时,由于密文分组的顺序被改变了,因此相应的明文分组的顺序也被改变了,那么接收者实际上是解密出了一段被篡改后的密文。在这种场景中,攻击者不需要破译密码,也不需要知道分组密码的算法,他只需要知道哪个分组记录了什么样的数据。 +思考一个模拟的场景: + +假设分组的长度为128比特(16字节),某银行的转账请求数据由以下三个分组构成。 +分组1:付款人的银行账号 +分组2:收款人的银行账号 +分组3:转账金额 +此时我们模拟一个转账请求数据:从A-5374帐号向B-6671帐号转账1亿元,用16进制数据表示: +明文分组1=41 2D 35 33 37 34 20 20 20 20 20 20 20 20 20 20 (付款人:A-5374) +明文分组2=42 2D 36 36 37 31 20 20 20 20 20 20 20 20 20 20 (收款人:B-6671) +明文分组3=31 30 30 30 30 30 30 30 30 20 20 20 20 20 20 20 (转账金额:100000000) + +接下来,攻击者将密文分组1和2的内容进行对调。(此时攻击者并不知道分组的具体内容,但知道这是付款人信息) +明文分组2=42 2D 36 36 37 31 20 20 20 20 20 20 20 20 20 20 (收款人:B-6671) +明文分组1=41 2D 35 33 37 34 20 20 20 20 20 20 20 20 20 20 (付款人:A-5374) +明文分组3=31 30 30 30 30 30 30 30 30 20 20 20 20 20 20 20 (转账金额:100000000) +当银行对信息进行解密时,信息的内容实际上已经发生了改变,付款人的身份和收款人的身份已经被调换了。 +这就是ECB模式的最大弱点,可以在不破译密文的情况下操纵密文。 + + +#### 3.2.2 密码分组链接模式(CBC) +这个模式的实现更复杂、更安全,因此它是使用最普遍的块加密模式。在这种模式下,来自上一块的密文与当前明文块做XOR逻辑运算,得到的结果才是加密的位块。 + +![](files/3-2-2.png) + +如果为每个消息传输选取不同的IV,那么两个相同的消息即使使用相同的密钥,也将有不同的密文。这大大提高了安全性。问题在于:接收端如何知道所使用的IV呢? +一种方法是在不安全的通道上发送该IV,并且该IV只使用一次,永不重复。 +另外一种方法就是基于唯一数的概念。唯一数是一个唯一的数字,永远不重复使用的密钥,它不一定非得保密,它可以是消息的数目等。用块加密法将唯一数加密后生成IV。如果唯一数附加到密文前面,接收端就可以还原IV。 + +- CBC模式的特点 +在CBC模式中,我们无法单独对一个中间的明文分组进行加密,加入要生成第三组密文,那么至少需要凑齐分组1,2,3才行。 +观察CBC模式的解密过程,我们发现:如果加密后的分组C2出现内容错误(存储介质故障或者网络传输中的误码等)使得一个分组中的0变成了1。那么解密的时候最多只会让2个分组内容受到数据损坏的影响。 +![](files/3-2-2-2.png) + +但是,如果不是数据出错,而是密文分组中有比特缺失,那么即使丢失一个比特,也会导致密文分组的长度发生变化,后续的分组发生错位,最终导致后面的所有密文分组都会解密出无效的数据。 +![](files/3-2-2-3.png) + +- 对CBC模式的攻击 +1. 比特反转 +如果攻击者截获了传递信息,在这段信息中包含了初始向量IV,根据CBC模式的解密方式我们可以看出,如果攻击者对IV中的任意比特进行反转(1变为0,0变为1),那么明文中相应的比特位就会发生反转。 +![](files/3-2-2-4.png) + +- 对CBC模式的攻击 +2. 填充提示攻击 +填充提示是一种利用分组密码中太难冲部分来进行攻击的方法。在分组密码中,当明文长度不为分组长度的整数倍时,需要在最后一个分组中填充一些数据使其凑满一个分组长度。在填充提示攻击中,攻击者会反复发送一段密文,每次发送时都对填充内容进行少许修改。由于接收者(服务器)在无法正确解密时会返回一个错误消息,攻击者通过这个错误消息就可以获取一部分与明文相关的信息,当然这个方法不仅仅适用于CBC模式,而是适用于所有需要进行分组填充的模式。要防御这种攻击,就必须验证密文是否是由合法的发送者在知道明文内容的前提下生成的。 + + +#### 3.2.3 密文反馈模式(CFB) +在CFB模式中,前一个密文分组会被送回到密码算法的输入端,这里的反馈指的是返回输入端的意思。 +在ECB模式和CBC模式中,明文分组都是通过密码算法进行加密的,然而,在CFB模式中,明文分组并没有通过密码算法来直接进行加密。 +![](files/3-2-3.png) + +CFB模式的解密过程如图所示,解密算法和加密的算法是相同的,因为我们可以将CFB模式看作是一种通过分组密码来实现流加密的方式,CFB模式中的密码算法相当于用来生成伪随机数和密文进行XOR运算。通过之前对流密码的学习,我们知道流密码的加密解密的算法是相同。 +![](files/3-2-3-2.png) + +**对CFB模式的攻击** + +1. 重放攻击 +举一个例子:Alice向Bob发送了一条消息,这条消息由4个密文分别组成。攻击者将消息的后3个密文分组保存下来,第二天,Alice又向Bob发送了内容不同的4个密文分组(这里我们假设Alice使用的密钥是没有变的)。攻击者将昨天保存下来的3个分组分别替换了这段密文的后3个分组。当Bob解密的时候,4个分组中只有第一个可以解密成功,而第2组就会产生错误,然而第3和第4则被替换成了攻击者保存下来的之前使用过的分组,Bob仍然可以正常解密。此时第2个分组成为了一个错误的分组,但Bob无法确认是网络传输过程中的通信错误,还是被人篡改的。 + + +#### 3.2.3 密文反馈模式(CFB) +![](files/3-2-3-3.png) + + +#### 3.2.4 输出反馈模式(OFB) +这个模式使用分组加密法来生成一个密钥流。密钥和块加密法的初始输入启动这个加密过程,通过将块加密法的输出加密。解密的过程同样是对初始向量做加密运算,将得到的密钥流与密文做XOR运算。 +![](files/3-2-4.png) + +- CFB模式与OFB模式的对比 +OFB模式和CFB模式的区别仅仅在于密码算法的输入。 +CFB模式中,密码算法的输入是前一个密文分组,也就是将密文分组反馈到密码算法中,因此就有了“密文反馈模式”这个名字。 +OFB模式中,密码算法的输入则是密码算法的前一个输出,也就是将输出反馈给密码算法,因此就有了“输出反馈模式”这个名字。 + + +#### 3.2.5 计数器模式(CTR) +CTR模式中,每个分组对应一个逐次累加的计数器,并通过对计数器进行加密来生成密钥流。也就是说,最终的密文分组是通过将计数器加密得到的比特流,与明文分组进行XOR运算得到的。 +![](files/3-2-5.png) + +- 计数器的生成方法 +每次加密是都会生成一个不同的值(nonce)来作为计数器的初始值。例如:当分组长度为128比特(16字节)时,计数器的初始值可能是像这样的形式。 +![](files/3-2-5-2.png) + +其中,前8个字节为nonce,这个值在每次加密时必须都是不同的。后8个字节为分组序号,这个部分是会在加密的过程中逐次累加的。 + +66 1F 98 CD 37 A3 8B 4B 00 00 00 00 00 00 00 01 明文分组1的计数器 +66 1F 98 CD 37 A3 8B 4B 00 00 00 00 00 00 00 02 明文分组2的计数器 +66 1F 98 CD 37 A3 8B 4B 00 00 00 00 00 00 00 03 明文分组3的计数器 +66 1F 98 CD 37 A3 8B 4B 00 00 00 00 00 00 00 04 明文分组4的计数器 + + +### 3.3 乘积加密法 + +**乘积加密法的概念** + +1973年, Feistel提出了一种乘积加密法,它成为今天所用的对称加密法的体系结构基础。 +乘积加密法指的是:顺序地执行两个或多个基本密码系统,使得最后结果的密码强度高于每个基本密码系统产生的结果. +Feistel还提出了实现代换和置换的方法。其思想实际上是Shannon提出的利用乘积密码实现混淆和扩散思想的具体应用。 + + +#### 3.3.1 乘积加密法的结构 +![](files/3-3-1.png) + +输入是分组长为2𝑤的明文和一个密钥K。将每组明文分成左右两半𝐿_0和𝑅_0 ,在进行完n轮迭代后,左右两半再合并到一起以产生密文分组。其第i轮迭代的输入为前一轮输出的函数: + +$ L_i = R_{i-1} $ +$R_i=L_{i-1} \bigoplus F(R_{i-1},K_i)$ + +其中,$K_i$是第i轮用的子密钥,由加密密钥K得到。通常,各轮子密钥彼此不同而且与K也不同。 + + +#### 3.3.2 乘积加密法的解密过程 +乘积加密法解密过程本质上和加密过程是一样的,算法使用密文作为输入,但使用子密钥Ki的次序与加密过程相反,即第1轮使用Kn,第2轮使用Kn-1,……,最后一轮使用K1。这一特性保证了解密和加密可采用同一算法。 + +![](files/3-3-2.png) + +在加密过程中: +$LE_{16}=RE_{15}$ +$RE_{16}=LE\bigoplus F(RE_{15},K_{16})$ +在解密过程中: +$LD_1=RD_0=LE_{16}=RE_{15}$ +$RD_1=LD_0 \bigoplus F(RD_0,K_{16})=RE_{16} \bigoplus F(RE_{15},K_{16})$ + $=[LE_{15} \bigoplus F(RE_{15},K_{16})] \bigoplus F(RE_{15},K_{16})$ + $=LE_{15}$ + +所以解密过程第1轮的输出为LE15‖RE15,等于加密过程第16轮输入左右两半交换后的结果。容易证明这种对应关系在16轮中每轮都成立。一般地,加密过程的第i轮有 +$LE_i=RE_{i-1}$ +$RE_i=LE_{i-1}\bigoplus F(RE_{i-1},K_{i})$ +因此 +$RE_{i-1}=LE_i$ +$LE_{i-1}=RE_i \bigoplus F(RE_{i-1},K_i)=RE_i \bigoplus F(LE_i,K_i)$ + +#### 3.3.3 乘积加密法的特点 +乘积加密法的实现与以下参数和特性有关: +① 分组大小: 分组越大则安全性越高,但加密速度就越慢。分组密码设计中最为普遍使用的分组大小是64比特。 +② 密钥大小:密钥越长则安全性越高,但加密速度就越慢。现在普遍认为64比特或更短的密钥长度是不安全的,通常使用128比特的密钥长度。 +③ 轮数:单轮结构远不足以保证安全性,但多轮结构可提供足够的安全性。典型地,轮数取为16。 +④ 子密钥产生算法:该算法的复杂性越大,则密码分析的困难性就越大。 +⑤ 轮函数:轮函数的复杂性越大,密码分析的困难性也越大。 + +在设计乘积加密法(Feistel网络)时,还有以下两个方面需要考虑: +① 快速的软件实现:在很多情况中,算法是被镶嵌在应用程序中,因而无法用硬件实现。此时算法的执行速度是考虑的关键。 +② 算法容易分析:如果算法能被无疑义地解释清楚,就可容易地分析算法抵抗攻击的能力,有助于设计高强度的算法。 + +### 3.4 DES加密技术 +- DES的诞生与谢幕 +数据加密标准( data encryption standard, DES )是1977年美国联邦信息处理标准(FIPS)中所采用的一种对称密码。 +它是由美国IBM公司研制的,是早期的称作Lucifer密码的一种发展和修改。DES在1975年3月17日首次被公布在联邦记录中,经过大量的公开讨论后,DES于1977年1月15日被正式批准并作为美国联邦信息处理标准,即FIPS-46,同年7月15日开始生效。规定每隔5年由美国国家保密局(national security agency, NSA)作出评估,并重新批准它是否继续作为联邦加密标准。 + +最后的一次评估是在1994年1月,美国已决定1998年12月以后将不再使用DES。1997年DESCHALL小组经过近4个月的努力,通过Internet搜索了3×1016个密钥,找出了DES的密钥,恢复出了明文。1998年5月美国EFF(electronics frontier foundation)宣布,他们以一台价值20万美元的计算机改装成的专用解密机,用56小时破译了56 比特密钥的DES。美国国家标准和技术协会已征集并进行了几轮评估、筛选,产生了称之为AES(advanced encryption standard) 的新加密标准。尽管如此,DES对于推动密码理论的发展和应用毕竟起了重大作用,对于掌握分组密码的基本理论、设计思想和实际应用仍然有着重要的参考价值。 + + +#### 3.4.1 DES算法概述 +尽管DES密钥有64位,但用户只能定义其中的56位,其余的8位由算法提供。分别放在8、16、24、32、40、48、56和64位上。也就是每8位的密钥中包含了用户提供的7位和DES确定的1位,这样做是为了让每个8位的块都有奇数个奇偶校验位(即1的个数为奇数)。 +![](files/3-4-1.png) + +DES的基本结构是由乘积加密算法组成的。它对明文中每一个分组的加密过程都包含16轮,且每轮的操作完全相同。每一轮都会使用不同的子密钥,每个子密钥ki都是从主密钥k中推导出来的。 + +![](files/3-4-1-2.png) + +#### 3.4.2 DES算法的结构 +![](files/3-4-2.png) + +![](files/3-4-2-2.png) +根据Feistel算法可知,在每一轮中,实际是将右半部分Ri送入函数f中,函数的输出将与32位的左半部分Li进行XOR运算,最后左右交换。 + +#### 3.4.3 初始置换和逆初始置换 +如图所示,初始置换IP与逆初始置换IP-1都是按位置换。我们可以简单地想象成一个简单替换密码。例如:输入的第58位在置换后映射到第1位。 +![](files/3-4-3.png) + +如果再取逆初始置换Y=IP-1(X)=IP-1(IP(M)),可以看出,每个比特位的初始顺序将被恢复。 +![](files/3-4-3-2.png) + +#### 3.4.4 f函数 +f函数在DES的安全性中扮演着重要的角色。在第i轮中,f函数的输入为前一轮输出的右半部分Ri-1和当前轮子密钥ki。f函数的输出将用来参与XOR运算,加密左半部分输入位Li-1。 +F函数的结构如图所示: +![](files/3-4-3-3.png) + +- 将输入分成8个4位的分组,然后将每个分组扩展为6位,从而将32位的输入扩展为48位。这个过程在E-盒中进行。 +- 接着将扩展后的48位与本轮的子密钥ki进行XOR运算,将48位拆为8个6位长的分组分别放入8个不同的替换盒中,这个替换盒叫S-盒。 +- 从S盒中得到32位的输出,然后再用置换P进行按位置换。 + +**E-盒** + +E-盒是一种特殊的置换。它需要将32位的比特扩展为48位。 +- 将32比特分为8个4位的分组 +- 将4位的分组拓展为6位,变成8个6位分组 +![](files/3-4-4.png) + +**S-盒** +S盒是DES的核心,它将6位的输入映射为4位的输出,为DES提供了非线性特征,这意味着即使给定一个输入-输出值的集合,也很难预估所有S盒的输出。 尽管NBS/NIST早在1977年就发布DES的完整规范,但却从来没有完整披露过S-盒表的选择动机。这个事实引发了人们的很多猜测,尤其是关于是否存在只有NSA才能破解的秘密后门的可能性或一些其他故意构造的缺陷。 +对每个盒Si,其6比特输入中,第1个和第6个比特形成一个2位二进制数,用来选择Si的4个代换中的一个。6比特输入中,中间4位用来选择列。行和列选定后,得到其交叉位置的十进制数,将这个数表示为4位二进制数即得这一S盒的输出。 + +**S-盒** + +例如,S1 的输入为011001,行选为01(即第1行),列选为1100(即第12列),行列交叉位置的数为9,其4位二进制表示为1001,所以S1的输出为1001。 +S盒的每一行定义了一个可逆代换。 + +![](files/3-4-4-1.png) + +![](files/3-4-4-2.png) + +![](files/3-4-4-3.png) + +![](files/3-4-4-4.png) + +![](files/3-4-4-5.png) + +![](files/3-4-4-6.png) + +![](files/3-4-4-7.png) + +![](files/3-4-4-8.png) + +**S-盒的设计准则** + +- 每个S-盒都有6个输入位和4个输出位 +- 任意一个输出位都不应该太接近于输入位的线性组合 +- 如果输入的最高位和最低位都是固定的,只有中间的4个位是可变的,则每个可能的4位输出值都必须只出现一次。 +- 对于S-盒的两个输入,如果仅有1位不同,则输出必须至少有两位不同。 +- 对于S-盒的两个输入,如果只有中间两位不同,则输出必须至少有两位不同。 +- 对于S-盒的两个输入,如果开头的两位不同,但最后两位相同,则输出必须不同。 +- 对任意有6位非零差分的输入对,32对输入中至多有8对有相同的输出差分。 +- 8个S-盒对应的32位输出的冲突(零输出差异)只有在三个相邻的S-盒的情况下才有可能。 + +**置换P** + +32位的输出会根据下表中给出的置换P进行按位置换。与初始置换IP以及逆初始置换IP-1不同,置换P将扩散引入到DES中,因此每个S-盒的四位输出都会进行置换,使得每位在下一轮中会影响多个不同的S-盒。 +由扩充带来的扩散、S-盒与置换P可以保证,在第五轮结束时每个位都是明文位与密钥位的函数。这种行为称为雪崩效应。 + +![](files/3-4-4-9.png) + + +#### 3.4.5 密钥生成 +![](files/3-4-5.png) + + +#### 3.4.5 密钥生成 +- 用置换表PC-1进行置换操作,同时去除奇偶校验位。 +- 将密钥分为C0和D0两个部分,并进行左位移(循环移位)操作,生成C1和C2。 +- C1和C2根据置换表PC-2再次进行置换操作生成子密钥k1。 +- C1和C2进行左位移操作,生成C3和C4。 + +#### 3.4.5 密钥生成 + +**初始密钥置换PC-1** + +在置换表中忽略第8、16、24、32、40、48、56、64位,在置换的同时去掉奇偶校验。置换表如下: +![](files/3-4-5-2.png) + +**移位操作** + +得到的56位密钥被分为C0和D0两部分,周期性地向左移动一位或者两位(即循环移位),移动的具体位数则取决于轮数i,其规则为: +- 当i=1,2,9,16轮时,左右两部分向左移动一位 +- 当i≠1,2,9,16轮时,左右两个部分向左移动两位。 + +注意:循环移位要么发生在左半部分,要么发生在右半部分。 +循环移动位置的总数为$4*1+12*2=28$ 。这将带来一个有趣的属性,即$C_0=C_{16}$和$D_0=D_{16}$ 。 + +**PC-2** + +为了得到48位的子密钥ki,左右两部分需要再次根据PC-2进行按位置换。由于Ci和Di共有56位,因此PC-2需要忽略其中的8位,只置换48位。置换关系如下: +![](files/3-4-5-3.png) + + +#### 3.4.6 DES的解密过程 +DES的优势之一就是其解密过程与加密过程在本质上是完全相同的。这主要是因为DES是基本Feistel网络。与加密相同相比,解密过程中只有密钥编排逆转了,即解密的第一轮需要子密钥16;第二轮需要子密钥15;依次类推。 + + +#### 3.4.7 DES软件实现与硬件实现 + +**软件** + +最简单直观的软件实现遵循DES描述的数据流,按部就班进行实现,但是这种方法性能通常较差,这主要的是因为很多原子级的DES操作都涉及到位置换,尤其是E置换和P置换,这会使软件实现变得很慢。为此,人们提出了加快DES软件实现的算法,通常的思路就是使用一些表,这些表里的数据来自一些DES操作预计算的值,比如一些S-盒预计算值和置换预计算值。 + +**硬件** + +DES的一个设计标准就是硬件实现效率。类似E置换、P置换、IP置换等操作,非常易于使用硬件实现,因为它们只需要布线而不需要逻辑、S-盒在硬件实现上也相当简单,通常它们是使用布尔逻辑实现的,即逻辑门电路,平均下来,一个S-盒大概需要100个门。 + + +### 课堂实验 + +**在CAP4软件中实现DES加密** + +CAP4中提供了两个版本的DES,即标准的DES实现和一个小型版本(S-DES)。两者操作的方法相同,都是先输入明文或密文,然后选取Ciphers菜单中DES或S-DES。CAP4中的DES实现还提供了一个评估选项,你可以对DES进行两种类型的雪崩条件测试。 + + +### 3.5 差分密码分析与线性密码分析 +差分密码分析是迄今已知的攻击迭代密码最有效的方法之一,其基本思想是: 通过分析明文对的差值对密文对的差值的影响来恢复某些密钥比特。 +线性密码分析是对迭代密码的一种已知明文攻击,它利用的是密码算法中的“不平衡(有效)的线性逼近”。 + + +#### 3.5.1 差分密码分析 +差分密码分析法的基本思想是,比较密文与相应的明文之间的差异。基于这些差异,就可以对密钥的位进行合理的猜测。差分密码分析在1990被提出,理论上它可以破任何分组密码,然而事实证明,DES的S-盒可以很好地抵抗这种攻击。实际上,在差分密码分析被公布后,一位参与设计DES密码的研究员透露:他们在设计的时候就已经意识到这种攻击的存在,据说,之所以没有向公众公布S-盒设计标准的原因也在于,设计组不想公开差分密码分析这种强大的攻击手段。如果这是真的——当然所有的事实也支持这个说法——这意味着IBM和NSA小组已经领先学术界15年,当然,在20时机70年代和80年代只有相当少的人还在积极研究密码学。 + + +#### 3.5.1 差分密码分析 +对分组长度为n的r轮迭代密码,两个n比特串$Y_i$和$Y_i^{*-1}$的差分定义为 +$$\Delta Y_i=Y_i \bigotimes Y_i^{*-1}$$ +其中$\bigotimes$表示n比特串集上的一个特定群运算,$Y_i^{*-1}$表示$Y_i^{*}$在此群中的逆元。 +由加密对可得差分序列 +$$\Delta Y_{0}, \Delta Y_{1},..., \Delta Y_{r}$$ +其中$Y_0$和$Y_0^{*}$是明文对,$Y_i$和$Y_i^{*}$(1≤i≤r)是第i轮的输出,它们同时也是第i+1轮的输入。第i轮的子密钥记为$K_i$,F是轮函数,且$Y_i=F(Y_{i-1}, $K_i$)$。 + +![](files/3-5-1.png) + +对r-轮迭代密码的差分密码分析过程可综述为如下的步骤: +① 找出一个(r-1)-轮特征$\Omega (r-1)=a_0,a_1,...,a_{r-1}$,使得它的概率达到最大或几乎最大。 +② 均匀随机地选择明文$Y_0$并计算$Y_0^{*}$,使得$Y_0^{*}$和$Y_0^{*}$的差分为$a_0$,找出$Y_0$和$Y_0^{*}$在实际密钥加密下所得的密文$Y_r$和$Y_r^{*}$。若最后一轮的子密钥$K_r$(或$K_r$的部分比特)有$2^m$个可能值$K_r^j$(1≤j≤2m),设置相应的$2^m$个计数器$\Lambda_j$(1≤j≤2m);用每个$K_r^j$解密密文$K_r$和$Y_r^{*}$,得到$Y_{r-1}$和$Y_{r-1}^{*}$,如果$Y_{r-1}$和$Y_{r-1}^{*}$的差分是$a_{r-1}$,则给相应的计数器$\Lambda_j$加1。 +③ 重复步骤②,直到一个或几个计数器的值明显高于其他计数器的值,输出它们所对应的子密钥(或部分比特)。 + + +#### 3.5.2 线性密码分析 +设明文分组长度和密文分组长度都为n比特,密钥分组长度为m比特。记 +明文分组:P[1],P[2],…,P[n], +密文分组:C[1],C[2],…,C[n], +密钥分组:K[1],K[2],…,K[m]。 + +定义: + +$$A[i,j,...,k]=A[i]\bigoplus A[j]\bigoplus ... \bigoplus A[k]$$ + +线性密码分析的目标就是找出以下形式的有效线性方程: + +$$P[i_1,i_2,...,i_a]\bigoplus C\bigoplus [j_1,j_2,...,j_b]=K[k_1,k_2,...,k_c]$$ + +其中1≤a≤n,1≤b≤n,1≤c≤m。 +如果方程成立的概率p≠1/2,则称该方程是有效的线性逼近。如果|$p- \dfrac{1}{2}$|是最大的,则称该方程是最有效的线性逼近。 + +设N表示明文数,T是使方程左边为0的明文数。如果T>N/2,则令 +![](files/3-5-2.png) +如果T公钥体制加密的框图 + +加密过程有以下几步: +- 要求接收消息的端系统,产生一对用来加密和解密的密钥,如图中的接收者B,产生一对密钥$PK_B$,$SK_B$,其中$PK_B$是公开钥,$SK_B$是秘密钥。 +- 端系统B将加密密钥(如上图中的$PK_B$)予以公开。另一密钥则被保密(图中的$SK_B$)。 +- A要想向B发送消息m,则使用B的公开钥加密m,表示为$c=E_{PKB}[m]$,其中c是密文,E是加密算法。 +- B收到密文c后,用自己的秘密钥$SK_B$解密,表示为$m=D_{SKB}[c]$,其中D是解密算法。 + + +### 4.2 公钥密码中的数学知识 + +#### 4.2.1 公钥密码体制算法条件 + +- 产生一对密钥是计算可行的 +- 已知公钥、明文,产生密文是计算可行的 +- 利用私钥、密文,得到明文是计算可行的 +- 利用公钥来推断私钥是计算不可行的 +- 利用公钥、密文,得到明文是计算不可行的 +- 加密和解密的顺序可交换(可选条件) + +#### 4.2.2 单向函数 + +上述条件条件用数学表示即为: +- $y=f(x)$在计算上是容易的 +- $x=f^{-1}(y)$在计算上是不可行的 + +这样的函数我们称为单向函数。 + +想要理解公钥密码算法,并知道什么样的算法属于单向函数,我们需要学习一些数论知识,包括欧几里得算法、欧拉函数、费马小定理、欧拉定理等。 + + +#### 4.2.3 素数和互素数 + +**1. 因子** + +设$a$,$b(b≠0)$是两个整数,如果存在另一整数$m$,使得$a=mb$,则称$b$整除$a$,记为 $b$ | $a$,且称 $b$ 是 $a$ 的因子。 + +整数具有以下性质: +① $a$ | 1,那么 $a=±1$。 +② $a$ | $b$ 且 $b$ | $a$,则 $a=±b$。 +③ 对任一$b(b≠0)$,$b$ | $0$。 +④ $b$ | $g$,$b$ | $h$,则对任意整数 $m$、$n$ 有 $b$ | $(mg+nh)$。 + +性质④的证明: 由 $b$ | $g$,$b$ | $h$ 知,存在整数$g_1$、$h_1$,使得$g=bg_1$, $h=bh_1$ 所以 $mg+nh=mbg_1+nbh_1=b(mg_1+nh_1)$,因此$b$ | $(mg+nh)$。 + +**2. 素数** + +称整数 $p(p>1)$ 是素数,如果$p$的因子只有±1,±p。任一整数 $a(a>1)$ 都能惟一地分解为以下形式: +$$a=p_1\cdot p_2\cdot p_3 ... p_t$$ + +其中 $p_10 (i=1,…,t)$。例如: + +$$91=7\times 11$$ $$11011=7\times 11^2\times 13$$ + +这一性质称为整数分解的惟一性,也可如下陈述: +设P是所有素数集合,则任意整数a (a>1)都能惟一地写成以下形式: + +$$a=\prod_{p\in P}{P^{a_p}}$$ + +其中$a_{p}\geq 0$,等号右边的乘积项取所有的素数,然而大多指数项$a_p$为0。相应地,任一正整数也可由非0指数列表表示。 + +例如: 11011可表示为 +${a_7=1, a_{11}=2, a_{13}=1}$,即$11011=2^0\times 3^0\times 5^0 \times 7\times 9^0\times 11^2\times 13$ + +两数相乘等价于对应的指数相加,即由$k=mn$ 可得:对每一素数$p$, $k_p=m_p+n_p$。而由 $a$ | $b$ 可得: 对每一素数$p$,$a_p\leq b_p$。这是因为$p_k$只能被$p_j(j\leq k)$整除。 + +**3. 互素数** + +称 $c$ 是两个整数 $a$、$b$ 的最大公因子,如果 +① $c$ 是 $a$ 的因子也是 $b$ 的因子,即 $c$ 是 $a$ 、$b$ 的公因子。 +② $a$ 和 $b$ 的任一公因子,也是 $c$ 的因子。 +表示为 $c =gcd(a, b)$。 +如果 $gcd(a, b)=1$,则称$a$和$b$互素 + +由于要求最大公因子为正,所以gcd(a,b)=gcd(a,-b)=gcd(-a,b)=gcd(-a,-b)。一般gcd(a,b)=gcd(|a|,|b|)。由任一非0整数能整除0,可得gcd(a,0)=|a|。如果将a,b都表示为素数的乘积,则gcd(a, b)极易确定。 +例如: +$300=2^2\times 3^1\times 5^2$ + +$18=2^1\times 3^2$ + +$gcd(18,300)=2^1\times 3^1\times 5^0=6$ + +一般由 $c=gcd(a,b)$ 可得:对每一素数 $p$,$c_p=min(a_p,b_p)$。 + +#### 4.2.4 欧几里得算法 + +然而,对于一个大整数而言,我们很难去因式分解,欧几里得算法提供了一个更有效的算法计算gcd,这个算法基于一简单的观察,即: + +$gcd(r_0,r_1)=gcd(r_0-r_1,r_1)$ + +其中,通常假设$r_0 >r_1$,并且两个数均为正整数。此属性的证明非常简单: + +假设$gcd(r_0,r_1)=g$,由于g可以同时除$r_0$和$r_1$,则可以记作$r_0=g\cdot x$和$r_1=g\cdot y$,其中$x>y$,且x和y为互素的整数,即它们没有公共因子。此外,证明(x-y)与y互素也非常简单。因此可以得到: + +$gcd(r_0-r_1,r_1)=gcd(g\cdot (x-y),g\cdot y)=g$ + +**实例:** + +假设$r_0=973$,$r_1=301$,gcd的计算方式为: + +步骤|运算 +--|-- +$973=3\times 301+70$ |$gcd(973,301)=gcd(301,70)$ +$301=4\times 70+21$ |$gcd(301,70)=gcd(70,21)$ +$70=3\times 21+7$ |$gcd(70,21)=gcd(21.7)$ +$21=3\times 7+0$ |$gcd(21,7)=gcd(7,0)=7$ + + +**欧几里得算法伪代码实现** + +输入:正整数$r_0$和$r_1$,且$r_0>r_1$ +输出:$gcd(r_0,r_1)$ +初始化:$i=1$ + +算法: +>do +>$i=i+1$ +>$r_1=r_{i-2}\space mod\space r_{i-1}$ +>while $r_i\neq 0$ +>return $gcd(r_0,r_1)=r_{i-1}$ + +当计算到余数$r_i=0$时,此算法结束,前一轮迭代计算得到的余数就是原始问题的gcd。 + +即使处理非常长的数字(这些数字通常在公钥密码学中使用),欧几里得算法依然高效。迭代次数与输入操作数的位数有紧密的关系。这意味着如果一个gcd涉及的数字都是1024位,则此gcd的迭代次数就是1024乘以一个常数。几千次迭代的算法在当今PC上很容易实现。 + +#### 4.2.6 模运算 + +设n是一正整数,a是整数,如果用n除a,得商为q,余数为r,则 + +$a=qn+r,0\leq r\leq n,q=\lfloor \frac {a}{n}\rfloor$ + +$\lfloor \frac {a}{n}\rfloor$表示对$\frac {a}{n}$进行下取整 + +用 $a\space mod\space n$ 表示余数 $r$,则$a=\lfloor \frac {a}{n}\rfloor n+amodn$。 + +如果$a\space mod\space n=b\space mod\space n$,则称两整数 $a$ 和 $b$ 模 $n$ 同余,记为$a≡b\space mod\space n$。称与 $a$ 模 $n$ 同余的数的全体为 $a$ 的同余类,记为$[a]$,称 $a$ 为这个同余类的表示元素。 + +*注意: 如果 $a≡0\space mod\space n$,则 $n$ | $a$* + +同余有以下性质: + +① 若 $n$ | $(a-b)$,则 $a≡b\space mod\space n$ +② $a\space mod\space n≡b\space mod\space n$,则$a≡b\space mod\space n$ +③ $a≡b\space mod\space n$,则$b≡a\space mod\space n$ +④ $a≡b\space mod\space n$,$b≡c\space mod\space n$,则$a≡c\space mod\space n$ + +从以上性质易知,同余类中的每一元素都可作为这个同余类的表示元素。 + +求余数运算(简称求余运算)a mod n将整数a映射到集合{0,1, …,n-1},称求余运算在这个集合上的算术运算为模运算,模运算有以下性质: + +① $[(a\space mod\space n)+(b\space mod\space n)] mod\space n=(a+b) mod\space n$。 +② $[(a\space mod\space n)-(b\space mod\space n)] mod\space n=(a-b)\space mod\space n$。 +③ $[(a\space mod\space n)×(b\space mod\space n)] mod\space n=(a×b)\space mod\space n$。 + +性质①的证明: 设 $a\space mod\space n=r_a$,$b\space mod\space n=r_b$,则存在整数$j$、$k$ 使得 $a=j\cdot n+r_a$,$b=k\cdot n+r_b$。 + +因此 + +$(a+b)\space mod\space n=[(j+k)n+r_a+r_b]\space mod\space n=(r_a+r_b)\space mod\space n += [(a\space mod\space n)+(b\space mod\space n)]\space mod\space n$ (证毕) + +性质②、③的证明类似。 + + +#### 4.2.7 扩展的欧几里得算法 + +在讲欧几里得算法的时候我们已经知道两个整数 $r_0$ 和 $r_1$ 的gcd的计算可以通过不断进行迭代地减小操作数来实现。然而,事实证明,欧几里得算法的主要应用并不在计算gcd。扩展的欧几里得算法可以用来计算模逆元,而模逆元在公钥密码学中占有举重若轻的地位。拓展的欧几里得算法除了可以计算gcd外,还能计算以下形式的线性组合: + +$gcd(r_0,r_1)=s\cdot r_0+t\cdot r_1$ + +其中s和t均表示整型系数。这个等式通常也称为丢番图方程。 +这个算法的思路是:执行标准欧几里得算法,但将每轮迭代中的余数$r_i$表示为以下形式的线性组合: + +$r_i=s_ir_0+t_ir_i$ + +如果这个过程成功了,则最后一轮迭代对应的等式为: + +$r_i=gcd(r_0,r_1)=s_ir_0+t_ir_1=sr_0+tr_1$ + +这也意味着最后一个系数$s_i$也是等式所寻找的系数s,同时$t_i=t$。 + +#### 4.2.8 费马小定理和欧拉定理 + +**费马小定理** + +定理:若 $p$ 是素数,a是正整数且 $gcd(a, p)=1$,则 $a^{p-1}≡1\space mod\space p$。 + +若 $n$ 不能整除 $a-b$,$x>0$,$(x,n)=1$,则$n$也不能整除 $x(a-b)$。$A$ 为所有小于 $p$ 的集($A$ 构成 $p$ 的完全剩余系,即 $A$ +中不存在两个数同余 $p$ ),$B$ 是 $A$ 中所有的元素乘以 $a$ 组成的集合。因为 $A$ 中的任何两个元素之差都不能被 $p$ 整除,所以 $B$ 中的任何两个元素之差也不能被 $p$ 整除。 + +换句话说,$gcd(a,p)=1$,考虑 $1*a,2*a,3*a,....(p-1)*a$ 共 $(p-1)$ 个数,将它们分别除以 $p$,余数分别为 $r_{1},r_{2},r_{3},....,r_{p-1}$,则集合 ${r1,r2,r3,...,rp-1}$ 为集合 ${1,2,3,...,(p-1)}$ 的重新排列,即 $1,2,3,....,(p-1)$ 在余数中恰好各出现一次;这是因为对于任两个相异 $k*a$ 而言$k=1,2,3,...,(p-1)$,其差不是p的倍数(所以不会有相同余数),且任一个 $k*a$ 亦不为 $p$ 的倍数(所以余数不为0)。 + +因此 + +{\displaystyle 1\cdot 2\cdot 3\cdot \dots \cdot (p-1)\equiv (1\cdot a)\cdot (2\cdot a)\cdot \dots \cdot ((p-1)\cdot a){\pmod {p}},} {\displaystyle 1\cdot 2\cdot 3\cdot \dots \cdot (p-1)\equiv (1\cdot a)\cdot (2\cdot a)\cdot \dots \cdot ((p-1)\cdot a){\pmod {p}},} +即 + +{\displaystyle W\equiv W\cdot a^{p-1}{\pmod {p}},} W\equiv W\cdot a^{{p-1}}{\pmod {p}}, +在这里W=1·2·3·...·(p-1),且(W, p) = 1,因此将整个公式除以W即得到: + +{\displaystyle a^{p-1}\equiv 1{\pmod {p}}} a^{{p-1}}\equiv 1{\pmod {p}} + +证明:由前面的讨论知,当 $gcd(a, p)=1$ 时,$a×z_p=z_p$,其中a×Zp表示a与Zp中每一元素做模p乘法。又知a×0≡0 mod p,所以a×Zp-{0}=Zp-{0},a×(Zp-{0})=Zp-{0}。即 +{a mod p,2a mod p,…,(p-1)a mod p}={1,2,…,p-1} + +**费马小定理** +所以: +$a×2a×…×(p-1)a≡[(a mod p)×(2a mod p)×…×$ +((p-1)a mod p)] mod p≡(p-1)! mod p +另一方面 +$a×2a×…×(p-1)a=(p-1)!ap-1$ +因此 +$(p-1)!ap-1≡(p-1)! mod p$ +由于(p-1)!与p互素,因此(p-1)!有乘法逆元,由乘法可约律得$a_{p-1}\equiv 1 mod p$。(证毕) +费马小定理也可写成如下形式: 设p是素数,a是任一正整数,则$a_p\equiv a mod p$。 + +**欧拉函数** +设n是一正整数,小于n且与n互素的正整数的个数称为n的欧拉函数,记为$\phi (n)$。 +例如: $\phi (6)=2$ ,$\phi (7)=6$ ,$\phi (8)=4$。 +若n是素数,则显然有$\phi (n)=n-1$。 + +定理: 若n是两个素数p和q的乘积,则$\phi (n)=\phi (p)× \phi (q)=(p-1)×(q-1)$。 + +证明:考虑$Z_n={0,1,…,pq-1}$,其中不与n互素的数有3类,$A={p,2p,…,(q-1)p}$,$B={q,2q,…,(p-1)q},C={0}$,且$A∩B=Φ$, +否则$ip=jq$,其中$1≤i≤q-1$,$1≤j≤p-1$,则$p$是$jq$的因子,因此是$j$的因子,设$j=kp$,$k≥1$。则$ip=kpq$,$i=kq$,与$1≤i≤q-1$矛盾。 +所以$φ(n)=|Zn|-[|A|+|B|+|C|]=pq-[(q-1)+(p-1)+1]$ + $=(p-1)×(q-1)=φ(p)×φ(q)$ (证毕) +例如:由21=3×7,得$\phi (21)=\phi (3)× \phi (7)=2×6=12$。 + +定理:若a和n互素,则aφ(n)≡1 mod n。 +证明: 设$R=\{x_1, x_2, …, x_{\phi (n)}\}$是由小于n且与n互素的全体数构成的集合,$a×R=\{ax_1\space mod\space n, ax_2\space mod\space n,…, ax_{\phi (n)}\space mod\space n\}$,对$a×R$中任一元素$ax_i\space mod\space n$,因a与n互素,$x_i$与n互素,所以$ax_i$与n互素,且$ax_i\space mod\space n < n$,因此$ax_i mod n\in R$,所以$a\times R\subseteq R$。 + +![](files/2018-05-15-11-40-03.png) + + +#### 4.2.9 素性检验 +素性检验是指对给定的数检验其是否为素数。对于大数的素性检验来说没有简单直接的方法,本节介绍一个概率检验法,为此需要以下引理。 + +引理: 如果p为大于2的素数,则方程$x^2≡1(mod\space p)$的解只有x≡1和x≡-1。 +证明:由$x^2≡1\space mod\space p$,有$x^2-1≡0\space mod\space p$,$(x+1)(x-1)≡0\space mod\space p$,因此$p|(x+1)$或$p|(x-1)$或 $p|(x+1)$且$p|(x-1)$。 +若$p|(x+1)$且$p|(x-1)$,则存在两个整数$k$和$j$,使得$x+1=kp$,$x-1=jp$,两式相减得$2=(k-j)p$,为不可能结果。所以有$p|(x+1)$或$p|(x-1)$。 +设$p|(x+1)$,则$x+1=kp$,因此$x≡-1(mod\space p)$。 +类似地可得 $x≡1(mod\space p)$。(证毕) + +引理的逆否命题为:如果方程$x^2≡1\space mod\space p$有一解 +$x_0 \notin {-1,1}$,那么p不为素数。 + +例如: 考虑方程$x^2≡1(mod\space 8)$由模乘法的结果得 +$1^2≡1 mod 8$, $3^2≡1\space mod\space 8$, $5^2≡1\space mod\space 8$, $7^2≡1\space mod\space 8$ +又$5≡-3\space mod\space 8$,$7≡-1\space mod\space 8$,所以方程的解为1,-1,3,-3,可见8不是素数。 + +下面介绍Miller-Rabin的素性概率检测法。首先将n-1表示为二进制形式bkbk-1…b0,并给d赋初值1,则算法Witness(a,n)的核心部分如下: +``` +for i=k downto 0 do + { + x←d; + d←(d×d) mod n; + if d=1 and(x≠1)and(x≠n-1)then return False; + if bi=1 then d←(d×a) mod n + } +if d≠1 then return False; +return True. +``` + +此算法有两个输入参数,n是待检验的数,a是小于n的整数。如果算法的返回值为False,则n肯定不是素数,如果返回值为True,则n有可能是素数。 + +for循环结束后,有$d≡a^{n-1}\space mod\space n$,由Fermat定理知,若n为素数,则d为1。因此若d≠1,则n不为素数,所以返回False。 + +因为n-1≡-1 mod n,所以(x≠1)and(x≠n-1),指$x^2≡1 (mod\space n)$有不在{-1,1}中的根,因此n不为素数,返回False。 + +该算法有以下性质: 对s个不同的a,重复调用这一算法,只要有一次算法返回为False,就可肯定n不是素数。如果算法每次返回都为True,则n是素数的概率至少为$1-2^{-s}$,因此对于足够大的s,就可以非常肯定地相信n为素数。 + + +#### 4.2.10 中国剩余定理 +中国剩余定理是数论中最有用的一个工具,定理说如果已知某个数关于一些两两互素的数的同余类集,就可重构这个数。 + +例如:Z_{10}中每个数都可从这个数关于2和5(10的两个互素的因子)的同余类重构。比如已知x关于2和5的同余类分别是[0]和[3],即x mod 2≡0,x mod 5≡3。可知是偶数且被5除后余数是3,所以可得8是满足这一关系的惟一的x。 + +利用中国剩余定理还可以将大数用小数表示、大数的运算通过小数实现。 + +例如:假设只能处理5以内的数,则要考虑15以内的数,可将15分解为两个小素数的乘积,$15=3\times 5$,将1到15之间的数列表示,表的行号为0-1,列号为0-4,将1-15的数填入表中,使得其所在行号为该数除3得到的余数,列号为该数除5得到的余数。如$12\space mod\space 3=0,12\space mod\space 5=2$,所以12应该填在第0行,第二列。 + +$\space$|0|1|2|3|4 +-|-|-|-|-|- +0|0|6|12|3|9 +1|10|1|7|13|4 +2|5|11|2|8|14 + +例如: 求$12\times 13(mod\space 15)$ +因为12和13所在的行号分别为0和1,12和13所在的列号分别为2和3,由$0\times 1\equiv 0\space mod\space 3$;$2\times 3\equiv 1\space mod\space 5$得$12\times 13(mod\space 15)$所在的列号和行号分别为0和1,这个位置上的数是6,所以得到$12\times 13(mod\space 15)\equiv 6$ + +又因为$0+1\equiv 1\space mod\space 3$;$2+3\equiv 0\space mod\space 5$第1行、第0列为10,所以$12+13\equiv 10\space mod\space 15$ + +定理4.5(中国剩余定理) 设$m_1,m_2,…,m_k$是两两互素的正整数,$M=$则一次同余方程组 + +$$ +\begin{cases} + a_1(mod \space m_1) \equiv x \\ + a_2(mod \space m_2) \equiv x \\ + ... \\ + a_k(mod \space m_k) \equiv x +\end{cases} +$$ + +对模M有惟一解: +$x\equiv (\frac{M}{m_1}e_1a_1+\frac{M}{m_2}e_2a_2+...+\frac{M}{m_k}e_ka_k)(mod \space M)$ +其中$e_i$满足$\frac{M}{m_i}e_i\equiv 1(mod\space m_i)\space(i=1,2,...,k)$ + +证明:设$M_i=\frac{M}{m_i}=\prod^{k}_{l=1,l\not = i}m_i$,$i=1,2,…,k$,由$M_i$的定义得$M_i$与$m_i$是互素的,可知$M_i$在模$m_i$下有惟一的乘法逆元,即满足$\frac{M}{m_i}e_i\equiv 1(mod\space m_i)$的$e_i$是惟一的。 + +下面证明对$\forall i\in {1,2,…,k}$,上述x满足$a_i(mod\space m_i)\equiv x$。注意到当$j≠i$时,$m_i|M_j$,即$M_j\equiv 0(mod\space m_i)$。所以 + +$$ +(M_j\times e_j\space mod\space m_j)\space mod\space m_i +≡((M_j mod m_i)\times ((e_j\space mod\space m_j)\space mod\space m_i))\space mod\space m_i +≡0 +$$ + +而$(M_i\space (e_i\space mod\space m_i))\space mod\space m_i≡(M_i\times e_i)\space mod\space m_i\equiv 1$ + +所以$x(mod\space m_i)\equiv a_i$,即$a_i(mod\space m_i)\equiv x$ + +下面证明方程组的解是惟一的。设$x'$是方程组的另一解,即 +$x'\equiv a_i (mod\space m_i)\space (i=1,2,…,k)$ +由$x\equiv a_i (mod\space m_i)$得$x'-x\equiv 0(mod\space m_i)$, +即$m_i|(x'-x)$。再根据$m_i$两两互素,有$M|(x'-x)$,即$x'-x\equiv 0(mod\space M)$,所以$x'(mod\space M)=x(mod\space M)$。(证毕) + +中国剩余定理提供了一个非常有用的特性,即在模M下可将非常大的数x由一组小数$(a_1, a_2,…,a_k)$表达。 + +用中国剩余定理可对数据库文件加密。一个数据库文件由若干数据域组成,将每一数据域看成一个整数,用中国剩余定理可对该文件加密,使得一个用户可解密一个特定的数据域,但无法解密其他数据域。 + +设数据库文件是$D=$,k个用户的解密密钥(也称读密钥)分别是正整数$m_1,m_2,...,m_k$(两两互素)。设$M=\prod^{k}_{i=1}m_i$,则对D的加密过程如下: + +求与解密密钥$m_1$对应的加密密钥(也称写密钥)$F_i=\frac{M}{m_i}e_i,(i=1,2,...,k)$,其中$e_i$满足$\frac{M}{m_i}e_i\equiv 1(mod\space m_i)$。 + +D对应的密文为$x\equiv (F_1a_1+F_2a_2+...+F_ka_k)(mod\space M)$ + +由中国剩余定理知,用户i对$x$解密可得$x(mod\space m_i)\equiv a_i$但得不到$a_j(j\not =i)$ + +#### 4.2.11 公钥密码体制的要求 + +公钥体制的基本原理是陷门单向函数。 + +陷门单向函数是满足下列条件的可逆函数f: + +- 对于任意的x,计算y = f (x)是容易的。 +- 对于任意的y,计算x使得y = f (x)是困难的。 +- 存在陷门t,已知t时,对于任意的y,计算x使得y = f (x)则是容易的。 + +**(1)大整数分解问题(factorization problem)** +若已知两个大素数p和q,求n = pq是容易的,只需一次乘法运算,而由n,求p和q则是困难的,这就是大整数分解问题。 + + +**( 2)离散对数问题(discrete logarithm problem)** +给定一个大素数p,p-1含另一大素数因子q,则可构造一个乘法群,它是一个p-1阶循环群。设g是的一个生成元,1<g<p-1。已知x,求$y=g^x\space mod\space p$是容易的,而已知y、g、p,求x使得$y = g^x\space mod\space p$成立则是困难的,这就是离散对数问题。 + +**(3)多项式求根问题** +有限域GF(p)上的一个多项式: +$y=f(x)=x^n+a_{n-1}x^{n-1}+...+a_1x+a_0\space mod\space p$ +已知$a_0,a_1,...,a_{n-1}$, p和x,求y是容易的,而已知y,$a_0,a_1,...a_{n-1}$,求x则是困难的,这就是多项式求根问题。 + +**(4)判断Diffie-Hellman问题** +给定素数p,令g是的一个生成元。已知$a=g^x$,$b=g^y$,$c=g^z$,判断等式:$z=x^y\space mod\space p$是否成立,这就是判断性Diffie-Hellman问题。 + +**(5)二次剩余问题(quadratic residue problem)** +给定一个合数n和整数a,判断a是否为mod n的二次剩余,这就是二次剩余问题。在n的分解未知时,求$x^2=a\space mod\space n$的解也是一个困难问题。 + +**(6)背包问题(knapsack problem)** +给定向量$A=(a_1,a_2,...,a_n)$(a_i为正整数)和$x=(x_1,x_2,...,x_n) (x_i∈{0,1})$,求和式: +$s=f(x)=a_1x_1+a_2x_2+...+a_nx_n$ +是容易的,而由A和S,求x则是困难的,这就是背包问题,又称子集和问题。 + + +### 4.3 RSA密码体制 +![](files/4-3.png) +RSA是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的。 + + +#### 4.3.1 算法描述 +**1.密钥生成** +① 选取两个保密的大素数p和q。 +② 计算$n = p\times q$,$\phi (n)=(p-1)(q-1)$,其中是n的欧拉函数值。 +③ 随机选取整数e,满足$1 < e < \phi (n) $ ,且$gcd(e,\phi (n))=1$。 +④ 计算d,满足。$de\equiv 1\space mod \space \phi (n)$ +⑤ 公钥为$(e,n)$,私钥为$(d, n)$。 + +**2.加密** +首先对明文进行比特串分组,使得每个分组对应的十进制数小于n,然后依次对每个分组m做一次加密,所有分组的密文构成的序列即是原始消息的加密结果。即m满足$0≤m< n$,则加密算法为: +$c=m^e\space mod \space n$ +c为密文,且 $0 ≤ c < n$。 + +**3.解密** +对于密文0≤c<n,解密算法为: +$m=c^d \space mod \space n$ + +![](files/4-3-1-3.png) + +![](files/4-3-1-4.png) + + +#### 4.3.2 RSA算法中的计算问题 + +**RSA的加密与解密过程** +RSA的加密、解密过程都为求一个整数的整数次幂,再取模。如果按其含义直接计算,则中间结果非常大,有可能超出计算机所允许的整数取值范围。如上例中解密运算$66^{77} mod 119$,先求6677再取模,则中间结果就已远远超出了计算机允许的整数取值范围。而用模运算的性质: +(a×b) mod n=[(a mod n)×(b mod n)] mod n +就可减小中间结果。 + +**RSA的加密与解密过程** +再者,考虑如何提高加、解密运算中指数运算的有效性。例如求$x^{16}$,直接计算的话需做15次乘法。然而如果重复对每个部分结果做平方运算即求x,$x^2$,$x^4$,$x^8$,$x^{16}$则只需4次乘法。 +求$a^m$可如下进行,其中a,m是正整数: +将m表示为二进制形式$b_k$ $b_{k-1}$…$b_0$,即 + +$m=b_k2^k+b_{k-1}2^{k-1}+…+b_12+b_0$ +因此 +![](files/4-3-2.png) + +**RSA密钥的产生** +产生密钥时,需要考虑两个大素数p、q的选取,以及e的选取和d的计算。 +因为n=pq在体制中是公开的,因此为了防止敌手通过穷搜索发现p、q,这两个素数应是在一个足够大的整数集合中选取的大数。如果选取p和q为$10^{100}$左右的大素数,那么n的阶为$10^{200}$,每个明文分组可以含有664位($10^{200}\approx 2^{664}$),即83个8比特字节,这比DES的数据分组(8个8比特字节)大得多,这时就能看出RSA算法的优越性了。因此如何有效地寻找大素数是第一个需要解决的问题。 + +寻找大素数时一般是先随机选取一个大的奇数(例如用伪随机数产生器),然后用素性检验算法检验这一奇数是否为素数,如果不是则选取另一大奇数,重复这一过程,直到找到素数为止。素性检验算法通常都是概率性的,但如果算法被多次重复执行,每次执行时输入不同的参数,算法的检验结果都认为被检验的数是素数,那么就可以比较有把握地认为被检验的数是素数。 + +可见寻找大素数是一个比较繁琐的工作。然而在RSA体制中,只有在产生新密钥时才需执行这一工作。 +p和q决定出后,下一个需要解决的问题是如何选取满足1q$,由φ(n)=(p-1)(q-1),则有 +p+q=n-φ(n)+1 +以及 +![](files/4-3-3.png) +由此可见,由p、q确定φ(n)和由φ(n)确定p、q是等价的。 + +为保证算法的安全性,还对p和q提出以下要求: +**(1)$|p-q|$要大** +由$\frac{(p+q)^2}{4}-n=\frac{(p+q)^2}{4}-pq=\frac{(p-q)^2}{4}$,如果|p-q|小,则$\frac{(p-q)^2}{4}$也小,因此$\frac{(p+q)^2}{4}$稍大于n,$\frac{p+q}{2}$稍大于$\sqrt{n}$。可得n的如下分解步骤: +- 顺序检查大于$\sqrt{n}$的每一整数$x$,直到找到一个$x$使得$x^2-n$是某一整数(记为y)的平方。 +- 由$x^2-n=y^2$,得$n=(x+y)(x-y)$。 + + +**(2)p-1和q-1都应该有大素因子** +这是因为RSA算法存在着可能的重复加密攻击法。设攻击者截获密文c,可如下进行重复加密: +$c^e\equiv (m^e)^e\equiv m^{e^2}(mod\space n)$ +$c^{e^2}\equiv (m^e)^{e^2}\equiv m^{e^3}(mod\space n)$ +... +$c^{e^{t-1}}\equiv (m^e)^{e^{t-1}}\equiv m^{e^t}(mod\space n)$ +$c^{e^t}\equiv (m^e)^{e^t}\equiv m^{e^{t+1}}(mod\space n)$ + +若$m^{e^{t+1}}\equiv c(mod\space n)$,即$(m^{e^t})^e\equiv c(mod\space n)$,则 + +有$m^{e^t}\equiv m(mod\space n)$,即$c^{e^{t-1}}\equiv m(mod\space n)$,所以在上述重复加密的倒数第2步就已经恢复出明文m,这种攻击法只有在t较小时才是可行的。为了抵抗这种攻击,p、q的选取应保证使t很大。 +![](files/4-3-3-4.png) + +设m在模n下阶为k,由$m^{e^t}\equiv (mod n)$ +得$m^{e^t-1}\equiv 1(mod\space n)$,所以$k|(e^t-1)$,即$e^t\equiv 1(mod\space k)$,t取为满足上式的最小值(为e在模k下的阶)。又当e与k互素时$t| φ(k)$。为使t大,k就应大且$φ(k)$应有大的素因子。 + +此外,研究结果表明,如果$e < n$且$d < n^{\frac{1}{4}}$,则d能被容易地确定。 + + +#### 4.3.4 对RSA的攻击 +RSA存在以下两种攻击,并不是因为算法本身存在缺陷,而是由于参数选择不当造成的。 + +**1. 共模攻击** +在实现RSA时,为方便起见,可能给每一用户相同的模数n,虽然加解密密钥不同,然而这样做是不行的。 + +设两个用户的公开钥分别为e1和e2,且e1和e2互素(一般情况都成立),明文消息是m,密文分别是 + +$c_1≡m^{e1}(mod n)$ + +$c_2≡m^{e2}(mod n)$ + +敌手截获c1和c2后,可如下恢复m。用推广的Euclid算法求出满足 +re_1+se_2=1 +的两个整数r和s,其中一个为负,设为r。再次用推广的Euclid算法求出c-11,由此得 +(c^{-1}_1)^{-r}c^s_2≡m(mod n)。 + +**2. 低指数攻击** +假定将RSA算法同时用于多个用户(为讨论方便,以下假定3个),然而每个用户的加密指数(即公开钥)都很小。设3个用户的模数分别为ni (i=1,2,3),当i≠j时,gcd(ni,nj)=1,否则通过gcd(ni,nj)有可能得出ni和nj的分解。设明文消息是m,密文分别是 + +$c1≡m^3(mod n1)$ + +$c2≡m^3(mod n2)$ + +$c3≡m^3(mod n3)$ + +由中国剩余定理可求出$m^3(mod n1n2n3)$。由于m3 p和g是公共参数,被所有用户所共享,这一点与RSA算法是不同的。另外,在RSA算法中,每个用户都需要生成两个大素数来建立自己的密钥对(这是很费时的工作),而ElGamal算法只需要生成一个随机数和执行一次模指数运算就可以建立密钥对。 + +**2. 加密** +对于明文,首先随机选取一个整数$k$,$1\leq k\leq p-2$,然后计算:$c_1=g^k\space mod\space p$,$c_2=my^k\space mod\space p$,则密文$c=(c_1,c_2)$。 + +**3. 解密** +为了解密一个密文$c=(c_1,c_2)$,计算: +$m=\frac{c_2}{c^x_1}mod\space p$ + +#### 4.4.3 ElGamal的安全性 +在ElGamal公钥密码体制中,$y=g^x\space mod\space p$。从公开参数g和y求解私钥x需要求解离散对数问题。目前还没有找到一个有效算法来求解有限域上的离散对数问题。因此,ElGamal公钥密码体制的安全性是基于有限域上离散对数问题的困难性。为了抵抗已知的攻击,p应该选取至少160位以上的十进制数,并且p-1至少应该有一个大的素因子。 + +### 4.5 椭圆曲线公钥密码 +椭圆曲线密码学(英语:Elliptic curve cryptography,缩写为 ECC),一种建立公开密钥加密的算法,基于椭圆曲线数学。椭圆曲线在密码学中的使用是在1985年由Neal Koblitz和Victor Miller分别独立提出的。 + +ECC的主要优势是在某些情况下它比其他的方法使用更小的密钥——比如RSA加密算法——提供相当的或更高等级的安全。ECC的另一个优势是可以定义群之间的双线性映射,基于Weil对或是Tate对;双线性映射已经在密码学中发现了大量的应用,例如基于身份的加密。不过一个缺点是加密和解密操作的实现比其他机制花费的时间长。 + +### 4.5.1 实数域上的椭圆曲线 +椭圆曲线并非椭圆,之所以称为椭圆曲线是因为它的曲线方程与计算椭圆周长的方程相似。一般的,椭圆曲线指的是由维尔斯特拉斯(Weierstrass)方程: +$y^2=axy+by=x^3+cx^2+dx+e$ + +其中a,b,c,d,e是满足某些简单条件的实数。定义中包括一个称为无穷点的元素,记为O。下图是椭圆曲线的两个例子。 + +![](files/2018-05-15-16-26-52.png) +图4-5-1 椭圆曲线的两个例子 + +从图可见,椭圆曲线关于x轴对称。 +椭圆曲线上的加法运算定义如下: 如果其上的3个点位于同一直线上,那么它们的和为O。 +进一步可如下定义椭圆曲线上的加法律(加法法则): + +- O为加法单位元,即对椭圆曲线上任一点P,有P+O=P。 + +- 设$P_1=(x,y)$是椭圆曲线上的一点, 它的加法逆元定义为$P_2=-P_1=(x,-y)$。 + +这是因为$P_1$、$P_2$的连线延长到无穷远时,得到椭圆曲线上的另一点O,即椭圆曲线上的3点$P_1$、$P_2$,O共线,所以$P_1+P_2+O=O$,$P_1+P_2=O$,即$P_2=-P_1$。 + +由O+O=O,还可得O=-O + +- 设Q和R是椭圆曲线上x坐标不同的两点,Q+R的定义如下: 画一条通过Q、R的直线与椭圆曲线交于P1(这一交点是惟一的,除非所做的直线是Q点或R点的切线,此时分别取$P_1=Q$和$P_1=R$)。由$Q+R+P_1=O$得$Q+R=-P_1$。 + +- 点Q的倍数定义如下: 在Q点做椭圆曲线的一条切线,设切线与椭圆曲线交于点S,定义$2Q=Q+Q=-S$。类似地可定义$3Q=Q+Q+Q+,…,$等。 + +以上定义的加法具有加法运算的一般性质,如交换律、结合律等。 + + +#### 4.5.2 有限域上的椭圆曲线 +密码中普遍采用的是有限域上的椭圆曲线,有限域上的椭圆曲线是指曲线方程定义式中,所有系数都是某一有限域GF(p)中的元素(其中p为一大素数)。其中最为常用的是由方程 +$y^2\equiv x^3+ax+b(mod\space p)$ +$(a,b∈GF(p),4a^3+27b^2(mod\space p)≠0)$ +定义的曲线。 + + +#### 4.5.2 有限域上的椭圆曲线 +因为$\Delta=(\frac{a}{3})^3+(\frac{b}{2})^2=\frac{1}{108}(4a^3+27b^2)$是方程$x^3+ax+b=0$的判别式,当$4a^3+27b^2=0$时,方程$x^3+ax+b=0$有重根。设为$x_0$,则点$Q_0=(x_0,0)$是方程$y^2=x^3+ax+b$的重根。令$F(x,y)=y^2-x^3-ax-b$,则$\frac{\partial F}{\partial x}|_{Q_0}=\frac{\partial F}{\partial y}|_{Q_0}=0$,所以$\frac{dy}{dx}=-\frac{\partial F}{\partial x}/\frac{\partial F}{\partial y}$在$Q_0$点无定义,即曲线$y^2\equiv x^3+ax+b$在$Q_0$点的切线无定义,因此点$Q_0$的倍点运算无定义。 + +例: p=23,a=b=1,$4a^3+27b^2(mod\space 23)\equiv 8≠0$ ,方程为$y^2≡x^3+x+1$,其图形是连续曲线,由图4-5-1(b)所示。 + +然而我们感兴趣的是曲线在第一象限中的整数点。设$E_p(a,b)$表示方程所定义的椭圆曲线上的点集$\{(x,y)|0≤x$x_3≡λ^2-x_1-x_2(mod p)$ +>$y_3≡λ(x_1-x_3)-y_1(mod p)$ + +其中 + +$$ +\lambda = \begin{cases} + \frac{y_2-y_1}{x_2-x_1}\space P\not=Q \\ + \frac{3x^2_1+a}{2y_1}\space P\not=Q +\end{cases} +$$ + +例: 仍以$E_{23}(1,1)$为例,设P=(3,10),Q=(9,7),则 +![](files/2018-05-15-20-10-58.png) +所以P+Q=(17,20),仍为$E_{23}(1,1)$中的点。 + +若求2P则 +![](files/2018-05-15-20-11-28.png) +所以2P=(7,12)。 + +倍点运算仍定义为重复加法,如 +4P=P+P+P+P +从例题看出,加法运算在$E_{23}(1,1)$中是封闭的,且能验证还满足交换律。对一般的$E_p(a,b)$,可证其上的加法运算是封闭的、满足交换律,同样还能证明其上的加法逆元运算也是封闭的,所以$E_p(a,b)$是一个Abel群。 + + +#### 4.5.3 椭圆曲线上的点数 +在上一个例题中,GF(23)上的椭圆曲线$y^2\equiv x^3+x+1$在第一象限中的整数点加无穷点O共有28个。一般有以下定理: + +GF(p)上的椭圆曲线$y^2=x^3+ax+b \space (a,b\in GF(p),4a^3+27b^2\not =0)$在第一象限中的整数点加无穷远点O共有 + +$1+p+\sum_{x\in GF(p)}(\frac{x^3+ax+b}{p})=1+p+\varepsilon $个 + +其中$(\frac{x^3+ax+b}{p})$是Legendre符号。 + +定理中的$\varepsilon$由以下定理给出: +Hasse's 定理 +$|\varepsilon |\leq 2\sqrt{p}$ + +Hasse's 定理也称为Hasse's 边界,它说明了点的个数大概在素数p的范围内。这个结论具有非常大的实用性。例如,需要一个拥有$2^{160}$个元素的椭圆曲线,我们必须使用一个长度大约为160位的素数。 + +#### 4.5.4 明文消息到椭圆曲线上的嵌入 +在使用椭圆曲线构造密码体制之前,需要将明文消息嵌到椭圆曲线上,作为椭圆曲线上的点。设明文消息是$m(0\leq m\leq M)$,椭圆曲线$y^2\equiv x^3+ax+b(mod\space p)$$(a,b∈GF(p),4a^3+27b^2(mod\space p)≠0)$,k是一个足够大的整数,使得将明文消息嵌入到椭圆曲线上时,错误率是$2^{-k}$。实际中,k可在30到50之间取值。下面取k=30,对明文消息m,如下计算一系列$x$: + +$x=\{mk+j,j=0,1,2,...\}={30m,30m+1,30m+2,...}$ + +直到$x^3+ax+b(mod\space p)$是平方根,即得到椭圆曲线上的点$(x,\sqrt{x^3+ax+b})$。因为在0到p的整数中,由一半是模p的平方剩余,一班是模p的非平方剩余。所以k次找到$x$,使得$x^3+ax+b(mod\space p)$是平方根的概率不小于$1-2^{-k}$。 + +反过来,为了从椭圆曲线上的点(x,y)得到明文消息m,只需要$m=\llcorner +\frac{x}{30} \lrcorner$ + +#### 4.5.5 椭圆曲线上的密码 +为使用椭圆曲线构造密码体制,需要找出椭圆曲线上的数学困难问题。 + +在椭圆曲线构成的Abel群$E_p(a,b)$上考虑方程Q=kP,其中P,$Q∈E_p(a,b)$,k>2n,而且如果函数所用的密钥为k比特,则可能的密钥个数为$2^k$。如果系统不考虑保密性,即敌手能获取明文消息和相应的MAC,那么在这种情况下要考虑敌手使用穷搜索攻击来获取产生MAC的函数所使用的密钥。 + +假定k>n,且敌手已得到$M_1$和$MAC_1$,其中$AC_1=C_{K1}(M_1)$,敌手对所有可能的密钥值$K_i$求$MAC_i=C_{Ki}(M_1)$,直到找到某个$K_i$使得$MAC_i=MAC_1$。由于不同的密钥个数为$2^k$,因此将产生$2^k$个MAC,但其中仅有$2^n$个不同,由于$2^k>2^n$,所以有很多密钥(平均有$2^k/2^n=2^{k-n}$个)都可产生出正确的$MAC_1$,而敌手无法知道进行通信的两个用户用的是哪一个密钥,还必须按以下方式重复上述攻击: + +第1轮 已知$M_1$、$MAC_1$,其中$MAC_1=C_K(M_1)$。对所有$2^k$个可能的密钥计算$MAC_i=C_{Ki}(M_1)$,得$2^{k-n}$个可能的密钥。 +第2轮 已知$M_2$、$MAC_2$,其中$MAC_2=C_K(M_2)$。对上一轮得到的$2^{k-n}$个可能的密钥计算$MAC_i=C_{Ki}(M_2)$,得$2^{k-2×n}$个可能的密钥。 +如此下去,如果$k=αn$,则上述攻击方式平均需要$α$轮。例如,密钥长为80比特,MAC长为32比特,则第1轮将产生大约248个可能密钥,第2轮将产生216个可能的密钥,第3轮即可找出正确的密钥。 + +如果密钥长度小于MAC的长度,则第1轮就有可能找出正确的密钥,也有可能找出多个可能的密钥,如果是后者,则仍需执行第2轮搜索。 +所以对消息认证码的穷搜索攻击比对使用相同长度密钥的加密算法的穷搜索攻击的代价还要大。然而有些攻击法却不需要寻找产生MAC所使用的密钥。 + +例如,设M=(X1‖X2‖…‖Xm)是由64比特长的分组$X_i(i=1,…,m)$链接得到的,其消息认证码由以下方式得到: +$\varDelta (M)=X_1\oplus X_2\oplus ...\oplus X_m$ +$C_K(M)=E_K[\varDelta(M)]$ +其中$\oplus$表示异或运算,加密算法是电码本模式的DES。因此,密钥长为56比特,MAC长为64比特,如果敌手得到M‖CK(M),那么敌手使用穷搜索攻击寻找K将需做256次加密。然而敌手还可用以下方式攻击系统: 将$X_1$到$X_{m-1}$分别用自己选取的$Y_1$到$Y_{m-1}$替换,求出$Ym=Y_1\oplus Y_2\oplus ...\oplus Y_{m-1}\oplus Δ(M)$,并用$Y_m$替换$X_m$。因此敌手可成功伪造一新消息$M'=Y_1...Y_m$,且M'的MAC与原消息M的MAC相同。 + +考虑到MAC所存在的以上攻击类型,可知它应满足以下要求,其中假定敌手知道函数C,但不知道密钥K: +① 如果敌手得到M和CK(M),则构造一满足CK(M′)=CK(M)的新消息M′在计算上是不可行的。 +② CK(M)在以下意义下是均匀分布的: 随机选取两个消息M、M′,Pr[CK(M)=CK(M′)]=2-n,其中n为MAC的长。 +③ 若M′是M的某个变换,即M′=f(M),例如f为插入一个或多个比特,那么Pr[CK(M)=CK(M′)]= 2-n。 + +第1个要求是针对上例中的攻击类型的,此要求是说敌手不需要找出密钥K而伪造一个与截获的MAC相匹配的新消息在计算上是不可行的。第2个要求是说敌手如果截获一个MAC,则伪造一个相匹配的消息的概率为最小。最后一个要求是说函数C不应在消息的某个部分或某些比特弱于其他部分或其他比特,否则敌手获得M和MAC后就有可能修改M中弱的部分,从而伪造出一个与原MAC相匹配的新消息。 + + +#### 5.2.3 数据认证算法 +数据认证算法是最为广泛使用的消息认证码中的一个,已作为FIPS Publication(FIPS PUB 113)并被ANSI作为X9.17标准。 +算法基于CBC模式的DES算法,其初始向量取为零向量。需被认证的数据(消息、记录、文件或程序)被分为64比特长的分组D1,D2,…,DN,其中最后一个分组不够64比特的话,可在其右边填充一些0,然后按以下过程计算数据认证码(见图6.2): + +![](files/6-1-3.png) + +数据认证算法 + +![](files/6-1-3-2.png) +其中E为DES加密算法,K为密钥。 +数据认证码或者取为$O_N$或者取为$O_N$的最左M个比特,其中16≤M≤64。 + + + +### 5.3 Hash函数 +Hash函数是一个将任意长度的消息(message)映射成固定长度消息的函数。 +![](files/5-1-1.png) +将h称为一个Hash函数(hash function),或称为哈希函数、散列函数。对于任何消息x ,将h(x)称为x的Hash值、散列值、消息摘要(message digest)。 + + +#### 5.3.1 Hash函数的碰撞(collision) +设x、x’是两个不同的消息,如果 + +h(x)=h(x’) + +则称x和x’是Hash函数h的一个(对)碰撞. + + +#### 5.3.2 Hash函数的分类 +* 单向Hash函数(one-way) + 给定一个Hash值y,如果寻找一个消息x,使得y=h (x)是计算上不可行的,则称h是单向Hash函数. +* 弱抗碰撞Hash函数(weakly collision-free) + 任给一个消息x,如果寻找另一个不同的消息x’,使得h(x) =h(x’)是计算上不可行的,则称h是弱抗碰撞Hash函数. +* 强抗碰撞Hash函数 (strongly collision-free) + 如果寻找两个不同的消息x和x’,使得h(x)=h(x’)是计算上不可行的,则称h是强抗碰撞Hash函数. + + +#### 5.3.3 安全Hash函数 +* 安全Hash函数h应具有以下性质: + - 对任意的消息x,计算h(x)是容易的; + - h是单向的; + - h是弱抗碰撞的,或是强抗碰撞的。 + + +#### 5.3.4 Hash函数的安全性 +* 对Hash函数的攻击是指寻找一对碰撞消息的过程 +* 生日悖论(birthday paradox) +生日问题:假设每个人的生日是等概率的,每年有365天,在k个人中至少有两个人的生日相同的概率大于1/2,问k最小应是多少? +k人生日都不同的概率是: + +$(1-\frac{1}{365})(1-\frac{2}{365}...(1-\frac{k-1}{365})$ + +k人中至少有2人生日相同的概率为: + +$p(365,k)=1-(1-\frac{1}{365})(1-\frac{2}{365}...(1-\frac{k-1}{365})$ + +有P(365,23)=0.5073。即在23个人中,至少有两个人生日相同的概率大于0.5,这个数字比人们直观猜测的结果小得多,因而称为生日悖论。 + +#### 5.3.4 Hash函数的安全性 + +**生日攻击法** + +生日悖论原理可以用于构造对Hash函数的攻击 + +>设Hash函数值有n个比特,m是真消息,M是伪造的假消息,分别把消息m和M表示成r和R个变形的消息。消息与其变形消息具有不同的形式,但有相同的含义。将消息表示成变形消息的方法很多,例如增加空格、使用缩写、使用意义相同的单词、去掉不必要的单词等。 + + +#### 5.3.4 Hash函数的安全性 + +**生日攻击法** + +分别把消息m和M表示成r和R个变形的消息 + +![](files/5-1-2.png) + +计算真消息m的变形与假消息M的变形发生碰撞的概率 +由于n比特长的散列值共有2n个,所以对于给定m的变形mi和M的变形Mj,mi与Mj不碰撞的概率是1-1/2n。由于M共有R个变形,所以M的全部变形都不与mi碰撞的概率是: + +$(1-\frac{1}{2^n})^R$ + +因为消息m共有r个变形,因此m的变形与M的变形都不碰撞的概 +率是: + +$(1-\frac{1}{2^n})^{rR}$ + +m的变形与M的变形发生碰撞的概率是: + +$P(n)=1-(1-\frac{1}{2^n})^{rR}\approx1-e^{-\frac{rR}{2^n}}$ + +当r=R=2n/2时,P(n)=1e10.63。对于Hash值长度为64比特的Hash函数,生日攻击的时间复杂度约为232,所以是不安全的。 +>为了抵抗生日攻击,建议Hash值长度至少为128 比特 + +**中间相遇攻击(in-the-middle attack)** + +- 用于攻击一类具有特殊结构的Hash函数 +- 分析Hash函数运算的中间值相等的概率 +- 讨论一类利用加密变换构造的Hash函数 + +设加密体制为: +$H=M=\sum^n,E_k:H\times M$ →$\sum^n$ + +对于消息m=(m1, m2),其散列值的计算分以下两步: +(1) h1= EK(m1, IV); +(2) d=h(m)=EK (m2, h1), +其中IV是加密变换的初始值。 +这类Hash函数将遭受中间相遇攻击。 + +* 用于攻击一类具有特殊结构的Hash函数 +* 分析Hash函数运算的中间值相等的概率 +* 讨论一类利用加密变换构造的Hash函数 +* 攻击方式: 假设攻击者要找出一个假消息M=(M1, M2),使得M与m是一个碰撞。设m的散列值都为d。攻击者首先产生消息M1的r个变形,消息M2的R个变形. + +![](files/5-1-2-2.png) + +令:$\{M_{1,i}|i=1,2,...,r\},\{M_{2,j}=1,2,...,R\}$ +计算:$H_1=\{h_{1,i}=E_K(M_{1,i},IV)|i=1,2,...,r\}$ +$H_2=\{h_{2,j}=D_K(M_{2,j}),d|j=1,2,...,R\}$ + +这里DK是解密变换。假设加密变换EK是随机的,那么可以使用生日攻击法来分析集合H1和H2中出现相同元素的概率。 +如果集合H1与H2有相同元素,例如h1, i= h2, j=DK(M2, j, d),则有d=EK (M2, j, h1,i ),即M与m有相同的散列值d。 + +$h_1=E_k(m_1,IV)$ + +$d=h(m)=E_k(m_2,h_1)$ + + +#### 5.3.5 Hash函数的迭代构造法 + +**压缩函数(compression function)** + +$f:\{0,1\}^{m+t}$ →$\{0,1\}^m\space (t\geq 1)$ + +**迭代技术** +设x是一个长度为L的比特串。重复应用压缩函数f,对消息x进行多次压缩,最后得到x的散列值 + +![](files/5-1-3.png) + +计算消息x的散列值h(x)的步骤 +- 预处理: 用一个公开算法在消息x右方添加若干比特,得到比特串y,使 得y的长度为t的倍数。即有 + +$y=x||pad(x)=y_1||y_2||...||y_r$ + +其中| yi|=t (i =1, 2,…, r),pad(x)称为填充函数。典型的填充函数是先添加x长度| x|的值,再添加若干比特(例如0)。 +- 迭代过程: 设$H_0=IV$是一个长度为m的初始比特串,重复使用压缩函数f,依次计算 + +$Hi= f (H_{i-1}|| y_i) (i=1, 2,…,r)$ + +- 输出变换: 设g: {0,1}m{0,1}t是一个公开函数,令 + +$h(x)=g(H_r)$ + +- 用上述方法构造的Hash函数称为迭代Hash函数。大多数实用Hash函数都是迭代Hash函数 +- 在预处理阶段,必须保证变换xy是单射。因为如果预处理变换xy不是单射,则存在xx’使得y=y’,从而h(x)=h(x’),即能够找到h的碰撞。 +- 对于任意无碰撞的压缩函数,都可以使用迭代技术构造一个无碰撞的Hash函数。 + + +### 5.4 MD5哈希函数 +MD5(MD:message digest,消息摘要) +1990年10月, 著名密码学家R. L. Rivest在MIT(Massachusetts Institute of Technology)提出了一种Hash函数,作为RFC 1320 (RFC:互联网研究和开发机构工作记录)公开发表,称为MD4. MD5是MD4的改进版本, 于1992年4月作为RFC 1321公开发表. + +* MD5特性 +- 直接构造法: 不依赖任何密码系统和假设条件 +- 算法简洁 +- 计算速度快 +- 特别适合32位计算机软件实现 +- 倾向于使用低端结构 + +#### 5.4.1 MD5算法 +MD5算法的输入可以是任意长度的消息x,对输入消息按512位的分组为单位进行处理,输出128位的散列值MD(x)。整个算法分为五个步骤。 + +**步骤1: 增加填充位** +- 在消息x右边增加若干比特,使其长度与448模512同余。也就是说,填充后的消息长度比512的某个倍数少64位。 +- 即使消息本身已经满足上述长度要求,仍然需要进行填充。 +- 例如,若消息长为448,则仍需要填充512位使其长度为960位。填充位数在1到512之间。填充比特的第一位是1,其它均为0。 + +**步骤2: 附加消息长度值** +用64位表示原始消息x的长度,并将其附加在步骤1所得结果之。若填充前消息长度大于264,则只使用其低64位。填充方法是把64比特的长度分成两个32比特的字,低32比特字先填充,高32比特字后填充。 + +步骤1与步骤2一起称为消息的预处理 +- 经预处理后,原消息长度变为512的倍数 +- 设原消息x经预处理后变为消息 +$Y=Y_0Y_1...Y_{L-1}$ +其中$Y_i(i =0,1,...,L-1)$是512比特 +在后面的步骤中,将对512比特的分组$Y_i$进行处理 + +假设消息为: +x=“abcde”=01100001 01100010 01100011 01100100 01100101=$(61 62 63 64 65)_{16}$,|x|=40=$(28)_16$ + +在x的右边填充1个“1”和407个“0”,将x变成448比特的$x_1$: + +$x_1$= $x$ || 1 || 0 (407个) += $x$ || 800000 00000000 00000000 00000000 00000000 + 00000000 00000000 00000000 00000000 00000000 + 00000000 00000000 00000000 +=61626364 65800000 00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 00000000 00000000 +00000000 00000000 + + +$x$=“abcde”=01100001 01100010 01100011 01100100 01100101=(61 62 63 64 65)16, |x|=40=(28)16 + +处理后的比特串为(16进制表示): +$x_2=x_1||28$(64位) +=61626364 65800000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 28000000 00000000 + +**步骤3:初始化MD缓冲区** + +- MD5算法的中间结果和最终结果都保存在128位的缓冲区里,缓冲区用4个32位的寄存器表示。 +- 4个缓冲区记为A、B、C、D,其初始值为下列32位整数(16进制表示): + +>A=67 45 23 01 +>B=EF CD AB 89 +>C=98 BA DC FE +>D=10 32 54 76 + +- 上述初始值以小端格式存储(字的最低有效字节存储在低地址位置 )为: + +>字A=01 23 45 67 +>字B=89 AB CD EF +>字C=FE DC BA 98 +>字D=76 54 32 10 + +**步骤4:压缩函数** + +以512位的分组(16个字)为单位处理消息 +- MD5是迭代Hash函数, 其压缩函数为: + +$H_{MD5}:\{0,1\}^{128+512}$ → $\{0,1\}^{128}$ + +步骤4是MD5算法的主循环,它以512比特作为分组,重复应用压缩函数$H_MD5$,从消息Y的第一个分组$Y_1$开始,依次对每个分组$Y_i$进行压缩,直至最后分组$Y_{L-1}$,然后输出消息x的Hash值。可见,MD5的循环次数等于消息Y中512比特分组的数目L。 + +**MD5压缩函数$H_{MD5}$** + +$H_{MD5}:\{0,1\}^{128+512}$ → $\{0,1\}^{128}$ + +- $H_{MD5}$由四轮处理组成 +- 加法是指缓冲区中的4个字与$CV_i$中对应的4个字分别模232相加 + +![](files/5-2-1.png) + +$H_{MD5}$的四轮处理过程的算法结构相同,每一轮要对缓冲区ABCD进行16次迭代,每次迭代的运算形式为: + +$a←b+L^s(a+g(b,c,d)+X[k]+T[i])$ + +其中a、b、c、d分别为缓冲区A、B、C、D中的字,运算结束后再将(a、b、c、d)循环右移一个字。 + +![](files/5-2-1-2.png) + +* $H_{MD5}$的基本逻辑函数g +- 每一轮使用一个基本逻辑函数g,每个基本逻辑函数的输入是三个32位的字,输出是一个32位的字,它执行位逻辑运算,即输出的第n位是其三个输入的第n位的函数 +- 基本逻辑函数g的定义:符号$\wedge$、$\vee$和$-$分别表示逻辑操作AND、OR、NOT和XOR + +|轮数|基本逻辑函数g|g(b,c,d)| +|-|-|-| +|1|F(b,c,d)|$(b\wedge c)\vee (\overline b \wedge d)$| +|2|G(b,c,d)|$(b\wedge d)\vee (c \wedge \overline d)$| +|3|H(b,c,d)|$b\oplus c\oplus d$| +|4|I(b,c,d)|$c\oplus (b\wedge \overline d)$| + +$H_MD5$的基本逻辑函数g +基本逻辑函数g的真值表 + +![](files/5-2-1-3.png) + +- 字组X +把当前处理的512比特的分组Yi依次分成16个32比特的字, 分别记为X[0,1,…,15]. +- 在每一轮的16步迭代中, 每一步迭代使用一个字,迭代步数不同使用的字也不相同. 因此, 16步迭代恰好用完16个字。 + +* 对于不同轮处理过程, 使用16个字的顺序不一样. +- 第一轮中,使用顺序为X[0,1,…,15]。 +- 第二轮中使用顺序由下列置换确定: + $\rho_2(i)= (1+5i)\space mod\space 16$ +- 第三轮中使用顺序由下列置换确定: + $\rho_3(i)= (5+3i)\space mod\space 16$ +- 第四轮中使用顺序由下列置换确定: + $rho_4(i)= 7i\space mod\space 16$ +* 例如:第三轮处理过程的第i步迭代使用字 + $X[\rho_3(i)]=X[(5+3_i)\space mod\space 16]$ + 第8步迭代使用字 + $X[\rho_3(8)]=X[(5+3\times 8)]=X[29]=X[23]$ + +* 常数表T:64个32位常数 + - $T[i] =2^{32}\times abs(sin(i))$的整数部分(i=1,2,…,64) + +![](files/5-2-1-4.png) + +* 常数表T的作用是“随机化”32位的输入数据,即消除输入数据的规律性。 +* HMD5的第k轮处理过程使用常数表T的元素 + $T[16(k-1)+1, 16(k-1)+2,…,16k] (k=1,2,3,4)$ + 第k轮的第i次迭代使用元素 + $T[16(k-1)+ i](i=1,2,…,16)$ + +循环左移位数s +$L^s(v)$表示对32位的变量v循环左移s位。s的值与轮数和迭代步数有关。 + +|步数 \\ 轮数|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16| +|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-| +|1|7|12|17|22|7|12|17|22|7|12|17|22|7|12|17|22| +|2|5|9|14|20|5|9|14|20|5|9|14|20|5|9|14|20| +|3|4|11|16|23|4|11|16|23|4|11|16|23|4|11|16|23| +|4|6|10|15|21|6|10|15|21|6|10|15|21|6|10|15|21| + +**步骤5: 输出** +依次对消息的L个512比特的分组进行处理,第L个分组处理后的输出值即是消息x的散列值MD(x)。 +可将MD5的处理过程归纳如下: +- $CV_0=IV$ +- $CV_{i+1}=SUM_{32}[CV_i, RF_I(Y_i,RF_H(Y_i,RF_G(Y_i,RF_F(Y_i,CV_i))) )] (i=0,1,…,L-1)$ +- $MD=CV_{L-1}$ +- $IV$=第三步定义的缓冲区ABCD的初值 +- L =消息经第一步和第二步处理后分组的个数 +- $Y_i$ =消息的第i个512位分组 +- $RF_u$ =使用基本逻辑函数u的轮函数 +- $SUM_{32}$=对输入字的模232相加 +- MD =散列值 + +### 5.4.2 MD5的安全性 +* Rivest猜测,MD5可能是128位Hash函数中强度最大的。 +* 目前,对MD5的攻击已取得以下结果: + - T. Berson(1992)已经证明,对单轮的MD5算法,利用差分密码分析,可以在合理的时间内找出散列值相同的两条消息。这一结果对MD5四轮运算的每一轮都成立。但是,目前尚不能将这种攻击推广到具有四轮运算的MD5上. + - B. Boer和A. Bosselaers(1993)说明了如何找到消息分组和MD5两个不同的初始值,使它们产生相同的输出. 也就是说, 对一个512位的分组, MD5压缩函数对缓冲区ABCD的不同值产生相同的输出,这种情况称为伪碰撞(pseudo-collision).目前尚不能用该方法成功攻击MD5算法. + +* 目前,对MD5的攻击已取得以下结果(续): + - H. Dobbertin(1996)找到了MD5无初始值的碰撞(pseudo-collision).给定一个512位的分组,可以找到另一个512位的分组,对于选择的初始值IV0,它们的MD5运算结果相同. 到目前为止, 尚不能用这种方法对使用MD5初始值IV的整个消息进行攻击. + - 我国山东大学王小云教授(2004)提出的攻击对MD5最具威胁。对于MD5的初始值IV,王小云找到了许多512位的分组对,它们的MD5值相同. + - 国际密码学家Lenstra利用王小云等提供的MD5碰撞,伪造了符合X.509标准的数字证书. +* MD5算法抗密码分析能力较弱,对MD5的生日攻击所需代价为264数量级. 所以, 必须设计新的Hash算法, 使其与MD5相比具有更长的散列值和更高的安全性. + +### 5.5 安全Hash算法SHA-1 +安全Hash算法SHA(secure hash algorithm)由美国标准与技术研究所(NIST)设计并于1993年作为联邦信息处理标准(FIPS 180)发布 +修改版于1995年发布(FIPS 180-1),通常称之为SHA-1。该标准称为安全Hash函数。 +RFC 3174也给出了SHA-1,它基本上是复制FIPS 180-1的内容,但增加了C代码实现。 +SHA-1算法的输入是长度小于264的任意消息x,输出160位的散列值。 + + +#### 5.5.1 SHA-1算法步骤 +SHA-1处理消息的过程与MD5类似,对输入消息按512位的分组为单位进行处理,整个算法分为五个步骤 + +**步骤1: 增加填充位** + +在消息右边增加若干比特,使其长度与448模512同余。即使消息本身已经满足上述长度要求,仍然需要进行填充。填充位数在1到512之间。填充比特的第一位是“1”,其它均为“0”。 + +**步骤2: 附加消息长度值** + +用64位表示原始消息x的长度,并将其附加在步骤1所得结果之后。 +- 步骤1与步骤2一起称为消息的预处理 + +经预处理后,原消息长度变为512的倍数。设原消息x经预处理后变为消息$Y=Y_0 Y1… Y_{L-1}$,其中$Y_i(i =0,1,…,L-1)$是512比特。在后面的步骤中,将对512比特的分组$Y_i$进行处理。 + +**步骤3: 初始化缓冲区** + +SHA-1算法的中间结果和最终结果保存在160位的缓冲区里,缓冲区用5个32位的寄存器表示。5个缓冲区记为A、B、C、D、E,其初始值为下列32位整数(16进制表示): + +>A=67 45 23 01 +>B=EF CD AB 89 +>C=98 BA DC FE +>D=10 32 54 76 +>E=C3 D2 E1 F0 + +其中,前4个初始值与MD5的初始值相同。SHA1以大端格式存储缓冲区的值,即字的最高有效字节存于低地址字节位置。因此,上述初始值存储为(十六进制): + +>字A=67 45 23 01 +>字B=EF CD AB 89 +>字C=98 BA DC FE +>字D=10 32 54 76 +>字E=C3 D2 E1 F0 + +- 步骤4: 以512位的分组(16个字)为单位处理消息 +SHA-1是迭代Hash函数,其压缩函数为: + +$H_{SHA}:\{0,1\}^{160+512}→\{0,1\}^{160}$ + +- 步骤4是SHA-1算法的主循环,它以512比特作为分组,重复应用压缩函数HSHA,从消息Y的第一个分组$Y_1$开始,依次对每个分组$Y_i$进行压缩,直至最后分组Y_{L-1},然后输出消息x的Hash值。 +SHA-1循环次数等于消息Y中512比特分组的数目L。 + +**SHA-1的压缩函数$H_{SHA}$** + +* 由四轮处理组成 +* 加法是模232相加 + + + +- 压缩函数HSHA的四轮处理过程的算法结构相同,每一轮要对缓冲区ABCDE进行20次迭代,每次迭代的运算形式为 + +$A,B,C,D,E\space ←\space (E+f(B,C,D)+L^5(A)+W_t+K_t),A,L^{30}(B),C,D$ + +其中A、B、C、D、E分别为五个缓冲区中的字,运算结束后再将(A、B、C、D、E)循环右移一个字。 + +![](files/5-3-1-2.png) + +* 基本逻辑函数f + - 每一轮使用一个基本逻辑函数f,每个基本逻辑函数的输入是三个32位的字,输出是一个32位的字,它执行位逻辑运算,即输出的第n位是其三个输入第n位的函数。 + +|轮数|基本逻辑函数f|f(B,C,D)| +|-|-|-| +|1|$f_1(B,C,D)$|$(B\wedge C)\vee (\overline B \wedge D)$| +|2|$f_2(B,C,D)$|$B\oplus C \oplus D$| +|3|$f_3(B,C,D)$|$(B\wedge C)\vee (B \wedge D)\vee (C\wedge D)$| +|4|$f_4(B,C,D)$|$B\oplus C \oplus D$| + + +* 基本逻辑函数f + - 基本逻辑函数f的真值表 + +![](files/5-3-1-3.png) + +* 字组$W_t$ + - t(0≤t≤79)代表迭代步数,依次表示第一、二、三、四轮处理过程进行的迭代次序 + - $W_t(0≤t≤79)$是32比特的字,它的前面16个字$W_0,W_1,…,W_{15}$依次取自当前输入分组$Y_i$,其余字为 + + $W_t=L^1(W_{t-16}\oplus W_{t-14}\oplus W_{t-3})\space (t=16,17,...79)$ + +加法常数表$K_t$ + +|迭代步数|十六进制|十进制| +|-|-|-| +|$0\leq t \leq 19$|5A827999|[$2^{30}\times \sqrt{2}$]| +|$20\leq t \leq 39$|6ED9EBA1|[$2^{30}\times \sqrt{3}$]| +|$40\leq t \leq 59$|8F1BBCDC|[$2^{30}\times \sqrt{5}$]| +|$60\leq t \leq 79$|CA62C1D6|[$2^{30}\times \sqrt{10}$]| + +**步骤5: 输出** + +- 第L个分组处理后的输出值即是消息x的散列值MD(x) +- SHA-1的处理过程归纳如下: + + $CV_0=IV$ + + $CV_{i+1}=SUM_{32}(CV_i, ABCDE_i ) (i=0,1,…, L-1)$ + + $MD= CV_{L-1}$ +- 其中: + + IV =第三步定义的缓冲区ABCDE的初值 + + $ABCDE_i$ =处理第i个消息分组时最后一轮的输出 + + L =消息经第一步和第二步处理后分组的个数 + + SUM_{32}=对输入字的模$2^{32}$相加 + + MD =散列值 + + +#### 5.5.2 SHA-1和MD5的比较 +* SHA-1与MD5的算法类似,所以它们的性质极为相似 +* 抗穷举攻击的能力 + - SHA1抗穷举攻击的能力比MD5强 + - 用穷举攻击方法产生具有给定散列值的消息 + + MD5需要的代价为2128数量级 + + SHA1需要的代价为2160数量级 + - 用穷举攻击方法产生两个具有相同散列值的消息 + + MD5需要的代价为264数量级 + + SHA1需要的代价为280数量级 +* 抗密码分析的能力 + - MD5算法抗密码分析的能力较弱 + - SHA1算法抗密码分析的能力似乎并不弱 + +* 速度 + SHA-1执行的速度比MD5的速度慢得多 +* 简洁性 + SHA-1和MD5两种算法都易于描述和实现,不需要使用大的程序和置换表 +* 数据的存储方式 + MD5使用little-endian方式,SHA-1使用big-endian方式。这两种方式没有本质的差异 + + +### 5.6 基于分组密码与离散对数的Hash函数 + +**Hash函数的间接构造法** +- 利用已有的密码算法构造Hash函数 +- 如果密码算法是安全的,那么利用它所构造的Hash函数也是安全的 + + +#### 5.6.1 利用分组密码算法构造Hash函数 + +**已知条件** + +设$E_k$是一个分组长度为n的分组密码的加密算法,密钥为k,对于任意的消息x,首先对x进行分组,每组的长度为n。设消息x为: +$x=x_1 x_2…x_L$, +其中$x_i\in GF(2)^n\space (1\leq i\leq L)$ + +**基于分组密码CBC工作模式构造Hash函数** +首先选取一个初始值: $y_0=IV\in GF(2)^n$, +然后依次计算: +$y_i=E_k(x_i\oplus y_{i-1})(1\leq i\leq L)$ +最后定义Hash值为: $h_{CBC}(x)=y_L$ + +![](files/5-4-1.png) + +**基于分组密码CFB工作模式构造Hash函数** +- 首先选取一个初始值: y0 =IVGF(2)n, +- 然后依次计算: +$y_i=x_i\oplus E_k(y_{i-1})(1\leq i\leq L)$ +最后定义Hash值为: $h_{CFB}(x)=y_L$ + +![](files/5-4-1-2.png) + +在密钥公开的情况下,基于分组密码CBC工作模式和CFB工作模式构造的Hash函数是不安全的,它们甚至不是弱无碰撞的. + + +#### 5.6.2 基于离散对数问题的Hash函数 +* 基于一些困难数学问题,诸如离散对数问题、因子分解问题、背包问题等可以构造出一些Hash函数,这些Hash函数的安全性依赖于对应数学问题的困难性 +* Chaum、Heijst和Pfitzmann(1992年)提出的基于离散对数问题构造的Hash函数 + - 运行速度不是很快 + - 可以证明是安全的. +* Chaum-Heijst-Pfitzmann Hash函数的构造 + 设p是一个大素数,$q=(p-1)/2$是一个素数,$\alpha$和$\beta$是$Z_p$的两个本原元。假设离散对数$log_{\alpha}\beta$是计算上不可行的。定义Hash函数$h$为: +$h:Z_p\times Z_p → Z_p^{*}$ +$h(x_1,x_2)=\alpha^{x_1}\times \beta^{x_2}\space mod \space p$ + +Chaum-Heijst-Pfitzmann Hash函数是强抗碰撞的,用反证法,如果Hash函数h有一对碰撞,那么可以证明离散对数$log^{\alpha}\beta$能被有效计算. + +设$(x_1, x_2)$,$(x_3, x_4)$是h的一对碰撞消息,即$(x_1, x_2)\neq (x_3, x_4)$,$h(x_1, x_2)=h(x_3, x_4)$,那么 +$\alpha^{x_1}\beta^{x_2}=\alpha^{x_3}\beta^{x_4}\space mod\space p \space \Rightarrow\space \alpha^{x_1-x_3}=\beta^{x_4-x_2}\space mod\space p$ + +记$d=gcd(x_4-x_2, p-1)$。因为p-1=2q,且q是一个素数,所以$d\in {1,2, q, p-1}$。下面对d的四个取值分别进行讨论。 + +* 情况1:d =1 +此时$x_4-x_2$关于模p-1有逆,设$y=(x_4-x_2)^{-1}\space mod\space(p-1)$,则存在整数k,使得$(x_4-x_2)y=1+(p-1)k$,则有 +![](files/5-4-2.png) +因此,可计算离散对数 +![](files/5-4-2-2.png) + +* 情况2:d =2 +因为$p-1=2q$,且q是奇数,所以$gcd(x_4-x_2, q)=1$。设$y=(x_4-x_2)^{-1}\space mod\space q$,则存在整数k,使得 $(x_4-x_2) y=1+qk$, 有 + +![](files/5-4-2-3.png) + +由于$\alpha^q=-1\space mod\space p$,所以 +![](files/5-4-2-4.png) + +容易检验二式中哪一个成立. 即离散对数$log_{\alpha}^{\beta}$能被有效计算。 + +* 情况3:d = q +因为 0≤x2≤q-1, 0≤x4≤q-1 +$\rightarrow -(q-1)≤x4-x2≤q-1 \rightarrow gcd(x4-x2, q-1)= q$不成立。 +情况3不存在. + +* 情况4:d =p-1 +这种情况只有在$x_2=x_4$时才可能发生。这样就有 +$\alpha^{x-1}=\alpha^{x_3}\space mod\space p$ +所以$x_1=x_3,(x_1, x_2)= (x_3, x_4)$,与已知矛盾! 即情况4也不存在。 diff --git a/doc/CRYPT-6_数字签名.md b/doc/CRYPT-6_数字签名.md new file mode 100644 index 0000000..1160b55 --- /dev/null +++ b/doc/CRYPT-6_数字签名.md @@ -0,0 +1,629 @@ +# CRYPT-6 数字签名 + +**author : Odyssey@cyberpeace** + +## 目录 +6.1 数字签名概念 +6.2 RSA数字签名体制 +6.3 ElGamal数字签名体制 +6.4 其它数字签名方案 +6.5 数字签名标准 +6.6 应用 + +## 6.1 数字签名概念 +- 在政治、军事、外交、商业和日常生活中,人们经常需要对纸质材料进行签名。 +- 签名起到确认、核准、生效和负责任等多种作用。 +- 随着计算机网络技术的发展,电子商务、电子政务和电子金融等系统得到广泛应用,人们需要通过网络信息传输对电子的文件、契约、合同、信件和张单等进行数字签名以替代手写签名。 + +### 6.1 数字签名概念 +- 签名是证明当事人的身份和数据真实性的一种信息。 +- 在传统的以书面文件为基础的事物处理中,采用书面签名的形式,如手签、手印和印章等。书面签名得到司法部门的支持,具有一定的法律意义 + +![](files/6-1.png) + + +### 6.1 数字签名概念 +- 在以计算机文件为基础的现代事物处理中,应采用电子形式的签名,即数字签名(digital signature)。 +- 数字签名的目的是提供一种手段,使得一个实体把他的身份与某个信息捆绑在一起。 +- 一个信息的数字签名实际上是一个数,它仅仅依赖于签名者的密钥和被签名的消息。 + +![](files/6-1-2.png) + + +#### 6.1.1 数字签名的基本概念 + + 一个数字签名体制是一个满足以下条件的五元组: $(M,S,K,sig,ver)$ + +- 消息空间M:由所有任意长度消息组成的集合 +- 签名空间S: 由所有签名组成的集合。签名长度不超过n。 +- 密钥空间K +- 签名算法sig:$M\times K→S$, $s=sig_k(m)$ +- 验证算法ver:$M\times S→\{ture,false\}$, +$$ +ver(m,s)= +\begin{cases} +Ture,s=sig_k(m)\\ +False,s\neq sig_k(m) +\end{cases} +$$ +- 任意消息$m\in M$,如果$s=sig_k(m)$,则将数据对(x,y)称为消息x的一个数字签名,或直接把y称为消息x的数字签名 + +- 数字签名基本要求 + - 对每一个密钥K, sigK和verK应该是多项式时间函数 + - verK是公开的函数, 而sigK是保密的 + - 给定一个消息x, 除了发送者本人以外, 任何其他人找到满足verK(x,y)为真的数字签名y,应该是计算上不可行的 + - 如果攻击者能够找到满足verK(x,y)的数据对(x,y),而发送者事先又没有对x签名,则称y是伪造(forgery)的数字签名。 +- 数字签名算法必须满足的条件 + - 签名者事后不能否认自己的签名; + - 其他人不能伪造签名; + - 当通信双方为签名真伪发生争执时, 可以由第三方解决争端 + + + +#### 6.1.1 数字签名的基本概念 + +**手写签名与数字签名的区别** + +- 手写签名是所签文件的物理组成部分,数字签名必须与所签文件捆绑在一起。 +- 手写签名通过与标准签名进行比较或检查笔迹来验证,数字签名是通过验证算法来验证。手写签名容易伪造,好的数字签名算法应该使伪造签名十分困难。 +- 手写签名不易复制。数字签名是一个二进制串,容易复制。所以必须防止数字签名重复使用。 + +**签名算法进行分类** + +- 按应用目的 + - 普通数字签名 + - 特殊目的数字签名: 不可否认数字签名、盲签名、群签名等 +- 按验证方法 + - 在验证时需要输入被签名信息 + - 在验证时自动恢复被签名信息 +- 按签名时是否使用随机数 + - 分成确定性数字签名 + - 随机数字签名 + +#### 6.1.2 数字签名的基本构造方法 + +利用Hash函数和加密算法可以构造有效的数字签名方案。 + +1. 基于Hash函数和对称密码算法构造数字签名方案 + +![](files/6-1-2-2.png) + +2. 基于Hash函数和公钥密码算法构造数字签名 + +![](files/6-1-2-3.png) + +具有保密作用的数字签名 +公钥密码体制:$S_K$是发送方的私钥,$P_K$是发送方的公钥, $E_1$和$D_1$分别是加密算法与解密算法。 +对称密码体制密钥:K是双方公用密钥,$E_2$和$D_2$分别是对应的加密算法和解密算法。 + +![](files/6-1-2-4.png) + + +#### 6.1.3 数字签名的安全需求 + +**数字签名的攻击模型** +- 唯密钥攻击(key-only attack) + 攻击者E拥有签名者A的公钥K,因而能够计算验证函数verK。 +- 已知消息攻击(known message attack) + 攻击者E拥有一系列以前由签名者A所签名的消息。即E具有数据对(xi,yi),其中xi是消息,yi=sigK (xi)是A对xi的签名(i=1, 2, …)。 +- 选择消息攻击(chosen message attack) + 攻击者E可以选择一些消息请求签名者A签名。即 + E选择消息$x_i$,并将$x_i$发送给签名者A,请求A对$x_i$签名。A计算$y_i=sig_K(x_i)$,并将$y_i$发给E。所以,E具有A的有效数字签名($x_i,y_i$)($i=1, 2, …$)。 + +**攻击者对数字签名系统的攻击目的** + +- 完全破译(total break) + 攻击者E能确定签名者A的私钥K,因而能够计算签名函数$sig_K$,可以对任何消息产生有效的签名。 +- 选择性伪造(selective forgery) + 攻击者E能以某一个不可忽略的概率对另外某个人选定的消息产生一个有效的签名。也就是说,如果给E选定一个消息x,那么他能以一个正的概率找到x的签名$y=sig_K(x)$,并且签名者A以前未对x签名。 +- 存在性伪造(existential forgery) + 攻击者E至少能够为一个消息产生一个有效的签名。也就是说,E可能生成一个数据对(x,y),其中x是消息,$y=sig_K(x)$。签名者A以前未对$x$签名。 + +**Hash函数与数字签名的安全性** + +- 对消息的散列值签名 + +![](files/6-1-3.png) + +- 使用已知消息攻击的存在性伪造 + 攻击者E从一个有效的签名(x, y)开始,其中$y=sig_k(h(x))$.然后他计算$z=h(x)$,并企图找到$x'\neq x$,使得$h(x')=h(x)$.如果E能做到这一点,则(x’, y)就是一个有效的签名, 从而y是消息x'的一个伪造签名.为了阻止这种攻击, 必须要求Hash函数h是弱无碰撞的. +- 使用选择消息攻击的存在性伪造 + 攻击者E首先找到$x'\neq x$, 使得$h(x')=h(x)$. 然后将消息x发给签名者A, 并让A对消息的散列值h(x)签名, 从而得到$y=sig_k(h(x))$. 所以E能够成功伪造签名$(x', y)$. 为了阻止这种攻击,必须要求Hash函数h是强无碰撞的. + +使用唯密钥攻击的存在性伪造 + 当签名算法遭到唯密钥攻击时, 即攻击者E拥有签名者A的公钥K.E就可能对一个随机的散列值z伪造签名$y=sig_k(z)$. 此时, 如果Hash函数h不是单向的,则E可能找到一个消息x,使得$z=h(x)$.所以E能够成功伪造一个签名(x, y).为了阻止这种攻击, 必须要求Hash函数h是单向的. + + +### 6.2 RSA数字签名体制 +利用RSA加密算法构造的数字签名称为RAS数字签名体制。 + + +#### 6.2.1 RSA数字签名算法描述 +1. 密钥生成算法 + - 选取两个大素数p,q,计算 + $n=p\times q,\varphi(n)=(p-1)\times (q-1)$ + - 任选整数e,满足: + $0< e <\varphi(n)$,且$gcd(e ,\varphi(n))=1$ + - 用扩展Euclidean算法求e模(n)的逆d,即 + $e\times d=1\space mod\space \varphi(n)$ + - 签名者的公钥: {$n,e$},私钥:{ $p,q,d$}。 + +2. 签名算法 + 设消息为x,则x的RAS签名是 + $y=x^d\space mod\space n$ +3. 验证算法 + 当接收方收到签名(x,y)后,计算 + $x'=y^e\space mod\space n$ + 如果$x= x'$,则y是x的RAS签名 + + +#### 6.2.2 RSA数字签名的安全性 +1. 一般攻击 + - 攻击方法: 设n与e为用户A的公钥,攻击者首先随意选择一个数据y,并用A的公钥计算 + $x=y^e\space mod\space n$ + 于是可以伪造A的一个RSA数字签名(x,y)。因为 + $x^d=(y^e)^d=y^{ed}=y\space mod \space n$ + 所以用户A对x的RSA数字签名是y。 + - 这种攻击实际上成功的概率是不高的 + 因为对于选择的数据y,得到的x=ye mod n具有正确语义的概率是很低的。 + - 抵抗措施 + - 仔细设计数据格式 + - 对数据的Hash值进行签名 + +2. 选择消息攻击 +- 攻击方法:假设攻击者E想伪造消息x的签名,他容易找到两个数据$x_1$和$x_2$,使得 +$x=x_1\times x_2 \space mod \space n$ +攻击者E设法让用户A分别对x1和x2 进行签名,得到 +$y_1=x_1^d\space mod\space n$,$y_2=x_2^d\space mod \space n$ +然后E可以计算 +$y=y_1\times y_2=x_1^d\times x_2^d=(x_1\times x_2)^d=x^d\space mod \space n$ +于是攻击者E得到了用户A对消息x的RSA数字签名y +- 抵抗措施 + - 用户不要轻易地对其他人提供的随机数据进行签名 + - 对数据的Hash值进行签名 + +3. 利用签名进行攻击从而获得明文 +- 攻击方法 + 假设攻击者E已截获了秘文$c=x^e \space mod\space n$,他想求出明文x。于是,他选择一个小的随机数r,并计算 + $s=r^e\space mod\space n$ + $l=s\times c\space mod\space n$ + $t=r^{-1}\space mod\space n$ +因为s=re,所以sd=( re)d= mod n,r=sd mod n.然后E 设法让签名者对l签名. 于是E又获得k=ld mod n. 攻击者E再计算: +$t\times k=r^{-1}\times l^d=r^{-1}\times s^d\times c^d=r^{-1}\times r\times c^d=x \space mod \space n$ + +于是,获得了密文x。 + +- 抵抗措施 + - 用户不要轻易地对其他人提供的随机数据进行签名 + - 对数据的Hash值进行签名 + +4. 对先加密后签名方案的攻击 +- 攻击方法 +假设签名者A采用先加密后签名的方案把消息x发送给接收者B ,则他先用B的公开密钥$e_B$对x加密, 然后用自己的私钥dA签名.设A的模数为nA,B的模数为nB.于是A发送给B的数据为: +$(x^{e_B}\space mod\space n_B)^{d_A}\space mod \space n_A$ +如果B是不诚实的,那么B可能伪造A的签名.例如,假设B想抵赖收到A发的消息x, 慌称收到的是x1.因为nB是B的模数,所以B知道nB的分解,于是能够计算模nB的离散对数.即他能找到k满足: +$(x_1)^k=x\space mod \space n_B$ +然后,B再公布他的新公开密钥为keB。现在B宣布他收到的消息是$x_1$,而不是$x$。 + +由于下式成立,所以A无法争辩。 +$(x_1^{ke_B}\space mod\space n_B)^{d_A}\space mod\space n_A=(x^{e_B}\space mod\space n_B)^{d_A}\space mod\space n_A$ + +- 抵抗措施 + - 签名者A应当在发送的数据中加入时间戳,从而可证明是用公开密钥eB对x加密,而不是用新公开密钥keB对x1加密。 + - 对数据的Hash值进行签名。 + +- 综上所述,对于RSA数字签名系统,必须采取如下安全措施: + - 不直接对消息进行签名,而应该对消息的Hash值进行签名。 + - 要采用先签名后加密的方式,而不要采用先加密后签名的方式。 + + +### 6.3 ElGamal数字签名体制 +- 在1985年,ElGamal T. 提出了一个基于离散对数问题的数字签名体制,通常称为ElGamal数字签名体制。 +- ElGamal签名体制的安全性主要是基于有限域上离散对数问题的难解性。 + + +#### 6.3.1 ElGamal签名算法描述 +1. 参数生成算法 + - 选取一个大素数$p,g\in Z_p^*$是一个本原元,p和g是系统公开参数。 + - 任选整数x,满足:1≤x≤p-2。计算 + $y=g^x\space mod\space p$ + 签名者的公钥为y,私钥为x。 + +2. 签名算法 + 设$M\in Z_p^{*}$为待签名的消息。签名者随机选择一个秘密整数k,1≤k≤p-2,计算 + $r=g^k\space mod\space p$ + $s=(M-x\times r)k^{-1}\space mod\space(p-1)$ + 签名者对M的ElGamal签名为: + $sig(M)=(r,s)\in Z_P^{*}\times Z_{p-1}^{*}$ + 签名者将数据(M,(r,s))发送给接收者 + +3. 验证算法 +接收方收到签名(M, (r,s)) 后,验证 +$y^r\times r^s=g^M\space mod\space p$ +是否成立,如果等号成立,则确认(r, s)是M的有效签名。 + - 有效性证明 + 因为:$s=(M-x\times r)k^{-1}\space mod\space (p-1)$ + 所以:$k\times s+x\times r=M\space mod\space (p-1)$ + 因此,如果(r,s)是M的正确签名,则一定有 + $y^r\times r^s=g^{xr}\times g^{ks}=g^{xr+ks}=g^M\space mod\space p$ + +ElGamal数字签名是一个随机的数字签名体制 +例如:设p=11,g=2是$Z_{11}^*$的本原元。选取私钥为x=8, +计算公钥 +$y=g^x\space mod \space p=2^8\space mod\space 11=3$ +设签名者A要对消息M=5进行签名。签名者A首先秘密选取一个整数k=9,计算 +$r=g^k\space mod\space p=2^9\space mod \space 11=6$ +$s=(M-x\times r)k^{-1}\space mod(p-1)=(5-8\times 6)\times 9^{-1}\space mod\space 10=3$ +签名者A对$M=5$的ElGamal签名为(6, 3)。 +接收者B可以对消息M=5的签名(6, 3)进行验证。 +因为:$3^6\times 6^3=2^5\space mod\space 11$ + + +#### 6.3.2 ElGamal数字签名的安全性 + +**ElGamal数字签名算法的实现** + +- 需要作一次模指数运算 +- 一次扩展Euclidean算法运算(求随机数k的逆元) +- 二次模乘运算 +- 前两个运算可以离线进行 +- 是一个随机的数字签名体制 + +**ElGamal数字签名体制的参数p** + +- $p$的选择与在Zp*中计算离散对数的算法有直接关系。从目前的计算水平来看,p至少应该是二进制512位的素数,从长期安全性考虑,应使用1024位或更长的素数。 +- $p-1$最好有大的素因子 +- 私钥$x$最好是$Z_p^*$的素数阶子群的生成元。 + +**不知道私钥的攻击** + +假设攻击者E不知道私钥$x$,要想伪造消息M的签名(r,s), 则E可能使用的攻击方式有: +- 攻击者已知消息M,选择一个值r,再求另一个值s.此时,因为有: + $y^r\times r^s=g^M\space mod\space p$ + $s=log_r^{g^M\times y^{-r}}\space mod\space p$ + 所以攻击者E必须计算离散对数。 +- 攻击者已知消息M,选择一个值s,再求另一个值r. 此时, 他必须从同余方程 + $y^r\times r^s=g^M\space mod\space p$ + 中求出r。这是一个到目前为止还没有可行方法求解的方程,甚至也看不出它与离散对数问题有没有关系。 + +- 攻击者已知消息M,同时求(r,s). 即他必须从同余方程 +$y^r\times r^s=g^M \space mod\space p$ +中同时求出(r,s)。现在人们对这个方程的认识几乎是一无所有,既没有人发现解这个问题的方法,也没有人能够证明不能解这个问题。 +- 攻击者选择数据对(r,s),求消息M。此时必须计算离散对数 +$M=log_g^{y^r\times r^s}\space mod\space p$ + +- 攻击者同时选择数据M,r和s,使得(r, s)是M的签名。这种攻击方法可能获得成功。攻击者首先选择整数i和j,$0\leq i,j\leq p-2,gcd(j,p-1)=1$,计算 + + $r=g^i\times y^j\space mod\space p $ + $s=-r\times j^{-1}\space mod\space (p-1)$ + $M=-r\times i\times j^{-1}\space mod \space(p-1)$ + +由于: +$ +\begin{aligned} +y^r\times r^s&=y^r\times(g^i\times y^j)^{-rj^{-1}} \\ &=y^r\times g^{-irj^{-1}}\times y^{-r} \\ &=g^{-irj^{-1}} \\&=g^{M}\space mod\space p + \end{aligned} +$ + 成立,所以(r, s) 是消息M的有效签名 + 该攻击方法属于存在性伪造。因此,在使用ElGamal数字签名方案时,不要直接对消息进行签名,而应该对消息的Hash值进行签名。 + +#### 例6.3 + +设p=467,g=2是$Z_{467}^*$的本原元,签名者公钥y=132。攻击者选择整数i=99,j=1.79,计算 +$j^{-1}=179^{-1}\space mod \space 466=151$ +$r=2^{99}\times 132^{179}\space mod\space 467=117$ +$s=-117\times 151\space mod \space 466=41$ +$M=-117\times 99\times 151\space mod\space 466=331$ + +由于: +$y^r\times r^s=132^{117}\times 117^{41}=303\space mod\space 467$ +$g^{M}=2^{331}=303\space mod\space 467$ +所以(117,41)是消息M=331的有效签名 + +假设攻击者E知道(r, s)是消息M的签名,则E可利用它来伪造其它消息的签名. 选择整数$l,i,j,0\leq l,i,j\leq p-2,gcd(lr-js,p-1)=1$,计算 +$u=r^l\times g^i\times y^j\space mod\space p$ +$v=s\times u\times (l\times r-j\times s)^{-1}\space mod\space (p-1)$ +$W=u\times (l\times M+i\times s)\times (l\times r-j\times s)^{-1}\space mod\space (p-1)$ + +由于$y^r\times r^s=g^M\space mod\space p $,所以 + +$ +\begin{aligned} +r^s&=y^{-r}\times g^M\space mod\space p \\ + &=y^u\times (r^l\times g^i\times y^j)^{su(lr-js)^{-1}} \\ + &=y^{u+jsu(lr-js)^{-1}}\times r^{hsu(lr-js)^{-1}\times g^{isu(lr-js)^{-1}}} \\ + &=y^{u+jsu(lr-js)^{-1}-rlu(lr-js)^{-1}}\times g^{isu(lr-js)^{-1}+Mu(lr-js)^{-1}} \\ + &=y^{u(l-(lr-js)(lr-js)^{-1})}\times g^{(is+lM)u(lr-js)^{-1}} \\ + &=g^w\space mod \space p +\end{aligned} +$ + +可见$(u, v)$是消息$W$的有效签名。 +- 该攻击方法属于存在性伪造 +- 使用对消息的Hash值进行签名的方式,可以抵抗这类攻击。 + + +**使用ElGamal数字签名方案的安全措施** + +- 不要泄露随机数k + 否则,根据: + $s=(M-x\times r)k^{-1}\space mod \space (p-1)$ + 可计算出私钥: + $x=(M-s\times k)\times r^{-1}\space mod \space (p-1)$ +- 不要使用同一个随机数k给两个不同的消息签名设(r,s)是消息M的签名,(u,v)是消息W的签名,使用的是同一个随机数k,则可求出私钥。 + + +#### 6.3.3 ElGamal签名体制的变形 + +**ElGamal数字签名算法有多种变形** + +- 设大素数p是模数,g是一个模p的本原元,x为签名者的私钥,k为随机数,m为待签名的消息,(r,s)是对M的签名。签名值的分量$r=g^k\space mod \space p$, 分量s由签名算法确定。ElGamal数字签名各种变形的签名算法和验证算法见下表。 + +![](files/6-3-3.png) + +### 6.4 其它数字签名方案 +- Fiat-Shamir数字签名 +- 一次性数字签名 +- 不可否认数字签名 +- 盲签名 + +#### 6.4.1 Fiat-Shamir数字签名 +- Fiat-Shamir数字签名由A. Fiat和 A. Shamir提出,有时简记为FS数字签名。与RSA数字签名相比较,FS数字签名的主要优势是速度快,它仅需要RSA的1%~4%的模乘法。FS数字签名的理论基础是大整数素因子分解的困难性。 +- 参数生成: 选取两个大素数p、q,令$n=p\times q$。n是公开参数,p和q是管理中心CA掌握的密钥。设h是一个公开的Hash函数,k是一个固定的正整数。 + - 管理中心CA为用户A产生k个公开密钥:$y_i (i =1,2,…,k)$ 是模n的平方剩余 + - 再为用户A产生k个私钥(保密): + $x_1=\sqrt{\smash[b]{y_1^{-1}}}\space mod\space n$,$x_2=\sqrt{\smash[b]{y_2^{-1}}}\space mod\space n$,$...$,$x_k=\sqrt{\smash[b]{y_k^{-1}}}\space mod\space n$ + +**签名算法:** + +为了对消息m进行签名,用户A执行以下步骤: +1. 随机选取一个正整数t。 +2. 在1和n之间随机选取t个正整数rj (j =1,2,…,t),并计算 +$R_j=r_j^2\space mod\space n\space (j=1,2,...,t)$ +3. 计算Hash函数值h (m|| R1|| R2||…|| Rt),依次取出其前$k\times t$个比特值,记为 +$b_{ij}(i=1,2,...,k;j=1,2,...,t)$ +4. 计算:$s_j=r_j\prod_{i=1}^{k} x_{i}^{b_{ij}}\space mod\space n\space (j=1,2,...,t) $ + 用户A对消息m的数字签名为: + $\{b_{ij}\},\{s_j\}(i=1,2,...,k;j=1,2,...,t)$ + 签名者将数据$(m,\{b_{ij}\},\{s_j\})$发送给接收者B + +**验证算法:** + +接收方B收到签名数据$(m,\{b_{ij}\},\{s_j\})$后, 按以下步骤进行验证: +1. 利用A的公钥计算:$R_j^{'}=s_j^2\prod^{k}_{i=1}y_i^{b_{ij}}\space mod\space n\space (j=1,2,...,t)$ +2. 计算Hash函数值:$h(m||R_1^{'}||R_2^{'}||...||R_t^{'})$,依次取出其前$k\times t$个比特值,记为:$b_{ij}^{'}(i=1,2,...,k;j=1,2,...,t)$ +3. 比较等式:$b_{ij}=b_{ij}^{'}(i=1,2,...,k;j=1,2,,...,t)$ + 是否成立。如果$k\times t$个等式全部成立,则数字签名有效。否则,数字签名无效。 + +**该验证算法的正确性** + +当数据传输正确时,有 +![](files/6-4-1.png) +得到:$h(m||R_1^||R_2||...||R_k)=h(m||R_1^{'}||R_2^{'}||...||R_k^{'})$ +并且:$b_{ij}=b_{ij}^{'}(i=1,2,...,k;j=1,2,,...,t)$ + + + +#### 例6.4 +设n=35,k=4,用户A的4个公钥为:$y_1 =4$,$y_2 =11$,$y_3 =16$,$y_4 =29$。则A的4个私钥为: +![](files/6-4-1-2.png) +取$t=1$,$r_1=16$,计算:$R_1=r_1^{2}=16^2=11\space mod\space 35$ +为了简化,设$h(m||R_1)=R_1=11=1011$。即有: +$b_{11}=1,b_{21}=0,b_{31}=1,b_{41}=1$ +$s_1=r_1\prod_{i=1}^{4}x_i^{b_{ij}}\space mod\space n=16\times 3^1\times 9^0\times 9^1\times 8^1=26\space mod\space 35$ +数字签名为({1,0,1,1}, {26}) + +设n=35,k=4,用户A的4个公钥为:$y_1 =4$,$y_2 =11$,$y_3 =16$,$y_4 =29$。数字签名为({1,0,1,1}, {26})。 +接收方验证方法如下。由于:$R_1^{'}=s_1^2\prod_{i=1}^{4}y_i^{b_{ij}}=26^2\times 4^1\times 11^0\times 16^1\times 29^1\space mod\space 35=11=R_1\space mod\space 35$ +所以数字签名有效。 + + +#### 6.4.2 一次性数字签名 +- 一次性签名方案是指一对公、私钥只能用于对一个消息进行签名的方案,它通常被用于芯片卡(chipcards)。 +- 1978年,M.O. Rabin首次提出一次性签名方案。在Rabin一次性签名方案中,签名算法使用了对称加密算法,验证过程需要验证者与签名者共同参与。 +- 1979年,L. Lamport提出一个类似的方案,不同之处在于验证时不需要验证者与签名者交互。该方案由于受到著名密码学家Diffie和Hellman的重视而有名。 +- 1992年,Bos与Chaum对Lamport的另一个更有效的一次性签名方案做了本质的改进,并证明了改进的签名方案在选择消息攻击下是不可伪造的。 + + +### 6.4.3 Lamport一次性数字签名 + +**密钥生成:** + +已知单向函数$f:Y→Z$ +- 在Y中随机选取 +$y_{1,0},y_{1,1},y_{2,0},y_{2,1},...,y_{k,0},y_{k,1}$为私钥。 +- 计算:$z_{i,j}=f(y_{i,j})\space (1\leq i\leq k,j=0,1)$ +单向函数$f$及$z_{1,0},z_{1,1},z_{2,0},z_{2,1},...,z_{k,0},z_{k,1}$为公钥 + +**签名算法** +设消息$x=(x_k x_{k-1}...x_2 x_1)$是二进制串,则对消息x的签名为:{$u_i=y_{i,j}|1\leq i\leq k,x_i=j$} +**验证算法** +若${f(u_i)|1\leq i\leq k}$包含在公钥中,则签名是合法的。 + + +### 6.4.4 Bos-Chaum 一次性数字签名 +Bos-Chaum一次性签名方案的签名比Lamport方案的签名短。设A={1,2,…,2n}是2n元集合,B是A的所有n元子集构成的集合,则有$|B|=C_{2n}^n$。定义Bos-Chaum签名方案使用的单射函数为:$\varphi:\{0,1\}^k→B$ +它把长为k的字符串映射到A的n元子集,这里$2^k\leq C_{2n}^n$ + +### 6.4.4 Bos-Chaum 一次性数字签名 +1. 密钥生成 + 设 f:Y→Z是单向函数,取$y1,y2,...,y2n\in Y$作为私钥,$z_1,z_2,...,z_2n\in Z$作为公钥,其中$f(y_i)=z_i(1\leq i\leq 2n)$。 +2. 签名算法 + 设消息$x=(x_kx_{k-1}...x_2x_1)_2$是二进制串,则对消息x的签名为: + {$a_1,a_2,...,a_n$}$=$$\{y_j|j\in \varphi (x)\}$。 +3. 验证算法 + 计算集合$C={f(a_i),1\leq i\leq n}$和$\varphi (x)$。如果$C=\{z_j|j\in \varphi (x)\}$,则{$a_1,a_2,...,a_n$}是对$x$的合法签名。 + + +### 6.4.4 Bos-Chaum 一次性数字签名 +由于f是单向函数,对手不可能伪造消息的Bos-Chaum签名。 +如果使用Bos-Chaum方案签了两个消息,则对手容易伪造Bos-Chaum签名。 +例如,令n=4,容易计算出$\varphi (110010)=\{2,4,6,8\},\varphi (010011)=\{2,3,4,7\}$。已知对110010的Bos-Chaum签名为$\{y_2,y_4,y_6,y_8\}$,对010011的Bos-Chaum签名为$\{y_2,y_3,y_4,y_7\}$,容易得到对111100的Bos-Chaum签名为$\{y_2,y_4,y_7,y_8\}$。所以该签名方案是一次性签名方案。 + + +#### 6.4.5 不可否认数字签名 +对于以前讨论的数字签名,任何人都可以对签名进行验证。但在某些特殊应用条件下,需要在签名者参加的情况下才能进行验证。具有这种性质的数字签名称为不可否认签名方案(undeniable signature scheme)。它们可以应用在如下场合: +- 实体A 希望访问实体B控制的“安全区域”。实体B在授予实体A访问权之前,要求A对“访问时间、日期”进行签名。另一方面,实体A不希望别人了解这个事实,即没有实体A的参与,实体B不能通过出示实体A的签名及验证,来证明“实体A访问该区域”这一事实。 +- 某公司A开发的一个软件包。A将软件包和他对软件包的不可否认签名卖给用户B。B当场验证A的签名,以便确认软件包的真实性。用户B想把该软件包的拷贝私自卖给第三者。由于没有公司A参与,第三者不能验证软件包的真实性。从而保护了公司A的利益 + +Chaum和van Antwerpen在1989年提出的不可否认数字签名方案 + +**密钥生成** + +随机选择素数$q,p=2q+1$。在$Z_p^{*}$中取q阶元$a(\neq1)$。从Euler准则知$a$是模$p$的二次剩余组成的。 +选择秘密指数$1\leq x\leq p-1$,计算$y=a ^x\space mod \space p$。 +公布公钥$(p,a,y)$,秘密保存私钥$x$。 + +**签名算法** + +对消息m的签名是: $s=m^x\space mod\space p$。 + +**验证协议** + +![](files/6-4-5.png) + +假设签名者A想否认一个“由签名生成算法构造出来的”合法签名,其方式有: +1. 拒绝参与验证协议; +2. 错误地执行验证协议; +3. 即使验证协议成功,也断言签名是伪造的。 + +对于前者很明显,而后两种情况难以防范。使用“否认协议”(disavowal protocol)能够确定是签名者A试图否认一个由签名算法得出的签名,还是签名本身是伪造的。否认协议由两遍验证协议组成。 + +**否认协议** + +![](files/6-4-5-2.png) + +否则计算:$C=(wa^{-x_2})^{x_1'}\space mod\space p,C'=(w'a^{-x'_2})^{x_1}\space mod\space p$ + +进行一致性检验,若$C=C'$,则s是对m的伪造签名;若$C\neq C'$,则s是对m的合法签名,签名者试图否认。 + +**否认协议的性质** + +- 性质1:如果验证者和签名者都正确执行协议,则必有$C=C'$,说明s是对m的伪造签名,即 +$s\neq m^x\space mod\space p$ +- 性质2:如果$\widetilde{s}\neq m^x\space mod\space p$,则验证者把$\widetilde{s}$看作对m的合法签名的概率为$1/q$。 +- 性质3:如果s是对m的合法签名,由于签名者采取不合作的态度,致使$w\equiv m^{x'_1}a^{x'_2}mod p$和$w\equiv m^{x_1}a^{x_2}\space mod\space p$ +否认协议中最后$C\neq C'$的概率为$1-(\frac{1}{q})$。 + + +#### 6.4.6 盲签名 +- 对于前面介绍的数字签名,签名者知道所签名的消息。但在数字现金、电子投票等应用领域,要求签名者不能知道所签名的消息。 +- 签名者对所签署消息和对消息的签名都不可见的数字签名称为盲签名(blind signature) +- 盲签名由D. Chaum在1982年首次提出 + +**盲签名过程** + +![](files/6-4-6.png) +- A是消息m的拥有者, 称为求签名者 +- B称为签名者 +- 盲签名需要两个基本构件: + - 求签名者A知道的盲化函数f 及脱盲函数g。f与g必须满足: + $g(S_B(f(m)))=S_B(m)$ + - 签名者B的数字签名方案SB。 + +- 考虑盲签名在电子货币中的应用,例如顾客A得到银行B对钱款m的盲签名后,自己算出银行的真正签名SB(m)。在支付时提交出m和SB(m),银行能验证SB(m)是否为m的合法签名,但不知道这是谁的一笔消费。从而使A保持匿名状态,即消费行为不受到监控。 + + +#### 6.4.7 基于RSA公钥密码系统的Chaum盲签名 + +Chaum提出的盲签名方案是基于RSA公钥密码系统 + +**密钥生成** + +- 选取素数p、q,令$nB=p\times q,1 + +用IE浏览器打开百度,点击地址栏旁边的小锁,再点击查看证书,就可以看到百度主页的数字签名证书了。所谓证书,其实是对公钥的封装,在公钥的基础上添加了诸如颁发者之类的信息。 + + + + + +#### 6.6.2 代码签名 +如果Windows上的可执行程序程序来源于正规公司,那么通常它会有代码签名,用于确保其来源可靠且未被篡改。以QQ为例,它的数字签名是这样的。 +![](files/6-6-2.png) + +如果某个程序没有数字签名,那么它的安全性往往就没有保证,如果它有数字签名,但是显示“此数字前面无效”,那么这个程序要么被篡改了要么损坏了,不管哪种可能都不应该尝试执行它。 + +#### 6.6.3 比特币 +比特币是一种完全匿名的数字货币,它的身份认证是基于ECDSA。比特币的账户地址就是对公钥计算摘要得到的,向全世界公布。而确认你是账户拥有者的唯一办法就是看你有没有账户对应的私钥。对于比特币中的任意一个交易记录,只有当其中付款方的签名是有效的,它才是有效的。如果账户私钥丢失,那么你将永远地失去里面的钱;一旦被黑客盗取,里面的钱就完全归黑客所有。 + +#### 6.6.4 电子邮件 +- 对于电子邮件的安全性,主要有两个要求:其一是确保只有收信人才能阅读信件内容;其二收信人能够判断信件确由发信人发送,而未被别人伪造、或篡改。 +- 目前应用最多的安全电子邮件系统是PGP(pretty good privacy)。PGP是一种基于Internet的保密电子邮件软件系统,能提供邮件加密、数字签名、认证、数据压缩和密钥管理功能,它是由美国Phi Zimmermann开发的。由于PGP系统功能强大,使用方便,所以在Windows、Unix和Mashintosh平台上得到广泛应用。 +- PGP采用ZIP压缩算法对邮件数据进行压缩,采用IDEA对压缩后的数据进行加密,采用MD5对邮件数据进行散列处理,采用RSA对邮件数据的散列值进行数字签名,采用支持公钥证书的密钥管理,采用先签名后加密的数字签名方案 + +- PGP巧妙地将公钥密码RSA和单钥密码IDEA结合在一起,兼顾了安全性和效率。支持公钥证书的密钥管理使PGP系统更安全方便。PGP具有很好的灵活性,可支持IDEA、3DES等单钥密码体制,MD5、SHA等Hash函数,Diffe-Hellman等密钥协议。这些显著的技术特色使得PGP成为Internet环境最著名的保密电子邮件软件系统。 +- PGP采用1024位的RSA、128位的IDEA密钥、128位的MD5、Diffe-Hellman密钥协议、公钥证书,因此PGP是安全的。如果采用160位的SHA,将进一步提高PGP的安全性。 diff --git a/doc/CRYPT-7_密码协议.md b/doc/CRYPT-7_密码协议.md new file mode 100644 index 0000000..83493ad --- /dev/null +++ b/doc/CRYPT-7_密码协议.md @@ -0,0 +1,375 @@ +# CRYPT-7 密码协议 + +**author : Odyssey@cyberpeace** + +## 目录 +7.1 认证的定义 +7.2 密码协议 +7.3 身份证明 +7.4 零知识证明 + +### 7.1 认证的定义 + +CRYPT-5 介绍过消息认证的基本概念,事实上安全可靠的通信除需进行消息的认证外,还需建立一些规范的协议对数据来源的可靠性、通信实体的真实性加以认证,以防止欺骗、伪装等攻击。本节以网络通信的一个基本问题的解决引出认证协议的基本意义,这一基本问题陈述如下: A和B是网络的两个用户,他们想通过网络先建立安全的共享密钥再进行保密通信。那么A(B)如何确信自己正在和B(A)通信而不是和C通信呢?这种通信方式为双向通信,因此,此时的认证称为相互认证。类似地,对于单向通信来说,认证称为单向认证。 + + +### 7.1 认证的定义 +认证可以是单向的也可以是双向的。 +- 单向认证是指通信双方中只有一方向另一方进行认证 +- 双向认证是指通信双方相互进行认证。 + + + +### 7.2 密码协议 +- 相互认证 + - 采用对称密码算法的机制 + - 采用公开密钥算法的机制 +- 单向认证 + - 采用对称密码算法的机制 + - 采用公开密钥算法的机制 + + +#### 7.2.1 相互认证 +A、B两个用户在建立共享密钥时需要考虑的核心问题是保密性和实时性。为了防止会话密钥的伪造或泄露,会话密钥在通信双方之间交换时应为密文形式,所以通信双方事先就应有密钥或公开钥。第2个问题实时性则对防止消息的重放攻击极为重要,实现实时性的一种方法是对交换的每一条消息都加上一个序列号,一个新消息仅当它有正确的序列号时才被接收。但这种方法的困难性是要求每个用户分别记录与其他每一用户交换的消息的序列号,从而增加了用户的负担,所以序列号方法一般不用于认证和密钥交换。 + + +#### 7.2.1 相互认证 +保证消息的实时性常用以下三种方法: +- 时戳 +如果A收到的消息包括一时戳,且在A看来这一时戳充分接近自己的当前时刻, A才认为收到的消息是新的并接受之。这种方案要求所有各方的时钟是同步的。 +- 询问-应答 +用户A向B发出一个一次性随机数作为询问,如果收到B发来的消息(应答)也包含一正确的一次性随机数,A就认为B发来的消息是新的并接受之。 +- 序列号 +对交换的每一条消息加上序列号,序列号正确才被接收 + +其中时戳法不能用于面向连接的应用过程,这是由于时戳法在实现时固有的困难性。首先是需要在不同的处理器时钟之间保持同步,那么所用的协议必须是容错的以处理网络错误,并且是安全的以对付恶意攻击。第二,如果协议中任一方的时钟出现错误而暂时地失去了同步,则将使敌手攻击成功的可能性增加。最后还由于网络本身存在着延迟,因此不能期望协议的各方能保持精确的同步。所以任何基于时戳的处理过程、协议等都必须允许同步有一个误差范围。考虑到网络本身的延迟,误差范围应足够大;考虑到可能存在的攻击,误差范围又应足够小。 + + +而询问-应答方式则不适合于无连接的应用过程,这是因为在无连接传输以前需经询问\应答这一额外的握手过程,这与无连接应用过程的本质特性不符。对无连接的应用程序来说,利用某种安全的时间服务器保持各方时钟同步是防止重放攻击最好的方法。 +通信双方建立共享密钥时可采用单钥加密体制和公钥加密体制。 + + +序列号方法要求每个用户分别记录与其他每一用户交互的序列号,增加用户负担,因而很少使用 + + +**采用对称密码算法的机制** + +采用单钥加密体制为通信双方建立共享的密钥时,需要有一个可信的密钥分配中心KDC,网络中每一用户都与KDC有一共享的密钥,称为主密钥。KDC为通信双方建立一个短期内使用的密钥,称为会话密钥,并用主密钥加密会话密钥后分配给两个用户。这种分配密钥的方式在实际应用中较为普遍采用,如接下来介绍的Kerberos系统采用的就是这种方式。 + + +#### 7.2.1 相互认证 + +**Needham-Schroeder协议** + +![](files/2018-04-08-12-05-44.png) + +- $A→KDC:ID_A ||ID_B||N_1$ +- $KDC→A:E_{KA}[K_S||ID_B||N_1||E_{KB}[K_S||ID_A]]$ +- $A→B:E_{KB}[KS||IDA]$ ----------弱点 +- $B→A:E_{KS}[N_2]$ +- $→B:E_{KS}[f(N_2)]$ + +式中$K_A$、$K_B$分别是A、B与KDC共享的主密钥。协议的目的是由KDC为A、B安全地分配会话密钥$K_S$,A在第②步安全地获得了KS,而第③步的消息仅能被B解读,因此B在第③步安全地获得了$K_S$ ,第④步中B向A示意自己已掌握$K_S$,N2用于向A询问自己在第③步收到的$K_S$是否为一新会话密钥,第⑤步A对B的询问作出应答,一方面表示自己已掌握$ +K_S$,另一方面由$f(N_2)$回答了$K_S$的新鲜性。可见第④、⑤两步用于防止一种类型的重放攻击,比如敌手在前一次执行协议时截获第③步的消息,然后在这次执行协议时重放,如果双方没有第④、⑤两步的握手过程的话,B就无法检查出自己得到的$K_S$是重放的旧密钥。 + +然而以上协议却易遭受另一种重放攻击,假定敌手能获取旧会话密钥,则冒充A向B重放第③步的消息后,就可欺骗B使用旧会话密钥。敌手进一步截获第④步B发出的询问后,可假冒A作出第⑤步的应答。进而,敌手就可冒充A使用经认证过的会话密钥向B发送假消息。 + +**协议改进方案一** +为克服以上弱点,可在第②步和第③步加上一时戳,改进后的协议如下: +- $A→KDC:ID_A||ID_B$ +- $KDC→A:E_{KA}[K_S||ID_B||T||E_{KB}[K_S||ID_A||T]]$ +- $A→B:E_{KB}[K_S||ID_A||T]$ +- $B→A:E_{KS}[N_1]$ +- $A→B:E_{KS}[f(N_1)]$ + +- 其中T是时戳,用以向A、B双方保证KS的新鲜性。A和B可通过下式检查T的实时性: +$|Clock-T|<Δt_1+Δt_2$ +- 其中Clock为用户(A或B)本地的时钟,$Δt_1$是用户本地时钟和KDC时钟误差的估计值,$Δt_2$是网络的延迟时间。 +- 以上协议中由于T是经主密钥加密的,所以敌手即使知道旧会话密钥,并在协议的过去执行期间截获第③步的结果,也无法成功地重放给B,因B对收到的消息可通过时戳检查其是否为新的。 + +以上改进还存在以下问题: 方案主要依赖网络中各方时钟的同步,这种同步可能会由于系统故障或计时误差而被破坏。如果发送方的时钟超前于接收方的时钟,敌手就可截获发送方发出的消息,等待消息中时戳接近于接收方的时钟时,再重发这个消息。这种攻击称为等待重放攻击。 + +抗击等待重放攻击的一种方法是要求网络中各方以KDC的时钟为基准定期检查并调整自己的时钟,另一种方法是使用一次性随机数的握手协议,因为接收方向发送方发出询问的随机数是他人无法事先预测的,所以敌手即使实施等待重放攻击,也可被下面的握手协议检查出来。 + +**协议改进方案二** +下面的协议可解决Needham-Schroeder协议以及改进方案一可能遭受的攻击: +① $A→B:ID_A||N_A$ +② $B→KDC:ID_B||N_B||E_{KB}[ID_A||N_A||T_B]$ +③ $KDC→A:E_{KA}[ID_B||N_A||K_S||T_B]||E_{KB}[ID_A||K_S||T_B]||N_B$ +④ $A→B:E_{KB}[ID_A||K_S||T_B]||E_{KS}[N_B]$ + +协议的具体含义如下: +① A将新产生的一次性随机数$N_A$与自己的身份$I_{DA}$一起以明文形式发往B,$N_A$以后将与会话密钥$K_S$一起以加密形式返回给A,以保证A收到的会话密钥的新鲜性。 + +② B向KDC发出与A建立会话密钥的请求,表示请求的消息包括B的身份、一次性随机数$N_B$以及由B与KDC共享的主密钥加密的数据项。其中$N_B$以后将与会话密钥一起以加密形式返回给B以向B保证会话密钥的新鲜性,请求中由主密钥加密的数据项用于指示KDC向A发出一个证书,其中的数据项有证书接收者A的身份、B建议的证书截止时间TB、B从A收到的一次性随机数。 + +③ KDC将B产生的$N_B$连同由KDC与B共享的密钥KB加密的$ID_A||K_S||T_B$一起发给A,其中$K_S$是KDC分配的会话密钥,$E_{KB}[ID_A||K_S||T_B]$由A当作票据用于以后的认证。KDC向A发出的消息还包括由KDC与A共享的主密钥加密的$ID_B||N_A||K_S||T_B$,A用这一消息可验证B已收到第①步发出的消息(通过$ID_B$),A还能验证这一步收到的消息是新的(通过$N_A$),这一消息中还包括KDC分配的会话密钥$K_S$以及会话密钥的截止时间$T_B$。 + +④ A将票据$E_{KB}[ID_A||K_S||T_B]$连同由会话密钥加密的一次性随机数$N_B$发往B,B由票据得到会话密钥$K_S$,并由$K_S$得$N_B$。$N_B$由会话密钥加密的目的是B认证了自己收到的消息不是一个重放,而的确是来自于A。 + +以上协议为A、B双方建立共享的会话密钥提供了一个安全有效的手段。再者,如果A保留由协议得到的票据,就可在有效时间范围内不再求助于认证服务器而由以下方式实现双方的新认证: +① $A→B:E_{KB}[ID_A||K_S||T_B],N'A$ +② $B→A:N'_B,E_{KS}[N'_A]$ +③ $A→B:E_{KS}[N'_B]$ + +B在第①步收到票据后,可通过$T_B$检验票据是否过时,而新产生的一次性随机数$N'_A$、$N'_B$则向双方保证了没有重放攻击。 +以上协议中时间期限$T_B$是B根据自己的时钟定的,因此不要求各方之间的同步。 + +**采用公开密钥算法的机制** + +前面的课程曾介绍过使用公钥加密体制分配会话密钥的方法,下面的协议也用于这个目的。 +① $A→AS:ID_A||ID_B$ +② $AS→A:E_{SK^{AS}}[ID_A||PK_A||T]||E_{SK^{AS}}[ID_B||PK_B||T]$ +③ $A→B:E_{SK^{AS}}[ID_A||PK_A||T]||E_{SK^{AS}}[ID_B||PK_B||T||E_{PK^B}[E_{SK^A}[K_S||T]]$ + +其中$SK_{AS}$、$SK_A$分别是AS和A的秘密钥,$PK_A$、$PK_B$分别是A和B的公开钥,E为公钥加密算法,AS是认证服务器(authentication server)。第①步,A将自己的身份及欲通信的对方的身份发送给AS。第②步,AS发给A的两个链接的数据项都是由自己的秘密钥加密(即由AS签字),分别作为发放给通信双方的公钥证书。第③步,A选取会话密钥并经自己的秘密钥和B的公开钥加密后连同两个公钥证书一起发往B。因会话密钥是由A选取,并以密文形式发送给B,因此包括AS在内的任何第3者都无法得到会话密钥。时戳T用以防止重放攻击,所以需要各方的时钟是同步的。 + +下一协议使用一次性随机数,因此不需要时钟的同步: +① $A→KDC:ID_A||ID_B$ +② $KDC→A:E_{SK_{AU}}[ID_B||PK_B]$ +③ $A→B:E_{PK^B}[N_A||ID_A]$ +④ $B→KDC:ID_B||ID_A||E_{PK^{AU}}[N_A]$ +⑤ $KDC→B:E_{SK^{AU}}[ID_A||PK_A]||E_{PK^B}[E_{SK^{AU}}[N_A||K_S||ID_B]]$ +⑥ $B→A:E_{PK^A}[E_{SK^{AU}}[N_A||K_S||ID_B]||N_B]$ +⑦ $A→B:E_{K^S}[N_B]$ + +其中$SK_{AU}$和$PK_{AU}$分别是KDC的秘密钥和公开钥。第①步,A通知KDC他想和B建立安全连接。第②步,KDC将B的公钥证书发给A,公钥证书包括经KDC签字的B的身份和公钥。第③步,A告诉B想与他通信,并将自己选择的一次性随机数$N_A$发给B。第④步,B向KDC发出得到A的公钥证书和会话密钥的请求,请求中由KDC的公开钥加密的$N_A$用于让KDC将建立的会话密钥与$N_A$联系起来,以保证会话密钥的新鲜性。 + +第⑤步,KDC向B发出A的公钥证书以及由自己的秘密钥和B的公开钥加密的三元组$\{N_A,K_S,ID_B\}$。三元组由KDC的秘密钥加密可使B验证三元组的确是由KDC发来的,由B的公开钥加密是防止他人得到三元组后假冒B建立与A的连接。第⑥步,B新产生一个一次性随机数$N_B$,连同上一步收到的由KDC的秘密钥加密的三元组一起经A的公开钥加密后发往A。第⑦步,A取出会话密钥,再由会话密钥加密$N_B$后发往B,以使B知道A已掌握会话密钥。 + +以上协议可进一步做如下改进: 在第⑤、⑥两步出现$N_A$的地方加上$ID_A$,以说明$N_A$的确是由A产生的而不是其他人产生的,这时$\{ID_A,N_A\}$就可惟一地识别A发出的连接请求。 + + +#### 7.2.2 单向认证 +电子邮件等网络应用有一个最大的优点就是不要求收发双方同时在线,发送方将邮件发往接收方的信箱,邮件在信箱中存着,直到接收方阅读时才打开。邮件消息的报头必须是明文形式以使SMTP(simple mail transfer protocol-简单邮件传输协议)或X.400等存储-转发协议能够处理。然而通常都不希望邮件处理协议要求邮件的消息本身是明文形式,否则就要求用户对邮件处理机制的信任。 + +所以用户在进行保密通信时,需对邮件消息进行加密以使包括邮件处理系统在内的任何第3者都不能读取邮件的内容。再者邮件接收者还希望对邮件的来源即发方的身份进行认证,以防他人的假冒。与双向认证一样,在此仍分为单钥加密和公钥加密两种情况来考虑。 + +**采用对称密码算法的机制** + +对诸如电子邮件等单向通信来说,图5.2所示的无中心的密钥分配情况不适用。因为该方案要求发送方给接收方发送一请求,并等到接收方发回一个包含会话密钥的应答后,才向接收方发送消息,所以本方案与接收方和发送方不必同时在线的要求不符。在图5.1所示的情况中去掉第④步和第⑤步就可满足单向通信的两个要求。协议如下: +① $A→KDC:ID_A||ID_B||N_1$ +② $KDC→A:E_{K^A}[K_S||ID_B||N_1||E_{K^B}[K_S||ID_A]]$ +③ $A→B:E_{K^B}[K_S||ID_A]||E_{K^S}[M]$ + +本协议不要求B同时在线,但保证了只有B能解读消息,同时还提供了对消息的发方A的认证。然而本协议不能防止重放攻击,为此需在消息中加上时戳,但由于电子邮件处理中的延迟,时戳的作用极为有限。 + +**采用公开密钥算法的机制** +公钥加密算法可对发送的消息提供保密性、认证性或既提供保密性又提供认证性,为此要求发送方知道接收方的公开钥(保密性),或要求接收方知道发送方的公开钥(认证性),或要求每一方都知道另一方的公开钥。 + +如果主要关心保密性,则可使用以下方式: +$A→B:E_{PK^B}[K_S]||E_{K^S}[M]$ +其中A用B的公开钥加密一次性会话密钥,用一次性会话密钥加密消息。只有B能够使用相应的秘密钥得到一次性会话密钥,再用一次性会话密钥得到消息。这种方案比简单地用B的公开钥加密整个消息要有效得多。 + +如果主要关心认证性,则可使用以下方式: +$A→B:M||E_{SK^A}[H(M)]$ +这种方式可实现对A的认证,但不提供对M的保密性。如果既要提供保密性又要提供认证性,可使用以下方式: +$A→B:E_{PK^B}[M||E_{SK^A}[H(M)]]$ + + +后两种情况要求B知道A的公开钥并确信公开钥的真实性。为此A还需同时向B发送自己的公钥证书,表示为 +$A→B:M||E_{SK^A}[H(M)]||E_{SK^{AS}}[T||ID_A||PK_A]$ +或 +$A→B:E_{PK^B}[M||E_{SK^A}[H(M)]||E_{SK^{AS}}[T||ID_A||PK_A]]$ +其中$E_{SK^{AS}}[T||ID_A||PK_A]$是认证服务器AS为A签署的公钥证书。 + + +#### 7.3 身份证明 +身份证明:又称为身份识别、身份认证。它是证实客户的真实身份与其所声称的身份是否相符的过程。 +用户的身份识别是许多应用系统的第一道防线,身份证明对确保系统和数据的安全保密是极其重要的。 + +- 身份证明的手段:三种途径之一或他们的组合 +1)所知(Knowledge):密码、口令 +2)所有(Possesses):身份证、护照、信用卡、钥匙 +3)个人特征:指纹、笔迹、声纹、手型、血型、视网 + 膜、虹膜、DNA以及个人动作方面的一些特征 +4)你做的事情(如手写签名) + +- 设计依据: +安全水平、系统通过率、用户可接受性、成本等 + + + +#### 7.3.1 身份证明机制分类 +- 口令机制 +- 交互式证明 +- 零知识证明协议 + +#### 7.3.2 口令认证 +- Passwords(weak authentication):系统检查口令是否与系统拥有的相应用户数据相匹配,批准声明的身份访问资源 + - 用户ID是声称的身份 + + - 口令是支持声称的证据:固定口令、PIN和通行密钥 + +![](files/2018-04-02-16-50-51.png) + +![](files/2018-04-02-16-51-45.png) + +![](files/2018-04-02-16-52-02.png) + +![](files/2018-04-02-16-52-33.png) + +![](files/2018-04-02-16-54-38.png) + +![](files/2018-04-02-16-55-28.png) + +![](files/2018-04-02-16-56-04.png) + +![](files/2018-04-02-16-56-36.png) + +![](files/2018-04-02-16-56-51.png) + +![](files/2018-04-02-16-57-26.png) + +- 加强固定口令安全性的措施 + - 避免“弱”口令 + - 口令加盐 + - 口令扩展为通行短语 + - 放慢口令映射(多次迭代函数,上面的撒盐机制) + - 定义口令生存期 + - 限制口令的尝试次数 + - 登录需输入指定图片中的随机数和字母的组合 + +![](files/2018-04-02-16-58-51.png) + +![](files/2018-04-02-16-59-29.png) + +![](files/2018-04-02-16-59-50.png) + +![](files/2018-04-02-17-00-16.png) + +![](files/2018-04-02-17-00-38.png) + +![](files/2018-04-02-17-01-03.png) + + +#### 7.3.3 交互式证明 +- 示证者P(Prover),知道某一秘密,使V相信自己掌握这一秘密; +- 验证者V(Verifier),验证P掌握秘密;每轮V向P发出一询问,P向V做应答。V检查P是否每一轮都能正确应答。 + +P知道某一秘密(如公钥密码体制的秘密钥或一平方剩余x的平方根),P希望使V相信自己的确掌握这一秘密。交互证明由若干轮组成,在每一轮,P和V可能需根据从对方收到的消息和自己计算的某个结果向对方发送消息。比较典型的方式是在每轮V都向P发出一询问,P向V做出一应答。所有轮执行完后,V根据P是否在每一轮对自己发出的询问都能正确应答,以决定是否接受P的证明。 + +交互证明和数学证明的区别是: 数学证明的证明者可自己独立地完成证明,而交互证明是由P产生证明、V验证证明的有效性来实现,因此双方之间通过某种信道的通信是必需的。 + 交互证明系统须满足以下要求: +① 完备性: 如果P知道某一秘密,V将接受P的证明。 +② 正确性: 如果P能以一定的概率使V相信P的证明,则P知道相应的秘密。 + + +#### 7.3.4 简化的Fiat-Shamir身份识别方案 +**协议及原理** +设n=pq,其中p和q是两个不同的大素数,x是模n的平方剩余,y是x的平方根。又设n和x是公开的,而p、q和y是保密的。证明者P以y作为自己的秘密。4.1.8节已证明,求解方程$y^2≡x\space mod\space n$与分解n是等价的。因此他人不知n的两个素因子p、q而计算y是困难的。P和验证者V通过交互证明协议,P向V证明自己掌握秘密y,从而证明了自己的身份。 + +**协议如下:** +① P随机选$r(0 + +右图表示一个简单的迷宫,C与D之间有一道门,需要知道秘密口令才能将其打开。P向V证明自己能打开这道门,但又不愿向V泄露秘密口令。 + + + +