发新话题
打印

简单的PHP的RSA源码,经测试能正常运行。

简单的PHP的RSA源码,经测试能正常运行。

在网上找了多个PHP的RSA源码,不知什么原因,都不能使用,于是自己写了个简单的PHP的RSA源码,经调试成功,能正常加解密,特发出来,不知与别的RSA加密源码比较速度是快还是慢,RSA最恼人的就是速度不够快。源码如下:

<?php

//十进制转字符串
function BIntDecToStr($A)
{
  while ($A>0)
  {
    $Result=Chr(bcmod($A, 256)).$Result;
    $A=bcdiv($A, 256);
  }
  return $Result;
}

//字符串转十进制
function BIntStrToDec($A)
{
  for ($i=0; $i<StrLen($A); $i++)
  {
    $T="1";
    for ($j=$i+1; $j<StrLen($A); $j++) $T=bcmul($T, "256");
    $Result=bcadd($Result, bcmul(Ord($A[$i]), $T));
  }
  return $Result;
}

//十进制转十六进制
function BIntDecToHex($A)
{
  while ($A>0)
  {
    $Result=base_convert( bcmod($A, 16), 10, 16 ).$Result;
    $A=bcdiv($A, 16);
  }
  return $Result;
}

//十六进制转十进制
function BIntHexToDec($A)
{
  for ($i=0; $i<StrLen($A); $i++)
  {
    $T="1";
    for ($j=$i+1; $j<StrLen($A); $j++) $T=bcmul($T, "16");
    $Result=bcadd($Result, bcmul(base_convert($A[$i], 16, 10), $T));
  }
  return $Result;
}

//十进制转三十二进制
function BIntDecToBase32($A)
{
  while ($A>0)
  {
    $Result=base_convert( bcmod($A, 32), 10, 32 ).$Result;
    $A=bcdiv($A, 32);
  }
  return $Result;
}

//三十二进制转十进制
function BIntBase32ToDec($A)
{
  for ($i=0; $i<StrLen($A); $i++)
  {
    $T="1";
    for ($j=$i+1; $j<StrLen($A); $j++) $T=bcmul($T, "32");
    $Result=bcadd($Result, bcmul(base_convert($A[$i], 32, 10), $T));
  }
  return $Result;
}

//十进制转六十四进制
function BIntDecToBase64($A)
{
  return base64_encode( BIntDecToStr($A) );
}

//六十四进制转十进制
function BIntBase64ToDec($A)
{
  return BIntStrToDec( base64_decode($A) );
}

//十进制转二进制
function BIntDecToBin($A)
{
  while ($A>0)
  {
    $Result=bcmod($A, 2).$Result;
    $A=bcdiv($A, 2);
  }
  return $Result;
}

//十六进制转二进制
function BIntHexToBin($A)
{
  $Result="";
  $Len=StrLen($A);
  for ($i=0; $i<$Len; $i++)
  {
    $T=base_convert($A[$i], 16, 2);
    if ($i>0)
    {
      $n=StrLen($T);
      if ($n==1) $T="000".$T;
      elseif ($n==2) $T="00".$T;
      elseif ($n==3) $T="0".$T;
    }
    $Result=$Result.$T;
  }
  return $Result;
}

//六十四进制转二进制
function BIntBase64ToBin($A)
{
  return BIntDecToBin( BIntBase64ToDec($A) );
}

//加密解密都用此函数 ($X,$N为十进制字符串, $E为二进制字符串.)
function RSA($X, $E, $N)
{
  $Result='1';
  for ($i=StrLen($E)-1; $i>=0; $i--)
  {
    if ($E[$i]=='1') $Result=bcmod(bcmul($Result, $X), $N);
    $X=bcmod(bcmul($X, $X), $N);
  }
  return $Result;
}

//Tese256Bits
function Test256Bits()
{
  $PublicKey ="79451";  //十进制字符串
  $PrivateKey="52646957920621651098365933570061604776739153687055641877341901693015168327923";  //十进制字符串
  $Modulus   ="58024268307503479100769500999819173248689182936484215289637368994338961188521";  //十进制字符串

  $X="1234567890";
  echo "Source Text: ";
  echo $X;
  echo "<br>";

  $y=RSA($X, BIntDecToBin($PrivateKey), $Modulus);
  echo "Encrypt Text: ";
  echo $y;
  echo "<br>";

  echo "Decrypt Text: ";
  echo RSA($y, BIntDecToBin($PublicKey), $Modulus);
  echo "<br>";
}

//Tese512Bits
function Test512Bits()
{
  $PublicKey ="1458B";  //十六进制字符串
  $PrivateKey="29E1C5750FB47AF66A560D2A57D3489068681089FD2B7C09F9DFF2E76E52BD4A0714E507EAC55D79EA1C7EDED9E2BA5B5ADFF0E152F2F6E531D4D474CC8A1E77";  //十六进制字符串
  $Modulus   ="8BDE1E77428087829BD0CE2733DDAF0ED552A076EE0615885CB2012D3767C6ECDEBBBF7FD3799F2551F711A7A7CFA55B183B7AF43EA179B900FE4003CC10F961";  //十六进制字符串

  $X="1234567890";
  echo "Source Text: ";
  echo $X;
  echo "<br>";

  $y=RSA($X, BIntHexToBin($PrivateKey), BIntHexToDec($Modulus));
  echo "Encrypt Text: ";
  echo $y;
  echo "<br>";

  echo "Decrypt Text: ";
  echo RSA($y, BIntHexToBin($PublicKey), BIntHexToDec($Modulus));
  echo "<br>";
}

