数字签名,就是只有信息的发送者才能产生的别人无法伪造的一段数字串,这段数字串同时也是对信息的发送者发送信息真实性的一个有效证明。 不清楚的请自行科普 数字签名。本篇主要来讲签名值具体是怎么计算出来的~

一、动手解密签名值

1)准备测试密钥

//随机产生RSA私钥。因1024位的RSA密钥已不安全,本次测试使用2048长度的RSA密钥。
> openssl genrsa  2048
Generating RSA private key, 2048 bit long modulus
.....................+++
............................................................................................................................+++
e is 65537 (0x10001)
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAqmk7bbqdfdDWgQZ/srfpBurN40Rw8QqBjoE8cujbF8zHrNJc
RlhHVRQ9HRwHAkG0xM5OzZjfzxHseJ+D3v84xEwHrd5l0t/iMVZxIOoyHk0gHDKv
kFAaSk+Rlo61bqxgjcRTNkz9mpA8hmG55fYsl1ktJ05YA4rHSv33Dp5OsPGIlO+H
RZRjdsu8iYfFUrPmfjoVZKPhiRHEeYtDxfyu3rUOlfdkLQyFmlrVJAMdatpM2paz
eSY3ypqR0mClQ3+t4GpGrCjXqkFYOXP/02YpDKrO04zHtOxZNnZz7r3YedCgzG4Z
uBvZGin3ig/X2fxZLJmmERhv9FizGvM541kA7wIDAQABAoIBACS/FGWQ/C0JP3gL
IrYzGji3oTYEqCYSEeXc0GAm/jefnN8TbXptxtP9zT/dr1U5PfXCVxPWh0xrnQZV
v2Xyuxb5Hh7L+kECrg/dh/+FANGv5+CsvVbtLv4fMlG47D61RQzM7PSknXsa5zJD
GIcSEoOAY1A6gJgi8N6m7QNl96oH0TiTbs4xIo8wTgwPR2fkXFB/XySqweOZBeNW
W6cGFb382lM2N51G72ElQe27+O214J/bHKDukoGgJ5GE2uI2r0xkIXYLsy+zeOdG
gi1UEqjLng596wvH55hog+4b2aPQP2yxnzvtzQELb6XY/oApgQQd5HH5JpWa8ec3
YJBmp0ECgYEA2Y9YyGp6zsRRTKFuqt1ISQltlFg6pxSAGJYbUPcLD2x67hXdfnhB
s1fvNvG+hYh65e80/HZca8JKTB4ETU0oOPQfzoGRqa5pIxv37QIruskyu2Skevlo
CMAT7EXO1CT5ewce1We1R3vUVIlBI3/JibsI89VyBlyDK2QnUKltBtkCgYEAyIVA
PWnYt0EsA22LdFLcgOQ/W/LMYRssaxpbde9yXqp7MKhhAGFq33IWWYXaGhBVbslC
Co5cLPrcPiNvB+lFPfFfmBTncU9FGnkDCiAGCufWuqHGSc2mmVnn/pdUdwqI+jSW
tqCYQl5YO5R39sbjTPyilWWAuS0lUS9rLm3juQcCgYEAr6p8II9Bi/SeRIbQqew0
sqyHK1G2QjReXfvOIKjo6FJKTDWhe720JxBome/GS2HxAfoMyZD0fRoLDbzq8lPL
l3keuYqLR/wI7o1luZyYHKDacs8HtDfv1ajqLUwMfeVBACK2tc+gYxDMWFnfG7/R
xoEb8G43PIW0b/PVft7eprkCgYAZK/kTfI0S/CBtUbwW3ywFFiIKBeG4MvQRgd6H
YIan8ZjDU+/RX2lOIYFCvbXSXciLvsIGlzZlAxzQxBv1D0h87ScF7WHcbIoNN7G0
/K4lglMHXLWKoEFQsOOZpx+YTf9CAYYF6QUUF8nVuN6SYQc5q+ExBevx0wQDPAOl
cXAL0wKBgENcM4Gc0yAn8dRP803/I90s9zgHapKTjDCw6o3q331VNq90orWQj4hp
bj2BovL6jH2OatpMEv3lLxHXT+pfG9VMGXV79h6AGo5VrLBAMPzAua1xr3nZTWiB
EQd+4FF41ku94XsCbOwEdNgxtIw33m7OZmgYzajSPILvvI35DNnH
-----END RSA PRIVATE KEY-----// 通过生成的私钥,得到公钥
> openssl  rsa -pubout
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAqmk7bbqdfdDWgQZ/srfpBurN40Rw8QqBjoE8cujbF8zHrNJc
RlhHVRQ9HRwHAkG0xM5OzZjfzxHseJ+D3v84xEwHrd5l0t/iMVZxIOoyHk0gHDKv
kFAaSk+Rlo61bqxgjcRTNkz9mpA8hmG55fYsl1ktJ05YA4rHSv33Dp5OsPGIlO+H
RZRjdsu8iYfFUrPmfjoVZKPhiRHEeYtDxfyu3rUOlfdkLQyFmlrVJAMdatpM2paz
eSY3ypqR0mClQ3+t4GpGrCjXqkFYOXP/02YpDKrO04zHtOxZNnZz7r3YedCgzG4Z
uBvZGin3ig/X2fxZLJmmERhv9FizGvM541kA7wIDAQABAoIBACS/FGWQ/C0JP3gL
IrYzGji3oTYEqCYSEeXc0GAm/jefnN8TbXptxtP9zT/dr1U5PfXCVxPWh0xrnQZV
v2Xyuxb5Hh7L+kECrg/dh/+FANGv5+CsvVbtLv4fMlG47D61RQzM7PSknXsa5zJD
GIcSEoOAY1A6gJgi8N6m7QNl96oH0TiTbs4xIo8wTgwPR2fkXFB/XySqweOZBeNW
W6cGFb382lM2N51G72ElQe27+O214J/bHKDukoGgJ5GE2uI2r0xkIXYLsy+zeOdG
gi1UEqjLng596wvH55hog+4b2aPQP2yxnzvtzQELb6XY/oApgQQd5HH5JpWa8ec3
YJBmp0ECgYEA2Y9YyGp6zsRRTKFuqt1ISQltlFg6pxSAGJYbUPcLD2x67hXdfnhB
s1fvNvG+hYh65e80/HZca8JKTB4ETU0oOPQfzoGRqa5pIxv37QIruskyu2Skevlo
CMAT7EXO1CT5ewce1We1R3vUVIlBI3/JibsI89VyBlyDK2QnUKltBtkCgYEAyIVA
PWnYt0EsA22LdFLcgOQ/W/LMYRssaxpbde9yXqp7MKhhAGFq33IWWYXaGhBVbslC
Co5cLPrcPiNvB+lFPfFfmBTncU9FGnkDCiAGCufWuqHGSc2mmVnn/pdUdwqI+jSW
tqCYQl5YO5R39sbjTPyilWWAuS0lUS9rLm3juQcCgYEAr6p8II9Bi/SeRIbQqew0
sqyHK1G2QjReXfvOIKjo6FJKTDWhe720JxBome/GS2HxAfoMyZD0fRoLDbzq8lPL
l3keuYqLR/wI7o1luZyYHKDacs8HtDfv1ajqLUwMfeVBACK2tc+gYxDMWFnfG7/R
xoEb8G43PIW0b/PVft7eprkCgYAZK/kTfI0S/CBtUbwW3ywFFiIKBeG4MvQRgd6H
YIan8ZjDU+/RX2lOIYFCvbXSXciLvsIGlzZlAxzQxBv1D0h87ScF7WHcbIoNN7G0
/K4lglMHXLWKoEFQsOOZpx+YTf9CAYYF6QUUF8nVuN6SYQc5q+ExBevx0wQDPAOl
cXAL0wKBgENcM4Gc0yAn8dRP803/I90s9zgHapKTjDCw6o3q331VNq90orWQj4hp
bj2BovL6jH2OatpMEv3lLxHXT+pfG9VMGXV79h6AGo5VrLBAMPzAua1xr3nZTWiB
EQd+4FF41ku94XsCbOwEdNgxtIw33m7OZmgYzajSPILvvI35DNnH
-----END RSA PRIVATE KEY-----
writing RSA key
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqmk7bbqdfdDWgQZ/srfp
BurN40Rw8QqBjoE8cujbF8zHrNJcRlhHVRQ9HRwHAkG0xM5OzZjfzxHseJ+D3v84
xEwHrd5l0t/iMVZxIOoyHk0gHDKvkFAaSk+Rlo61bqxgjcRTNkz9mpA8hmG55fYs
l1ktJ05YA4rHSv33Dp5OsPGIlO+HRZRjdsu8iYfFUrPmfjoVZKPhiRHEeYtDxfyu
3rUOlfdkLQyFmlrVJAMdatpM2pazeSY3ypqR0mClQ3+t4GpGrCjXqkFYOXP/02Yp
DKrO04zHtOxZNnZz7r3YedCgzG4ZuBvZGin3ig/X2fxZLJmmERhv9FizGvM541kA
7wIDAQAB
-----END PUBLIC KEY-----

