2017年11月15日星期三

密码学常用算法及应用场景

1. 常用密码学算法及概念

  • Hash (消息摘要)
  • Merkle 树
  • 对称加密
  • 非对称加密

1.1 Hash (消息摘要)

1.1.1 定义

能将任意长度的数据(明文)映射为较短的固定长度的数值(Hash 值),并且不同的明文很难映射为相同的 Hash 值

1.1.2 算法特性

  • 正向快速:给定明文和 hash 算法,在有限时间和有限资源内能计算出 hash 值
  • 逆向困难:给定(若干) hash 值,在有限时间内很难(基本不可能)逆推出明文
  • 输入敏感:原始输入信息修改一点信息,产生的 hash 值看起来应该都有很大不同
  • 冲突避免:很难找到两段内容不同的明文,使得它们的 hash 值一致(发生冲突)

1.1.3 典型代表

  • MD5(128位), SHA1(160位), SHA2 (SHA-224/SHA-256/SHA-384/SHA-512), AEAD
  • MD5 和 SHA1 已经不再安全,推荐使用 SHA2-256/SHA2-512

1.1.4 用法举例

echo "hello world"|shasum -a 256
# a948904f2f0f479b8f8197694b30184b0d2ed1c1cd2a1ec0fb85d299a192a447

echo "hello w0rld"|shasum -a 256
# fa0dbd233c91bdb55e2bda390ee2149eaad830a1a40b7bb1d7adf7c3b30e091d

1.2 Merkle 树 (默克尔树)

1.2.1 定义

默克尔树(又叫哈希树)是一种二叉树,由一个根节点、一组中间节点和一组叶节点组成。最下面的叶节点包含存储数据或其哈希值,每个中间节点是它的两个孩子节点内容的哈希值,根节点也是由它的两个子节点内容的哈希值组成。

1.2.2 算法特性

默克尔树的特点是,底层数据的任何变动,都会传递到其父亲节点,一直到树根。

1.2.3 应用场景

  • 快速比较大量数据:当两个默克尔树根相同时,则意味着所代表的数据必然相同。
  • 快速定位修改:例如上例中,如果 D1 中数据被修改,会影响到 N1,N4 和 Root。因此,沿着 Root --> N4 --> N1,可以快速定位到发生改变的 D1;
  • 零知识证明:例如如何证明某个数据(D0……D3)中包括给定内容 D0,很简单,构造一个默克尔树,公布 N0,N1,N4,Root,D0 拥有者可以很容易检测 D0 存在,但不知道其它内容。

1.3 对称加密

1.3.1 定义

加密和解密使用的密钥相同

1.3.2 算法特性

  • 加解密效率高(速度快,空间占用小),加密强度高
  • 参与多方都需要持有密钥,一旦有人泄露则安全性被破坏

1.3.3 代表算法

  • DES (Data Encryption Standard)
经典的分组加密算法,1977 年由美国联邦信息处理标准(FIPS)所采用 FIPS-46-3,将 64 位明文加密为 64 位的密文,其密钥长度为 56 位 + 8 位校验。现在已经很容易被暴力破解。
  • AES (Advanced Encryption Standard)
美国国家标准研究所(NIST)采用取代 DES 成为对称加密实现的标准,1997~2000 年 NIST 从 15 个候选算法中评选 Rijndael 算法(由比利时密码学家 Joan Daemon 和 Vincent Rijmen 发明)作为 AES,标准为 FIPS-197。AES 也是分组算法,分组长度为 128、192、256 位三种。AES 的优势在于处理速度快,整个过程可以数学化描述,目前尚未有有效的破解手段。
  • CHACHA20
  • RC4

1.4 非对称加密

1.4.1 定义

加密密钥和解密密钥是不同的,分别称为公钥和私钥。
非对称加密是现代密码学历史上最为伟大的发明(没有之一)

1.4.2 算法特性

  • 公钥一般是公开的,人人可获取的,私钥一般是个人持有,不能被他人获取
  • 公私钥分开,在不安全的通道上也可以使用
  • 加解密速度慢,一般比对称加解密算法慢两到三个数量级,加密强度相比对称加密要差

1.4.3 代表算法

  • RSA 【数字签名、密钥交换、公钥加密】
经典的公钥算法,1978 年由 Ron Rivest、Adi Shamir、Leonard Adleman 共同提出,三人于 2002 年获得图灵奖。 算法利用了对大数进行质因子分解困难的特性,目前互联网上大部分机构所颁发的证书还是基于 RSA 算法

  • DH (Diffie–Hellman) 【密钥交换】
