您的位置:首页 > 其它

数字签名验证及加解密中的一些概念

2016-05-20 13:49 225 查看

对称加密

通信双方使用同一个密钥( secret )加密解密

密钥(Secret)

对称加密中双方共同使用的密码

非对称加密

通信中的密钥是成对的:公钥A和私钥B。用A加密的密文只能用B解密,同样,用B加密的密文也只能用A解密

在非对称加密算法中,如果一个“密钥对”中的两个密钥满足以下两个条件:

1、对信息用其中一个密钥加密后,只有用另一个密钥才能解开;

2、其中一个密钥公开后,根据公开的密钥别人也无法算出另一个。

那么我们就称这个密钥对为非对称密钥对,公开的密钥称为公钥,不公开的密钥称为私钥。

常见的非对称加密算法包括RSA、Elgamal、D-H、ECC(椭圆曲线加密算法)等。

公钥(Public Key) & 私钥(Private Key)

公钥与私钥一一对应。

公钥自由发布给外部通信方。

私钥需要自己秘密存储,一旦泄漏则可能导致身份被伪造,机密信息泄漏。

加密 & 解密

发方用收方的公钥加密,收方用自己的私钥解密,防止信息被第三方获取。

当发方向收方通信时发方用收方的公钥对原文进行加密,收方收到发方的密文后,用自己的私钥进行解密,其中他人是无法解密的,因为他人不拥有自己的私钥,这就是用公钥加密,私钥解密用于通信;

签名 & 验证

发方用自己的私钥签名,收方用发方公钥验证,用来验证发方的身份,防止信息被第三方伪造。

发出的签名一般并非是对原文本身进行加密,而是要对原文进行所谓的“哈希”(Hash)运算,即对原文作数字摘要。该密码算法也称单向散列运算,其运算结果称为哈希值,或称数字摘要,也有人将其称为“数字指纹”。哈希值有固定的长度,运算是不可逆的,不同的明文其哈希值是不同的,而同样的明文其哈希值是相同并且是唯一的,原文的任何改动,其哈希值就要发生变化。

签名验证与加密解密的原理相同,签名即是用私钥对数字摘要进行加密,将原文和密文同时发给收方,收方用公钥对密文进行解密,然后与原文的摘要进行比对验证。

非对称密钥的基本使用场景有两种:1、公钥对交易信息加密,私钥对交易信息解密。私钥持有人解密后,可以使用收到的价值。2、私钥对信息签名,公钥验证签名。通过公钥签名验证的信息确认为私钥持有人发出。

数字证书 & CA(Certificate Authority)

数字证书由证书中心(CA)颁发,包含客户公钥和其他信息(如域名,公司名称),需要用证书中心的公钥进行解密。

CA是数字证书认证中心的简称,是指发放、管理、废除数字证书的机构。CA的作用是检查证书持有者身份的合法性,并用自己的私钥对客户的公钥和客户信息进行加密,生成数字证书,防止证书被伪造或篡改,以及对证书和密钥进行管理。

证书链

TODO

KeyStore & Keytool

KeyStore 是用来储存密钥和证书的密钥仓库,其中包含两类条目( Entry ):密钥项、证书项。KeyStore 一般是一个文件,用密码保护。

参见:

https://docs.oracle.com/javase/7/docs/api/java/security/KeyStore.html

http://docs.oracle.com/javase/6/docs/technotes/guides/security/crypto/CryptoSpec.html#KeystoreImplementation

Keytool 是Java 中(位于 JDK\Bin 目录下)管理密钥和证书的工具,可以用来生成密钥、创建数字证书,所有的密钥和数字证书是以一条一条(采用别名区别)的形式存入 KeyStore 中,一条证书包含私钥,公钥和对应的证书主体信息三种信息。

Keytool 可以将 KeyStore中的证书导出为数字证书文件,数字证书文件只包括主体信息和对应的公钥。JDK 的 Keytool 不能导出私钥,但是用一些三方的证书工具可以导出,如 jksExportKey,KeyStore Explorer等 。

KeyStore的几种实现类型

JKS:

Java Key Store,提供者是 SUN,Java特有,也是Java编程中最常见的类型。其中的条目可以是私钥和证书,但不支持对称加密中的secret。其中保存的私钥不能在 Java 中取出。

Java中相关类:sun.security.provider.JavaKeyStore

JCEKS

JCE Key Store (Java Cryptography Extension KeyStore),提供者是 SunJCE。从 Java 1.4 的版本开始有,是 JKS 的超集,支持更多的算法,条目可以是私钥、证书和对称加密的secret。用更强的三重数据加密算法(Triple DES encryption)保护其中的私钥。

Java中相关类:com.sun.crypto.provider.JceKeyStore

PKCS12

PKCS(The Public-Key Cryptography Standards,公钥加密标准)中定义的个人信息交换语法,非Java特有,在Java和其它语言中都可以使用,可以保存私钥、证书和secret。不同于JKS的是,其中的私钥内容可以在 Java 中取出。这种类型更便于不同编程语言之间的适配。目前 Java 中默认类型是 JKS,但从 Java 9开始,默认类型将改为 PKCS12

Java中相关类:sun.security.pkcs12.PKCS12KeyStore

Java SE 中支持以上三种类型,参见:http://docs.oracle.com/javase/7/docs/technotes/guides/security/StandardNames.html#KeyStore

BKS:

Bouncy Castle Keystore(提供者是 Bouncy Castle),目前主要是 Android 在使用这种类型。

参见 https://bouncycastle.org/specifications.html

参考

http://www.ruanyifeng.com/blog/2013/07/rsa_algorithm_part_two.html RSA算法原理

http://bank.hexun.com/2009-06-24/118958531.html 用实例给新手讲解RSA加密算法

http://crypto.stackexchange.com/questions/10728/can-an-rsa-private-key-have-several-public-keys Can an RSA private key have several public keys?

http://www.youdzone.com/signature.html What is a Digital Signature?

http://www.pixelstech.net/article/1408345768-Different-types-of-keystore-in-Java—-Overview 几种KeyStore类型的区别

https://docs.oracle.com/javase/7/docs/technotes/guides/security/crypto/HowToImplAProvider.html Jar包签名验证

http://docs.oracle.com/javase/7/docs/technotes/guides/security/SunProviders.html

http://docs.oracle.com/javase/7/docs/technotes/guides/security/crypto/CryptoSpec.html#KeystoreImplementation
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  解密 加密 通信 密码