2)编写代码解密

众所周知:

* RSA加密解密:私钥解密,公钥加密。

* RSA数字签名-俗称加签验签:私钥加签,公钥验签。

其实:

也是有私钥加密,公钥解密的。  只是因为公钥是公开的,私钥加密后所有人都可以解密,没有意义,所以常用签名,而不是加密。

私钥加签的本质也是私钥加密数据的Hash值。

这里有个小技巧:我们用公钥对签名值解密,使用RSA_NO_PADDING,这样就能得到 签名时私钥加密的数据。

鉴于篇幅长度,代码只贴出关键部分

代码之PHP:

/*** 创建签名* @param string $data 数据* @return null|string*/public function createSign($data = ''){if (!is_string($data)) {return null;}openssl_sign($data, $sign, self::getPrivateKey(),OPENSSL_ALGO_SHA256);return  $sign;}/*** 公钥解密数据* @param string $data 数据* @return null|string*/public function decData($data = ''){if (!is_string($data)) {return null;}openssl_public_decrypt($data, $encData, self::getPublicKey(),OPENSSL_NO_PADDING);return  $encData;}/*** 公钥解密数据* @param string $data 数据* @return null|string*/public function decDataPKCS1Padding($data = ''){if (!is_string($data)) {return null;}openssl_public_decrypt($data, $encData, self::getPublicKey(),OPENSSL_PKCS1_PADDING);return  $encData;}