基于离散对数无法快速求解。用于密钥交换,可以让双方在完全没有对方任何预先信息的条件下通过不安全信道创建起一个密钥 

  • DSA (Digital Signature Algorithm)【数字签名】
与 RSA 的签名机制类似
  • 椭圆曲线算法(Elliptic curve cryptography,ECC)
现代备受关注的算法系列,基于对椭圆曲线上特定点进行特殊乘法逆运算难以计算的特性。最早在 1985 年由 Neal Koblitz 和 Victor Miller 分别独立提出。ECC 系列算法一般被认为具备较高的安全性,但加解密计算过程往往比较费时。
  • ECDH (Elliptic Curve Diffie-Hellman) 【密钥交换】
DH 算法有一个变种,它与 DH 类似,ECDH 依赖的是——求解“椭圆曲线离散对数问题”的困难。
  • ECDSA (The Elliptic Curve Digital Signature Algorithm) 【数字签名】
基于椭圆曲线的数字签名算法
  • ECIES (Elliptic Curve Integrated Encryption Scheme) 【密钥交换、公钥加密】
基于椭圆曲线的公钥加密算法

2. 区块链中的密码学应用场景

2.1 数字签名

2.1.1 定义

类似在纸质合同上签名确认合同内容,数字签名用于证实某数字内容的完整性(integrity)和来源(或不可抵赖,non-repudiation)。

2.1.2 应用场景

一个典型的场景是,A 要发给 B 一个文件(一份信息),B 如何获知所得到的文件即为 A 发出的原始版本?
  • A 先对文件进行摘要,然后用自己的私钥进行加密,将文件和加密串都发给 B
  • B 收到后文件和加密串,用 A 的公钥来解密加密串,得到原始的数字摘要,跟对文件进行摘要后的结果进行比对
  • 如果一致,说明该文件确实是 A 发过来的,并且文件内容没有被修改过
简单的数字签名


2.2 PKI 体系

2.2.1 定义

公钥基础设施(PKI)用于描述管制或操纵证书与公钥及私钥的策略、标准和软件。实际上,PKI 是指由数字证书、证书颁发机构 (CA) 以及对电子交易所涉及各方的合法性进行检查和验证的其它注册机构组成的一套系统。PKI 的有关标准仍处于不断发展之中,即使这些标准已被作为电子商务的要素而广泛实施。
X.509 - 是由国际电信联盟(ITU-T)制定的数字证书标准
PKCS - 是由美国RSA数据安全公司及其合作伙伴制定的一组公钥密码学标准,其中包括证书申请、证书更新、证书作废表发布、扩展证书内容以及数字签名、数字信封的格式等方面的一系列相关协议。(X.509的技术实现细节)
PKI 严重依赖于 CA 的权威性,属于 Fabric 联盟链特有的。比特币和以太坊等公有链完全不需要 PKI 这套体系

2.2.2 PKI 中的主要概念

  • 证书(公钥证书)
里面主要存储证书所有者的公钥等基本信息,含有 CA 的数字签名,CA 要对它所签名的证书负责
  • 证书颁发机构 (CA)
是向个人、计算机或任何其它申请实体颁发证书的可信实体。CA 受理证书申请,根据该 CA 的策略验证申请人的信息,然后使用它的私钥把其数字签名应用于证书。
  • 注册
是实体向 CA 自我介绍的过程。在申请证书时,注册可以是隐含的,或通过为主体提供担保的另一个可信实体(如智能卡登记站)来完成
  • 证书登记
是最终实体进行证书申请并从 CA 接收证书的过程
  • 证书吊销
证书具有一个指定的寿命,但 CA 可通过称为证书吊销的过程来缩短这一寿命。CA 发布一个证书吊销列表 (CRL),列出被认为不能再使用的证书的序列号

2.2.3 PKI 在 HTTPS(TLS) 中的应用

https 简要流程

  • 消息摘要使用: SHA256/MD5/SHA1/AEAD
  • 数字签名使用: RSA/ECDSA/DSA
  • 密钥交换使用: RSA/ECDH/DH
  • 对称加密使用: AES/CHACHA20/RC4c
# 使用命令查看 openssl 支持的加密组合方式
openssl ciphers -v | column -t

2.2.4 自建 HTTPS Server

  • 生成 RSA 密钥,并使用该密钥对证书签名
