简单的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]
附件: 您所在的用户组无法下载或查看附件