zoukankan      html  css  js  c++  java
  • RSA签名的PSS模式

    本文由云+社区发表

    作者:mariolu

    一、什么是PSS模式?

    1.1、两种签名方式之一RSA-PSS

    PSS (Probabilistic Signature Scheme)私钥签名流程的一种填充模式。目前主流的RSA签名包括RSA-PSS和RSA-PKCS#1 v1.5。相对应PKCS(Public Key Cryptography Standards)是一种能够自我从签名,而PSS无法从签名中恢恢复原来的签名。openssl-1.1.x以后默认使用更安全的PSS的RSA签名模式。

    1.2、填充的必要性

    RSA算法比较慢,一般用于非对称加密的private key签名和public key验证。因RSA算法沒有加入乱数,当出现重复性的原始资料,攻击者会通过相同加密密文而猜测出原文,因此导入padding的机制來加強安全性。

    TLS流程中的密钥材料若不进行填充而直接加密,那么显然相同的key,会得到相同的密文。这种在语义上来说,是不安全的。以下例子说明了无填充模式的安全漏洞。

    • m:明文
    • e,n:RSA参数(公钥)
    • d:RSA参数(私钥)
    • c:网络传输密文

    加密方加密m:c = m^e mod n,传输c

    解密方解密c:m = c^d mod n,还原m

    • c':篡改密文
    • k:篡改码

    由于c在网络上传输,如果网络上有人对其进行c' = c*k^e mod n,这样的替换

    那么解密方将得到的结果是

    (c*k^e)^d mod n

    = (c^d mod n)* (k^ed mod n)

    = m*k

    即中间人有办法控制m。

    1.3、PSS的基本要素

    使用PSS模式的RSA签名流程如下:

    img图1、RSA-PSS的填充模式

    相比较PKCS#1 v1.5的padding简单许多:

    img图2、RSA-PKCS#v1.5的填充模式

    PSS的一些概念:

    • hash算法,一般使用SHA-1
    • MGF函数(mask generation function)。默认是MGF1。
    • salt length,一般由hLen决定。当为0时,签名值变成了唯一确定的。
    • 截断符号,一般是0xbc

    二、RSA签名实际操作

    这节例子中所涉及到的文件说明:

    /tmp/wildcard_domain.sports.qq.com.v2.key:私钥

    /tmp/pub: 公钥

    /tmp/data: 明文

    /tmp/endata: 密文

    /tmp/sign: 签名

    /tmp/de_sign: 解签名

    2.1、前期准备:公钥和私钥

    • 通过key文件提取出public key
    openssl rsa -in /usr/local/services/ssl_agent/ca/wildcard_domain.sports.qq.com.v2.key -pubout -out /tmp/pub
    
    • 原始数据:

    echo -n "1234567890" > /tmp/data

    • 这样就有一对公钥和私钥,用来测试RSA加密解密(encrypt、decrypt)和签名验证(sign,verify)
    • RSA加密的两种算法分别是RSAES-PKCS-v1_5 and RSAES-OAEP。

    2.2、加密和解密(encrypt,decrypt)

    • 加密:
    openssl rsautl -pubin -inkey /tmp/data -in /tmp/data -encrypt -out /tmp/endata
    
    • 解密,用private key解密,得到原本的值:
    openssl rsautl -inkey /tmp/wildcard_domain.sports.qq.com.v2.key -in /tmp/en_data -decrypt
    

    2.3、签名和验证(sign, verify)

    签名过程包括hash和加密。hash函数一般使用sha1。这样输入明文,直接生成sign签名。

    如果是私钥签名所做的事就是先hash再加密,选择一种hash算法把原始消息计算后成ASN1格式,再把这个资料用private key加密后送出,资料本身不加密,这种方式主要是用來验证资料来源是否可信任的,送出時把原始资料和签名一起送出。

    • 签名:
    openssl sha1 -sign /tmp/wildcard_domain.sports.qq.com.v2.key  /tmp/data > /tmp/data/sign/tmp/data/sign
    
    • 解开签名:
    openssl rsautl -pubin -inkey /tmp/pub -in sign -verify -out /tmp/de_sign 
    

    用public key解开签名,并且保留padding

     openssl rsautl -pubin -inkey /tmp/pub -in /tmp/sign -encrypt -raw -hexdump
    

    使用解开ASN1解开签名,或者签名后用ASN1工具解析

    openssl rsautl -pubin -inkey /tmp/pub -in /tmp/sign -verify -asn1parse
    

    或者:

    openssl asn1parse -inform der -in /tmp/de_sign
    

    和本地sha1对比

    openssl sha1 /tmp/data
    

    如果两者hash结果是一样,那么确定签名送过来是正确的。

    2.4、openssl rsautl工具支持的填充模式

    openssl rsautl --help,可以看到支持的padding模式有,在rsautl加上以下选项可以重复做2.2~2.3的实验。

     -ssl                     Use SSL v2 padding
     -raw                     Use no padding
     -pkcs                    Use PKCS#1 v1.5 padding (default)
     -oaep                    Use PKCS#1 OAEP
    

    三、PSS填充模式的特点

    PSS是RSA的填充模式中的一种。

    完整的RSA的填充模式包括:

    RSA_SSLV23_PADDING(SSLv23填充)
    RSA_NO_PADDING(不填充)
    RSA_PKCS1_OAEP_PADDING (RSAES-OAEP填充,强制使用SHA1,加密使用)
    RSA_X931_PADDING(X9.31填充,签名使用)
    RSA_PKCS1_PSS_PADDING(RSASSA-PSS填充,签名使用)
    RSA_PKCS1_PADDING(RSAES-PKCS1-v1_5/RSASSA-PKCS1-v1_5填充,签名可使用)
    

    其中主流的填充模式是PKCS1和PSS模式。

    PSS的优缺点如下:

    • PKCS#1 v1.5比较简易实现,但是缺少security proof。
    • PSS更安全,所以新版的openssl-1.1.x优先使用PSS进行私钥签名(具体在ssl握手的server key exchange阶段)

    此文已由腾讯云+社区在各渠道发布

    获取更多新鲜技术干货,可以关注我们腾讯云技术社区-云加社区官方号及知乎机构号

  • 相关阅读:
    hdu 5646 DZY Loves Partition
    bzoj 1001 狼抓兔子 平面图最小割
    poj 1815 Friendship 最小割 拆点 输出字典序
    spoj 1693 Coconuts 最小割 二者取其一式
    hdu 5643 King's Game 约瑟夫环变形
    约瑟夫环问题
    hdu 5642 King's Order
    CodeForces 631C Report
    1039: C语言程序设计教程(第三版)课后习题9.4
    1043: C语言程序设计教程(第三版)课后习题10.1
  • 原文地址:https://www.cnblogs.com/qcloud1001/p/10373760.html
Copyright © 2011-2022 走看看