#生成 RSA 密钥对
openssl genrsa -out key.pem 2048
#生成证书
openssl req -new -x509 -key key.pem -out cert.pem -days 1095

#查看 RSA 密钥对
openssl rsa -in key.pem -text -noout
#查看证书
openssl x509 -in cert.pem -text -noout
  • 将证书应用于 HTTPS Server
  • 访问 https 网址(提示证书有问题)
  • 导入证书到系统,再次访问
  • 查看 Google/Baidu 的证书

2.3 X.509 证书标准

主要定义了证书中应该包含哪些内容.其详情可以参考RFC5280,SSL使用的就是这种证书标准.

编码格式

同样的X.509证书,可能有不同的编码格式,目前有以下两种编码格式.
PEM - Privacy Enhanced Mail,打开看文本格式,以"-----BEGIN..."开头, "-----END..."结尾,内容是BASE64编码. 查看PEM格式证书的信息:
openssl x509 -in certificate.pem -text -noout
Apache和*NIX服务器偏向于使用这种编码格式.
DER - Distinguished Encoding Rules,打开看是二进制格式,不可读. 查看DER格式证书的信息:
openssl x509 -in certificate.der -inform der -text -noout
Java和Windows服务器偏向于使用这种编码格式.

相关的文件扩展名

这是比较误导人的地方,虽然我们已经知道有PEM和DER这两种编码格式,但文件扩展名并不一定就叫"PEM"或者"DER",常见的扩展名除了PEM和DER还有以下这些,它们除了编码格式可能不同之外,内容也有差别,但大多数都能相互转换编码格式.
CRT - CRT应该是certificate的三个字母,其实还是证书的意思,常见于*NIX系统,有可能是PEM编码,也有可能是DER编码,大多数应该是PEM编码。
CER - 还是certificate,还是证书,常见于Windows系统,同样的,可能是PEM编码,也可能是DER编码,大多数应该是DER编码.
KEY - 通常用来存放一个公钥或者私钥,并非X.509证书,编码同样的,可能是PEM,也可能是DER.
查看KEY的办法: openssl rsa -in mykey.key -text -noout
如果是DER格式的话,同理应该这样了:openssl rsa -in mykey.key -text -noout -inform der
CSR - Certificate Signing Request,即证书签名请求,这个并不是证书,而是向权威证书颁发机构获得签名证书的申请,其核心内容是一个公钥(当然还附带了一些别的信息),在生成这个申请的时候,同时也会生成一个私钥,私钥要自己保管好.做过iOS APP的朋友都应该知道是怎么向苹果申请开发者证书的吧.
查看的办法:openssl req -noout -text -in my.csr (如果是DER格式的话照旧加上-inform der,这里不写了)
PFX/P12 - predecessor of PKCS#12,对*nix服务器来说,一般CRT和KEY是分开存放在不同文件中的,但Windows的IIS则将它们存在一个PFX文件中,(因此这个文件包含了证书及私钥)这样会不会不安全?应该不会,PFX通常会有一个"提取密码",你想把里面的东西读取出来的话,它就要求你提供提取密码,PFX使用的时DER编码,如何把PFX转换为PEM编码?
openssl pkcs12 -in for-iis.pfx -out for-iis.pem -nodes
这个时候会提示你输入提取代码. for-iis.pem就是可读的文本. 生成pfx的命令类似这样:
openssl pkcs12 -export -in certificate.crt -inkey privateKey.key -out certificate.pfx -certfile CACert.crt
其中CACert.crt是CA(权威证书颁发机构)的根证书,有的话也通过-certfile参数一起带进去.这么看来,PFX其实是个证书密钥库.
JKS - 即Java Key Storage,这是Java的专利,跟OpenSSL关系不大,利用Java的一个叫"keytool"的工具,可以将PFX转为JKS,当然了,keytool也能直接生成JKS,不过在此就不多表了.

2013年4月18日星期四

恶心的一天

   今天早晨是铺天盖地的歌功颂德,大肆宣扬习总打车亲民,中午过后甚至交通部出面确认确有此事。结果下午快要下班时,腾讯弹窗说是假新闻,感情天朝人就是被愚弄的啊!次熬!我恨这个无良的时代!!!以下截图为证:



   我想说:在秦朝末年,陈胜、吴广就大声的喊出了“王侯将相宁有种乎!”,现在这个时代竟然还如此这般的歌功颂德,真让人恶心!

