短信所发送的字节有限,一般为140字节左右,若对短信进行签名,会导致短信利用率降低,故短信签名的过程中,签名的长度很关键,ECDSA 签名方式的在长度适中(根据加密算法位数不同而不同)的情况下,提供了很好的安全保障。另外手机短信一般不需要进行加密,因为手机一般处于移动状态,其网络变化,比较大,攻击者要截取并分析比较困难。
手机短信安全防护重点放在:防止被人修改
ECDSA常用签名算法
- ECDsaP256, 其公钥长度 72 Bytes,
- ECDsaP384,其公钥长度 104 Bytes,
- ECDsaP521 ,其公钥长度 140 Bytes,
其中公钥最前面的8个字节是 附加字节。附加加字节的前4字节表示 “ECS1”、“ECS3”、“ECS5” 三种类型,后4字节表示公钥长度。例如256位的 ECDsaP256 算法,前面8个字节是 0x45, 0x43, 0x53, 0x31, 0x20, 0x00, 0x00, 0x00 ,前面4个字节 0x45,0x43,0x53,0x31 表示 “ECS1” ,后面4个字节 0x20,0x00,0x00,0x00 表示公钥是256位。
ECDsaP256签名
签名组成
对于ECDsaP256算法,其签名结果其实就是两个很大的整数r(random)和签名s(signature),由于普通的数据类型不够,所以就用数组来表示,r和s都是32个字节的长度,总共是64个字节。
签名方法
一般ECDsaP256签名算法库都会提供两种签名方法:
- 普通格式:就是两个32位整数组成的64字节串
- ASN1格式:由ASN1编码而成的包含两个32位整数的70/71/72字节串
ASN1编码格式说明
ASN1将签名产生的 r 和 s 看作两个整数,若其第一个字节最高位为 1,则在整数前插入0x00。
以下是一个ECDsaP256算法签名结果:
byte[] signForIos = new byte[]{0x30,0x45,0x02,0x20,0x6C,0x80,0x22,0xE4,0xA5,0x89,0x8A,0x81,0xE9,0x82,0x0C,0x13,
0xC6,0xE7,0x09,0x95,0xC9,0x1C,0x4F,0x00,0x32,0x13,0x59,0xB2,0x2D,0xD3,0xEF,0xE4,
0x9D,0xDD,0x3B,0xAD,0x02,0x21,0x00,0xF0,0x84,0x9E,0x2E,0xB6,0x01,0x3B,0x2A,0x81,
0xB0,0x36,0x83,0x51,0x7F,0x20,0x56,0xD7,0xFB,0xD6,0x9B,0x76,0x38,0x39,0xF8,0xD2,
0x89,0xED,0x32,0x24,0x0D,0xA1,0x25};
其中:
第1字节:0x30表示一种通用的格式
第2字节:0x45表示后面跟了69个字节的数据
第3字节:0x02表示后面是一个整数
第4字节:0x20表示整数长度是32个字节
第35字节:0x02表示后面是个整数
第36字节:0x21表示整数长度是33个字节
第37字节:0x00需要忽略掉,这个是由于ASN1编码产生的,
参考文档:使用C#验证IOS9产生的ECDSA签名
版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)