如何从公钥获取模数和指数以进行签名验证?

时间:2015-11-16 12:02:37

标签: php rsa digital-signature gnupg pgp

我使用公钥对字符串test进行了签名。

我从公钥中获取了所有者名称,密钥ID和指纹以及公钥本身的信息。

现在我尝试验证签名。

我从137 ...

开始为v4签名获得正确的结构

http://senderek.ie/research/security/key-experiments.html

$signature="iQIcBAEBCAAGBQJWSZmTAAoJENJgM+p1pSbP7xoQAKStiaQlKrltTKGzfVVLw3nE
bKkEkb7Wn2wCIOUSov2ACvgDYtnUelt9K6iSY4OcpetVU0UQi1xKuLbZWgoXs6R6
0rGUBitp5zaHtwthMciUPW9LMjPx+lLtrDdJt/PGZXqBLVlWSITzJsI4PLZ1JL5j
xopZYSioK/Rji6WHDW6JaYuwPnbO5xH6trv5g03vE1GFUfAw+TpLGJYiUGkaRoD5
sLOR7R+digOJA4MDcnq5wTyf4tit+fG8HuqUUITyQ/fQ5R8zeN2sj8ZhIKLMXV5G
DOtV7L1iYQazL3orYXIABWxY80+j2+e265d9UGxthij6nxcEdf/uIRUxD3gZhvXV
SXziv0lTmKnSElK52oW+JPXbLhZ3qxhBf0zWBHtRAo3zKdS506UEQlyGK7HILvzh
4jLjsaLrcjbAxUiG4wdNjgGAaFnW0lSjUvFqeRE2UqLRMTRKdjZ3jFjo/xmTrhXV
+VkX7KWWf5cmUBycvdR6q+UvQi6ADx+nDXtOXHz6gQ3cLpsuUVf6GZXmoPpZV1nk
Uk5Cp0i8LlXFlQjdYjSbhAuipxXOdvdN3sCMuAXIWdfAfqbm2tYhV9/7qjrllx/M
Ecj2Tw27rpVCXuZe6dJfVnDZLqaWup7EgnAYo9/RGGPc+J5H9yiClc3ewOMDSElN
SnsNN+bQxBa9TNMzrD6w
=8Y2I";

$s =  base64_decode($signature);
$sa = str_split($s);
$subpacket_data=0;
$data='';
$subpacket_data_un=0;
        for($i = 0; $i < strlen($s);) {
        ord($sa[$i++]);

        if($i==3)$version=ord($sa[$i]);
        if($i==4)$sig_type=ord($sa[$i]);
        if($i==5)$key_alg=ord($sa[$i]);
        if($i==6)$hash_alg=ord($sa[$i]);
        if($i==7)$subpacket_data=ord($sa[$i])<<8;
        if($i==8)$subpacket_data+=ord($sa[$i]);
        if($i==8+$subpacket_data+1)$subpacket_data_un=ord($sa[$i])<<8;
        if($i==8+$subpacket_data+2)$subpacket_data_un+=ord($sa[$i]);
        if($i==8+$subpacket_data_un+1)$left_bit=ord($sa[$i])<<8;
        if($i==8+$subpacket_data_un+2)$left_bit_2=ord($sa[$i]);


}

$subpacket_data_raw=ord($sa[9])<<40;
$subpacket_data_raw.=ord($sa[10])<<32;
$subpacket_data_raw.=ord($sa[11])<<24;
$subpacket_data_raw.=ord($sa[12])<<16;
$subpacket_data_raw.=ord($sa[13])<<8;
$subpacket_data_raw.=ord($sa[14]);


$signing_string="test". $version . $sig_type . $key_alg. $hash_alg . $subpacket_data . $subpacket_data_raw);

但下一步是什么?我需要从签名算法的公钥中获取哪些值和哪些值?

http://tools.ietf.org/html/rfc4880#section-2.2
http://tools.ietf.org/html/rfc4880#section-5.2.3
http://tools.ietf.org/html/rfc4880#section-5.2.4

  

所有签名都是通过在签名上生成哈希来形成的   数据,然后在签名算法中使用结果哈希。

检测到的签名算法是RSA。

所以理论上我只需要一些RSA函数的输入参数?但他们在哪里储存?

代码只是一个例子,我只是用它进行测试,我知道我可以而且应该改变一些行。

我有这些公钥包:

0) int(153) = Tag
1) int(2) = H Length
2) int(13) = L Length
3) int(4) = Version
4) int(85) = Creation Time (<<24) +
5) int(12) = Creation Time (<<16) +
6) int(54)  = Creation Time (<<8) +
7) int(60)  = Creation Time
8) int(1) = PK algorithm
9) int(16) = MPI Modulus n (<<8?)
10) int(0) = MPI Modulus n

这是对的吗?我与下一个数据包有什么关系? MPI模数n需要多少个数据包?

  

Multi-Precision-Integer是一个非常长的数字,长度为   存储在前两个字节中的位后跟所有位   整个数字。

0 个答案:

没有答案