2012年2月20日星期一

加密签名和gpg

为了研究apk的签名,看了下签名和加密的问题,不过本文和apk的签名毫无关系。

加密算法有两种,对称密钥算法和非对称密钥算法。对称密钥算法包括DES,AES等,非对称密钥算法包括RSA,DSA等。对称密钥算法在加密和解密的时候使用同一个密钥。加密解密速度快,如果同时和多方通信,密钥管理成本高;非对称密钥算法则有私钥和公钥之分。私钥保留在用户手中,不对外透漏,公钥公布在互联网上,比如可以放在keys.gnupg.net。公钥和私钥都可以用来加密数据。密钥管理成本低,但是加密解密速度慢。Gnupg简称gpg,是生成和管理密钥的工具。Gnome用seahorse做前端,KDE用Kgpg做前端。

签名是指身份认证,即证明和B通讯的另一方就是A,而不是C冒充的。即A使用私钥签名,B使用A的公钥进行解密。解密成功,则证明对方就是A。
加密是指将信息加密,即使其他用户获得加密后的信息,也无法获得信息正确内容。即B使用A的公钥进行加密,再将加密数据传给A,A收到数据后,利用私钥解密,C即使获得了加密数据,但是由于C没有A的私钥,因此信息依然是安全的。

gpg 命令:
生成key: gpg --gen-key
修改key信息: gpg --edit-key ilout
查看当前的公钥: gpg --list-keys
查看当前的私钥: gpg --list-secret-keys
删除私钥:gpg --delete-secret-keys ilout
删除公钥:gpg --delete-keys ilout
加密信息:gpg -e -r ilout file
解密信息:gpg -d file.asc  >file
导出公钥:gpg --export -a ilout >ilout.pk
将公钥上传到网站: gpg --import --keyserver keys.gnupg.net --send-key E7201101
从文件导入公钥:gpg --import -a ilout.pk
从网站导入公钥:gpg --import --keyserver keys.gnupg.net --recv-keys E7201101
导入公钥后需要对公钥签名,以表示信任该公钥: gpg --sign-key E7201101

上述的签名过程有个漏洞:如果C谎称自己是A,然后将自己的公钥发送给B,B直接导入假冒的公钥,也可以顺利的完成签名认证的过程。为了解决此问题,就产生了数字证书来保证A的公钥无法被任何人冒充。

没有评论:

发表评论