2012年12月5日星期三

美国之音:中国为监禁刘晓波辩护

美国之音:中国为监禁刘晓波辩护:

中国拒绝了134名诺贝尔奖得主要求释放诺贝尔和平奖获得者刘晓波的呼声。


这些诺贝尔奖得主星期二发出致中共总书记习近平的公开信。他们在信中要求“立即无条件释放” 刘晓波。后者被当局以颠覆罪判处11年徒刑,正在服刑。

中国外交部发言人洪磊星期三对记者说,这封信干涉了中国内政。

当记者问到刘晓波犯了什么罪的时候,洪磊拒绝回答。

2009年,中国当局因为刘晓波参与起草了08宪章以颠覆罪把他判刑。08宪章是一份宣言,要求当局进行政治改革,给予人民更多的权利。刘晓波在2010年获得诺贝尔和平奖。她的妻子刘霞目前也受到软禁。

由南非大主教图图和达赖喇嘛等著名人士签署的这封公开信说,如果释放刘晓波和他的妻子,将是朝着维护中国公民基本权利迈出的“重要的第一步“。

2012年8月23日星期四

Metro编程(CPP + XAML)初玩

    从听说微软重新启用C++ Native那一刻起,就一直想尝试一下微软在MFC之后还会有什么创造性的编程模式。
    安装VS2012一路默认下来,安装完毕后,迫不及待的新建了空白Metro应用。以下是我初步试玩的一些心得:

  1. 使用ref new来代替C++/CLI中的gcnew。大致分析了下自动生成的代码,发现跟WPF的那套东西很像(PS:貌似WPF不支持C++),包含了大量的C++/CLI语法,可见Metro的C++库依然不是原生的C++,微软还是经过了一层包装(PS:可能是为了给C#或者JS调用的缘故吧)。新建对象方式跟C++/CLI还是有一些不同的,不再使用gcnew创建对象,而是使用ref new代替了gcnew,难道这就是微软所宣传的创说中的非托管(C++/CLI是使用gcnew在CLR上创建对象)?
  2. 新的UI构建方式。这应该是微软下了重点心思来构建的界面开发模式。XAML本身是WPF开发的一部分,是一种XML的使用者接口描述语言,与HTML类似,非常容易入门。对于微软来说并不是什么新鲜东西,但这应该是其第一次和Native C++结合使用。谈到这里就不得不吐槽一下MFC的UI构建方式:虽然MFC使用了一种所见即所得的UI构建方式,在刚推出的时候给开发者带来了很大的方便,但其C和C++混合使用的语法还是让很多初学者摸不着头脑,各种接口混乱,各种宏定义是程序逻辑混乱,代码艰涩难懂。基于XAML的UI构建方式就让开发者像开发HTML页面一样简单,结构层次分明。
  3. 界面和程序逻辑的分离。这应该是未来软件开发的发展方向,对于java/C#等语言来说,这中开发方式应该是相当普遍,并且广为使用的,但对于Native C++使用者来说,构建MVC的模型本身就相当麻烦。MFC的那个时代,微软推荐一种文档/视图的模式,这应该是MVC的一种变种,相信用过文档/视图模式的开发者,都会有的感触,我就不再吐槽了(PS:貌似这本身就是一种吐槽)。
  4. 与STL的混合使用。相信使用C++的每一位开发者对STL的重要性都深有体会。但微软之前的C++/CLI基本不支持STL,类似于 std::list<System::String^> 这样的语法在托管C++中是不支持的。每次需要使用容器的时候,我都只能蛋疼的去使用.NET自带的托管容器 System::Collections::Generic::List ,此托管List对于我这种更熟悉STL的人来说用起来那是相当难受。不过没办法,只能忍受。不过在Metro中,因为微软是使用的Native C++,STL与Metro中的ref new对象混合使用,目前感觉还是相当良好的。这一点还是让我感觉相当的兴奋。

初玩CPP + XAML,总体来说给我的感觉还是相当不错的,还是看到微软下了很大的决心,毕竟Native code的效率要优于Managed code,用户体验才是关键。

2012年6月25日星期一

外面的雨有点儿大





from Instagram: http://instagr.am/p/MUNuijhAa4/





via WordPress http://www.liyake.com/?p=77

2012年6月3日星期日

中指照





from Instagram: http://instagr.am/p/LcMHswhAVT/





via WordPress http://www.liyake.com/?p=63