其他语言代码整理ing...

本次测试 java、js、C#、PHP。结果均一致,如下:

使用示例私钥进行签名,得到如下结果
签名值Base64: UjV/9zDoYcXTKKKDlWhFshQ08ikknKWqhCig8J7VhVrFCF+tFUQ85xnCUA0KR/t9CVFcf7SDA6ntr/T2xJ4T9TiAHEmNIhghZTlOsp+ieyvB5N4jQ6fuK6DjdtK/icklK5fmMozbKKiHwjr33lWY8NTfXydtKgd/5fPIVhUB26TyOKiO7JY3iAlylqfIpEy4g3fsxiiPGe022jIt400re1UCyZWbhXqdr2JUE7hAZEcMcbxvZff4Ilh6hHZ9rAkWBU1E2vsQUnnvdDK3BOQpZQvTtfIHbX+lhT5UcsFJrwOuONo0nG0s7MSjCsjQEf7iucEZpZeUYwOeMexVHsU9rw==
签名值Hex: 52357ff730e861c5d328a283956845b21434f229249ca5aa8428a0f09ed5855ac5085fad15443ce719c2500d0a47fb7d09515c7fb48303a9edaff4f6c49e13f538801c498d22182165394eb29fa27b2bc1e4de2343a7ee2ba0e376d2bf89c9252b97e6328cdb28a887c23af7de5598f0d4df5f276d2a077fe5f3c8561501dba4f238a88eec963788097296a7c8a44cb88377ecc6288f19ed36da322de34d2b7b5502c9959b857a9daf625413b84064470c71bc6f65f7f822587a84767dac0916054d44dafb105279ef7432b704e429650bd3b5f2076d7fa5853e5472c149af03ae38da349c6d2cecc4a30ac8d011fee2b9c119a5979463039e31ec551ec53daf使用示例公钥进行NOPADDING解密,得到如下结果
原数据Base64: AAH/ADAxMA0GCWCGSAFlAwQCAQUABCC5TSe5k00+CKUuUtfafav6xITv43pTgO6QiPes4u/N6Q==
原数据Hex: 0001ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff003031300d060960864801650304020105000420b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9使用示例公钥进行PKCS1_PADDING解密,得到如下结果
原数据Base64: MDEwDQYJYIZIAWUDBAIBBQAEILlNJ7mTTT4IpS5S19p9q/rEhO/jelOA7pCI96zi783p
原数据Hex: 3031300d060960864801650304020105000420b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9

简单分析

1. 字符串"hello world"进行sha256运算得到hash: b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9

2. 在Hash结果前数据填充:3031300d060960864801650304020105000420

3. PKCS1 在上一步结果前填充:0001ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00

