数字签名的概述
我们在传递信息的时候时常会考虑的一个问题就是,信息的来源是否正确,信息内容是否正确,这个问题在我之前的消息认证码已经有讨论过了,消息认证码虽然可以起到对信息来源的确认以及信息内容的确认,但是因为消息认证码需要双方共享一个没有第三方知道的,一摸一样的密钥,所以信息存在否认性,即A若向B发送一个信息,A可以否认该信息是自己发送的,A可以说是B创建的,因为这个密钥是A和B独享的,没有第三方知道。于是就有了数字签名。
数字签名的原理
数字签名主要是结合了非对称加密,因为非对称加密中存在公钥和私钥,如果A使用B的公钥向B发送信息,那么只有B的私钥才能解开,同样的A使用自己的私钥,B只有使用A的公钥才能解开,那么假设现在A使用自己的私钥向B发送信息,那么B使用A的公钥进行解密,如果成功,那么就说明信息的来源是A,但是如果仅仅使用RSA做信息的加密和解密仅仅能保证数据的加密传输,同时消除了信息的否认性,但是不能保证数据的正确性,所以我们在进行数据传输的时候,不仅要传送密文还要传送数字签名。我们将明文信息进行单向散列函数的计算,然后使用私钥加密发送出去,那么当接收者接收到这个数字签名后,使用公钥将散列值解密出来,我们称该散列值为A,然后再将接收到的密文解密成明文,然后将明文进行单向散列值的计算,我们称该计算结果为B,最后将A和B进行比对。
用于数字签名的公私钥算法
RSA
EIgamal
DSA:只能用字啊数字签名上面
ECDSA:结合椭圆曲线的数字签名算法,其具备诸多优点,我们可以使用该算法进行数字签名的生成,速度较RSA也有些优势,但是因为明文经过散列函数的计算之后,数字签名的长度已经很少了,所以数字签名的计算时间以及加解密时间可以说不用特别在意。
数字签名的问题
数字签名的主要问题就是公钥的分配问题,我们要怎么保证我们获得的公钥的来源是正确的,如果中间人冒充目标对象将自己的公钥进行散布,那么我们从一开始获得到的公钥就是错误的,那么即便我们使用多么高强度的加密算法,使用多么厉害的数字签名机制,信息都已经全部泄露出去了,所以数字签名虽然不错,但是整个信息传递的体制还不够完善,还需要数字证书,PKI等基础设施的帮助。