//Tese1024Bits
function Test1024Bits()
{
  $PublicKey ="00014E5D";  //十六进制数
  $PrivateKey="77DBDAFA1823591F9E74517D351B65CCDAB4248EEFDE4459C866775B3954119C1E8D21396AC8EC7F161FBB28D8278A08A8811B12C5B06F4824B573A5A73EC5EC39F285ABA748A8F493249D77EB02518D38CE1DC046DE8AF58186D12F58276215074DD4A5ABC9176CFE26C55CBA20CB0ABFCB337C75026F5C873DC613C0A8ADED";  //十六进制数
  $Modulus   ="85421E49B2E67E5612359892896673D3053DF1A2803BB204FCE7EC3784E3BD018A9B9C4444B401A960B3C483C7B83816E149C585BDD9B066159EBE479B81E97D04C650F0699B024B3F39D56B40BA6CCBB026D0FC1F88C1A1E6DC6A2FDB3C530F169B79FF355DE10D909FF3DAE55E5BBDF65C0DD1D961B1CF765D774940CA8031";  //十六进制数

  $X="1234567890";
  echo "Source Text: ";
  echo $X;
  echo "<br>";

  $y=RSA($X, BIntHexToBin($PrivateKey), BIntHexToDec($Modulus));
  echo "Encrypt Text: ";
  echo $y;
  echo "<br>";

  echo "Decrypt Text: ";
  echo RSA($y, BIntHexToBin($PublicKey), BIntHexToDec($Modulus));
  echo "<br>";
}

//Test2048Bits
function Test2048Bits()
{
  $PublicKey ="00014E5D";  //十六进制数
  $PrivateKey="BNsvQfVLpQJxn1FBMdZW7uO8cJJ3pT1swSiEBxputGHjCwEfc664WIH+dnCfOYe04zwjoIAP5UkAXMyKclVibwV7bGAdlxdDDtRzPhbRPm69hxwz+8NaV4ABFNoXbYcrYRdPygYYH+fTV+i6xlPa2parDCHGLFdf6JCYa7cByuTGzJ07OKKbsDgS5vtosgc07e6u9MH/SyvzR01RSzPcsdpezlkydWEIqBdEBn2K4xa+JDY+Q73T1J7FUa/RHpBNyjBQdCvISYwRUrbsS6m0cRWxhxt45q70q7xj6+F5sldqqVQ6IJxPl01iVznpmm/I2HmM4A9S8oRkIKMJvShlbQ";  //六十四进制数
  $Modulus   ="gk5EZDucT0xovPtPvuWKSvJnjMJP2olTV45c3mFY4ezh+SK0MQgarc2zRxlpXIaGRjhxV4Ek/TwG6wU2C8qrOUH3wL56Ibl0a6lzyqjKWZKongEMd65KobBNz5488Xxx6RpyuT8NWl3PPs1hUAvghGmaFC5KYUW6SI7MJoMdj8AFNnepHEi1wfncss77QdwXfMqa4Zva8FUQ0r0YI1VetaPYRlX+I7PfgDZH35/95tL9V/WhZmGej+pn159N6kNni6S5qwlSRHB35k040Y/M9mVdsFcf1E3iaUndsBdJdT6x1uEvDuOR+8obSVoOS6gJGdaIyhc/J4oPAkKdc818GQ";  //六十四进制数

  $X="1234567890";
  echo "Source Text: ";
  echo $X;
  echo "<br>";

  $y=RSA($X, BIntBase64ToBin($PrivateKey), BIntBase64ToDec($Modulus));
  echo "Encrypt Text: ";
  echo $y;
  echo "<br>";

  echo "Decrypt Text: ";
  echo RSA($y, BIntHexToBin($PublicKey), BIntBase64ToDec($Modulus));
  echo "<br>";
}


  $t=time();
  Test256Bits();
  echo time()-$t;       //0 second
  echo ": Second<br>";
  echo "<br>";

  $t=time();
  Test512Bits();        //1 second
  echo time()-$t;
  echo ": Second<br>";
  echo "<br>";

  //$t=time();
  //Test1024Bits();
  //echo time()-$t;     //6 second
  //echo ": Second<br>";
  //echo "<br>";

  //$t=time();
  //Test2048Bits();
  //echo time()-$t;     //40 second
  //echo ": Second<br>";
  //echo "<br>";

?>

至于公钥、私钥、模数,请用“RSATool2v17.exe”这个工具程序自己选择。
[attach]728[/attach]
附件: 您所在的用户组无法下载或查看附件

TOP

多谢分享

不错啊,感谢。
我必安然躺下睡觉,因为独有你耶和华使我安然居住。
I will both lay me down in peace, and sleep: for thou, LORD, only makest me dwell in safety.

TOP

发新话题