RSA签名密钥长度异常长

时间:2014-09-28 08:09:57

标签: php encryption rsa

我目前正在维护支付宝网址生成库,此代码段中有一些有趣的事情(除了大量混淆的命名方案和功能放置)。

我有一个构建URL(使用create_linkstring())+其RSA签名(sign())对应的函数:

function build_mysign($sort_array,$key,$sign_type) {
    $prestr = create_linkstring($sort_array);
    $prestr = $prestr.$key;
    $mysgin = sign($prestr,$sign_type);
    return $mysgin;
}

这是我的create_linkstring()方法:

function create_linkstring($array) {
    $arg  = "";
    while (list ($key, $val) = each ($array)) {
        $arg.=$key."=".$val."&";
    }
    $arg = substr($arg,0,count($arg)-2);
    return $arg;
}

这是我的sign()功能:

function sign($prestr){
    $fprivate = fopen(dirname(__FILE__) . '/rsa_private_key.pem', 'r');
    $priv_key = fread($fprivate, 123456);
    fclose($fprivate);

    $privatekeyid = openssl_get_privatekey($priv_key);

    // Compute signature
    openssl_sign($prestr, $signMsg, $privatekeyid, OPENSSL_ALGO_SHA1);

    // Free the key from memory
    openssl_free_key($privatekeyid);

    $signMsg = base64_encode($signMsg);

    return $signMsg;
}

它基本上需要一组键和值,并生成一个URL,然后使用sign()方法对其进行签名。

这个库实际上有两种签名机制 - MD5和RSA。我编写了RSA签名函数,因为它默认不受支持。查看使用MD5签名的输出URL,sign=是一个32字符串字符串,因此它看起来像sign=779d70d2b4d9b50cad3a4ce144726e9f

但是,使用我的RSA签名功能,输出是一个172字符串!输入如下所示:

  

&安培;签= WiYQIl0x + Vkey3SciP03HDv / 7IZKoq2 + OcvsSlQJb3NMElG6JawRc5b98ddJOOYjt9YK2YypwlFWgizj0b5wk + ​​HNJB5lSYq7rDCcDGG0m0cKbW / m9P23J8gQaR1x6RovEDaWhs5zv4YTFe83hmPaf4Q / eVa2CpiixjpHd3kjybg =

如果我没错,RSA签名的字符串应该是128个字符长。我不太清楚为什么会这样。如果我用无关的字符串附加它,我不是100%,而且我注意到所有RSA签名的密钥都以=结尾,这肯定是不对的。

1 个答案:

答案 0 :(得分:1)

我猜你是在混淆RSA签名的字节长度和签名的base64编码的字符串长度。

如果您使用的是1024位RSA密钥(位短,顺便说一句),则签名的字节长度应为128字节长。字节可以是任何值,包括0和其他不能用UTF-8或ASCII打印的字符(以及更多不适合在URL等中使用的字符)。因此,您的代码会对base64中的字节进行编码。 172个字符的大小(包括填充=)恰到好处:128bytes / 1024bits

$ echo WiYQIl0x+Vkey3SciP03HDv/7IZKoq2+OcvsSlQJb3NMElG6JawRc5b98ddJOOYjt9YK2YypwlFWgizj0b5wk+HNJB5lSYq7rDCcDGG0m0cKbW/m9P23J8gQaR1x6RovEDaWhs5zv4YTFe83hmPaf4Q/eVa2CpiixjpHd3kjybg= \
| base64 --decode | hexdump -C
00000000  5a 26 10 22 5d 31 f9 59  1e cb 74 9c 88 fd 37 1c  |Z&."]1.Y..t...7.|
00000010  3b ff ec 86 4a a2 ad be  39 cb ec 4a 54 09 6f 73  |;...J...9..JT.os|
00000020  4c 12 51 ba 25 ac 11 73  96 fd f1 d7 49 38 e6 23  |L.Q.%..s....I8.#|
00000030  b7 d6 0a d9 8c a9 c2 51  56 82 2c e3 d1 be 70 93  |.......QV.,...p.|
00000040  e1 cd 24 1e 65 49 8a bb  ac 30 9c 0c 61 b4 9b 47  |..$.eI...0..a..G|
00000050  0a 6d 6f e6 f4 fd b7 27  c8 10 69 1d 71 e9 1a 2f  |.mo....'..i.q../|
00000060  10 36 96 86 ce 73 bf 86  13 15 ef 37 86 63 da 7f  |.6...s.....7.c..|
00000070  84 3f 79 56 b6 0a 98 a2  c6 3a 47 77 79 23 c9 b8  |.?yV.....:Gwy#..|
00000080