二、结合资料分析RSA的补位

1)签名时,对Hash值的数据填充方式

对hash算法id和hash值进行ASN.1的DER编码。如下

DigestInfo ::= SEQUENCE {

digestAlgorithm AlgorithmIdentifier,

digest OCTET STRING

}

为方便理解,我们使用ASN1dump对示例中的数据做解析

3031300d060960864801650304020105000420b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9

直接上图

可以看到sha256的算法id,2.16.840.1.101.3.4.2.1

数据也在其中,另附上部分算法id:

另因为各个hash算法id是固定的,计算的结果也是固定的。所以不同的hash算法的填充也是固定的。如下:

md2:"3020300c06082a864886f70d020205000410",
md5:"3020300c06082a864886f70d020505000410",
sha1:"3021300906052b0e03021a05000414",
sha224:"302d300d06096086480165030402040500041c",
sha256:"3031300d060960864801650304020105000420",
sha384:"3041300d060960864801650304020205000430",
sha512:"3051300d060960864801650304020305000440",
ripemd160: "3021300906052b2403020105000414"

2)pkcs1padding V1.5的填充模式   参考rfc2312

以下描述均以十六进制字符串来描述。

pkcs1padding V1.5的填充模式方式如下

EB = 00+BT+PS +00 + D

即:加密块=00+块类型+填充字符+00+数据

1. 开头00是为了确保块转换为整数的时候 小于模数

2. BT(Block Type):当使用私钥操作,块类型为00或01,公钥操作,块类型为02。块类型为00,数据开头必须不能是00,因为填充的也是00,将无法解析。块类型为01或02,块可以被准确解析,因为不会是00来填充。

3. PS(Padding String):k-3-||D|| 个字节组组成,k表示密钥的字节长度, D表示明文数据D的字节长度 。当BT为01时,填充字节值为FF,BT为00时,填充字节值为00,BT为02时填充随机数(非00)。填充长度至少为8个字节

4. 00,用于分开PS和D

5. D,数据原文(HEX)

注意:2048位的RSA密钥,加密块长度也必须是2048位,也就是256个字节。所以示例中的加密块需要填充202个FF才够256个字节。

故签名的时候,  加密的块 = 00+01+FF(202个) +00 + 3031300d060960864801650304020105000420b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9

三、测试题

最后抛了两个问题,看看大家有没有理解上面所介绍的。

1) RSA签名的时候 值是固定, 公钥加密的结果确实随机的,为什么?

2)分析如下代码,是否有问题?

本文来自 甜橙安全团队

公司简介:天翼电子商务有限公司(简称“甜橙金融”)是中国电信的全资子公司,2011年3月成立于北京,在上海、广州、西安设有分公司。翼支付是中国人民银行核准的第三方支付机构,是兼具金融、电信、互联网文化的跨界国家高新技术企业,依托“支付+通信+理财”的差异化商业模式、打造“甜橙金融”全新品牌,快速布局移动支付、理财、征信、消费金融等互联网金融业务。账户用户已突破1.5亿,现已成为国内移动支付领域5强、互联网金融领域16强,荣获“年度最佳雇主”、“最受程序员欢迎的IT互联网公司”、“最佳互联网理财APP门户”等荣誉。

