拉宾密码系统功能

时间:2011-11-17 22:37:57

标签: php math cryptography

我正在尝试实施Rabin cryptosystem,而我却陷入了解密步骤。我需要解决:

  

Y p * p + Y p * q = 1

YpYq已知(已给定)时,

并计算pq

让我们以维基百科为例,p = 7q = 11;那我们就有了:
Yp * 7 + Yq * 11 = 1;

使用extented Euclidean algorithm我们应该得到结果:
Yp = -3Yq = 2;

这是来自Wiki的伪代码:

//pseudo code
function extended_gcd(a, b)
if b = 0
    return (1, 0)
else
    (q, r) := divide (a, b)
    (s, t) := extended_gcd(b, r)
    return (t, s - q * t)

这是我到目前为止所做的:

//q = 11; p = 7;
$arr = array(11, 7); //test  number from wiki; 
$result = extendedGcd($arr); //output array(0,1)
                             //but should be: array(-3, 2); (from wiki example)
...
//Legend: arr[0] = a; arr[1] = b;   
function extendedGcd($arr){
    if ($arr[1] == 0) return array(1, 0);
    else{
        //( (q, r) := divide (a, b) ) == ( q := a div b, r = a − b * q );
        $q = floor($arr[0] / $arr[1]); $r = $arr[0] - $arr[1] * $q;
        $tmp = extendedGcd($arr[1], $r); 
        $s = $tmp[0]; $t = $tmp[1];
        return array($t, $s - $q * $t);
    }
}

我不知道出了什么问题。如何计算Yp和Yq?


<小时/> 解决了。
如果有人在PHP中寻找它:
递归方法:

//thank to NullUserException ఠ_ఠ
function extendedGcd($arr){
 if ($arr[1] == 0) return array(1, 0);
 else{
    $q = floor($arr[0] / $arr[1]);
    $r = $arr[0] % $arr[1];
    $temp = extendedGcd(array($arr[1], $r));
    $s = $temp[0]; $t = $temp[1];
    return array($t, $s - $q * $t);
 }
}

非递归的。 (我知道它看起来很难看,但仍然有效。

function extendedGcd($a, $b){
 $x = 0;    $lastx = 1;
 $y = 1;    $lasty = 0;
 while ($b != 0){ //while b ≠ 0
    $quotient = floor($a / $b);
    $tempA = $a; $a = $b; $b = $tempA % $b;
    echo '<br />$a = '.$a.'; $b = '.$b;
    echo '<br />$quotient = '.$quotient;
    $tempX = $x;
    $x = $lastx - $quotient * $x;
    $lastx = $tempX;
    $tempY = $y;
    $y = $lasty - $quotient * $y;
    $lasty = $tempY;       
    echo '<br />$lastx = '.$lastx.'; $lasty = '.$lasty.'<hr />'; 
 }
 return array($lastx, $lasty);
}

1 个答案:

答案 0 :(得分:1)

你的问题是你这样调用extendedGcd()extendedGcd($arr[1], $r);,当它实际上只接受一个参数(一个数组)时。以下是我将如何重写该函数:

function extendedGcd($a, $b){
    if ($b == 0) 
        return array(1, 0);

    $q = floor($a / $b); 
    $r = $a % $b;        // PHP does have a modulus operator

    list($s, $t) = extendedGcd($b, $r); 
    return array($t, $s - $q * $t);
}

print_r(extendedGcd(11, 7));

为您提供the result expected


PS:在测试算法正确性的过程中,我使用了这个Python函数:

def extended_gcd(a, b):
    if b == 0:
       return (1, 0)

    else:
        (q, r) = (a/b, a%b)
        (s, t) = extended_gcd(b, r)
        return (t, s - q * t)

难以置信的美丽,不是吗?