非对称算法之RSA的签名剖析相关推荐

  1. 【密码算法 之零】对称算法(DES,、3DES、 AES、DM5、HMAC、CMAC、SHAxx、SM3、SM4),非对称算法(RSA、ECC、ECDSA、ECDH、SM2、SM9...)

      由于工作的需要,在过去的两年中学习.适配了很多算法,包括对称算法.非对称算法.国密算法.国际算法等.为了逼迫自己能够牢记并掌握这些算法的基本知识点,故本人写了一个关于算法的专栏(持续更新中...) ...

  2. 公钥和私钥的完全解释(包括对称算法和非对称算法、RSA解释)

    密钥分为两种:对称密钥与非对称密钥 对称密钥加密,又称私钥加密,即信息的发送方和接收方用一个密钥去加密和解密数据.它的最大优势是加/解密速度快,适合于对大数据量进行加密,但密钥管理困难. 非对称密钥加 ...

  3. 非对称算法之一RSA加密解密的java demo

    RSA加密算法,著名的非对称加密算法之一. 1,私钥加密,公钥解密例子(通常用在数字证书签名上). package rsa;import org.apache.commons.codec.binary ...

  4. Java 实现 RSA 非对称加密算法-加解密和签名验签

    1. 非对称加密算法简介 非对称加密算法又称现代加密算法,是计算机通信安全的基石,保证了加密数据不会被破解.与对称加密算法不同,非对称加密算法需要两个密钥:公开密钥(publickey)和私有密(pr ...

  5. 非对称加密之RSA算法

    非对称加密之RSA算法 1. RSA算法简述 2. 模型分析 3.代码实现 3.1 算法实现 3.2 测试代码 3.3 测试结果 4. 算法实现分析 5. 数据分段处理 该系列文章列表 1.网络及数据 ...

  6. 加密算法、散列算法、摘要、签名、证书、MD5、RSA、SSL通讯等等

    加密算法: 有对称加密和非对称加密.对称加密就是加密和解密时用的是同样的算法和密钥, 常见的对称加密算法有DES.3DES.Blowfish.IDEA.RC4.RC5.RC6和AES.而非对称加密是加 ...

  7. 叙述无保密机制的rsa签名过程_安全系列之——RSA的公钥私钥有多少人能分的清楚?RSA的签名验签与加密解密如何使用公私钥?...

    在对接很多的互联网公司的开发平台时,这些互联网公司未来自身平台的安全,都会需要调用方签名确认调用方的身份是合法的,同时未来信息网络传输的安全可能还需要加密解密.比如对接支付宝.微信开放平台时,需要配置 ...

  8. 公钥、私钥、数字签名、数字证书、对称与非对称算法、HTTPS

    2019独角兽企业重金招聘Python工程师标准>>> 对公钥和私钥有点稀里糊涂的,搜索了一些资料,作一些整理吧,先看这个: 加密--公钥 解密--私钥 签名--私钥 验证--公钥 ...

  9. 信息安全——对称算法与非对称算法

    信息化时代的飞速发展,给人们的生活带来了翻天覆地的变化.人们在享受网络数据便利交互的同时,也面临着一个重大的问题--信息安全.从开始的邮件沟通.QQ聊天,演变到现在的手机移动支付,保护个人信息与数据, ...

  10. 非对称加密下RSA在Java的简明教程

    引言 在现实世界中,每个人都有自己的密码.在各种系统中都有各类加密和解密的需求. 本文将详细介绍一下RSA的前身后世,应用场景和在Java中的实现,从理论到实践,一步到位,触手可用. 非对称加密与对称 ...

最新文章

  1. 谷歌员工论坛自述引程序员羡慕,只招募最优秀的人,薪资福利超棒
  2. mesh和wifi中继的区别_什么是MESH WIFI?通俗易懂告诉你为什么需要它
  3. jax-rs jax-ws_什么是JAX-RS注释? (第2部分)
  4. C# -- 多线程向同一文件写入
  5. 一文说清linux system load
  6. Pandas:删除行、列---DataFram.drop()
  7. 学习SQLAlchemy Core
  8. html 在线汉字转拼音,JavaScript实现汉字转换为拼音及缩写的方法示例
  9. 简述ip地址的abc类如何划分_IP地址ABC三类划分详细内容记录
  10. Winfrom 桌面弹窗拦截 关闭进程简易程序 源代码下载
  11. vue-cli脚手架和npm init vue@latest 区别
  12. 实用技巧----百度绘制函数图像
  13. windows10系统如何设置开机自启动
  14. __builtin_函数
  15. Velocity+IText+Flying-saucer生成pdf文件
  16. return() 与exit() 的区别
  17. 该如何搭建网校系统,需要哪些准备呢?
  18. 根据今天时星期几,输出当天工作安排,学校安排周一到周五学习编程,周六上机实验,周日休息 例如: 键盘上输入4,控制台输出学习编程
  19. jq获取页面中所有的a链接并执行下载功能
  20. RH358管理DHCP和IP地址分配--配置分配IPv6地址

热门文章

  1. 单个文件禁止 prettier 格式化
  2. u8g2库中文以及图片的显示入门
  3. 参与修谱工作,要具备哪些能力?光会修谱可不行
  4. 心理学和人工智能第一部分 心理学(四)—— 心理学的主要学派以及对人工智能的价值
  5. 2008年的各国卫星导航系统比较(北斗、伽利略、GLONASS、GPS)
  6. Html5中长线条怎么写,我的年终总结
  7. OLAP系统核心技术点,每一点都值得单独收藏
  8. android.intent.action大全和用法收集
  9. 2020-08-29---周总结
  10. 基于R语言结构方程模型