How to use the rsa key generted by .net with php?

本文介绍了一个使用PHP实现的RSA加密算法示例,该实现遵循GNU公共许可证,并验证了其与Java之间的互操作性。文中提供了详细的PHP代码实现,包括加密、解密、签名和验证等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

the Solution .infact it's so easy to use rsakey file generated by .net .

------------rsa.class.php-------------------

<?php
/*
*fileName rsa.class.php
*author: laiyunqing<laiyunqing#gmail.com>
 * Some constants
 
*/
define("BCCOMP_LARGER", 1);
class RSA
{
 
/*
  * PHP implementation of the RSA algorithm
  * (C) Copyright 2004 Edsko de Vries, Ireland
  *
  * Licensed under the GNU Public License (GPL)
  *
  * This implementation has been verified against [3]
  * (tested Java/PHP interoperability).
  *
  * References:
  * [1] "Applied Cryptography", Bruce Schneier, John Wiley & Sons, 1996
  * [2] "Prime Number Hide-and-Seek", Brian Raiter, Muppetlabs (online)
  * [3] "The Bouncy Castle Crypto Package", Legion of the Bouncy Castle,
  *      (open source cryptography library for Java, online)
  * [4] "PKCS #1: RSA Encryption Standard", RSA Laboratories Technical Note,
  *      version 1.5, revised November 1, 1993
  
*/

 
/*
  * Functions that are meant to be used by the user of this PHP module.
  *
  * Notes:
  * - $key and $modulus should be numbers in (decimal) string format
  * - $message is expected to be binary data
  * - $keylength should be a multiple of 8, and should be in bits
  * - For rsa_encrypt/rsa_sign, the length of $message should not exceed
  *   ($keylength / 8) - 11 (as mandated by [4]).
  * - rsa_encrypt and rsa_sign will automatically add padding to the message.
  *   For rsa_encrypt, this padding will consist of random values; for rsa_sign,
  *   padding will consist of the appropriate number of 0xFF values (see [4])
  * - rsa_decrypt and rsa_verify will automatically remove message padding.
  * - Blocks for decoding (rsa_decrypt, rsa_verify) should be exactly
  *   ($keylength / 8) bytes long.
  * - rsa_encrypt and rsa_verify expect a public key; rsa_decrypt and rsa_sign
  *   expect a private key.
  
*/

 
/**
  * rsa encrypt data
  *
  * @param binary string $message
  * @param unknown_type $public_key
  * @param numbers $modulus
  * @param numbers $keylength
  * @return binary data
  
*/
 
function rsa_encrypt($message, $public_key, $modulus, $keylength)
 {
  
$padded = RSA::add_PKCS1_padding($message, true, $keylength / 8);
  
$number = RSA::binary_to_number($padded);
  
$encrypted = RSA::pow_mod($number, $public_key, $modulus);
  
$result = RSA::number_to_binary($encrypted, $keylength / 8);

  
return $result;
 }

 
function rsa_decrypt($message, $private_key, $modulus, $keylength)
 {
  
$number = RSA::binary_to_number($message);
  
$decrypted = RSA::pow_mod($number, $private_key, $modulus);
  
$result = RSA::number_to_binary($decrypted, $keylength / 8);

  
return RSA::remove_PKCS1_padding($result, $keylength / 8);
 }

 
function rsa_sign($message, $private_key, $modulus, $keylength)
 {
  
$padded = RSA::add_PKCS1_padding($message, false, $keylength / 8);
  
$number = RSA::binary_to_number($padded);
  
$signed = RSA::pow_mod($number, $private_key, $modulus);
  
$result = RSA::number_to_binary($signed, $keylength / 8);

  
return $result;
 }

 
function rsa_verify($message, $public_key, $modulus, $keylength)
 {
  
return RSA::rsa_decrypt($message, $public_key, $modulus, $keylength);
 }

 
function rsa_kyp_verify($message, $public_key, $modulus, $keylength)
 {
  
$number = RSA::binary_to_number($message);
  
$decrypted = RSA::pow_mod($number, $public_key, $modulus);
  
$result = RSA::number_to_binary($decrypted, $keylength / 8);

  
return RSA::remove_KYP_padding($result, $keylength / 8);
 }


 
/*
  * The actual implementation.
  * Requires BCMath support in PHP (compile with --enable-bcmath)
  
*/

 
//--
 // Calculate (p ^ q) mod r
 //
 // We need some trickery to [2]:
 //   (a) Avoid calculating (p ^ q) before (p ^ q) mod r, because for typical RSA
 //       applications, (p ^ q) is going to be _WAY_ too large.
 //       (I mean, __WAY__ too large - won't fit in your computer's memory.)
 //   (b) Still be reasonably efficient.
 //
 // We assume p, q and r are all positive, and that r is non-zero.
 //
 // Note that the more simple algorithm of multiplying $p by itself $q times, and
 // applying "mod $r" at every step is also valid, but is O($q), whereas this
 // algorithm is O(log $q). Big difference.
 //
 // As far as I can see, the algorithm I use is optimal; there is no redundancy
 // in the calculation of the partial results.
 //--

 function pow_mod($p, $q, $r)
 {
  
// Extract powers of 2 from $q
  $factors = array();
  
$div = $q;
  
$power_of_two = 0;
  
while(bccomp($div, "0"== BCCOMP_LARGER)
  {
   
$rem = bcmod($div, 2);
   
$div = bcdiv($div, 2);

   
if($remarray_push($factors, $power_of_two);
   
$power_of_two++;
  }

  
// Calculate partial results for each factor, using each partial result as a
  // starting point for the next. This depends of the factors of two being
  // generated in increasing order.

  $partial_results = array();
  
$part_res = $p;
  
$idx = 0;
  
foreach($factors as $factor)
  {
   
while($idx < $factor)
   {
    
$part_res = bcpow($part_res, "2");
    
$part_res = bcmod($part_res, $r);

    
$idx++;
   }

   
array_push($partial_results, $part_res);
  }

  
// Calculate final result
  $result = "1";
  
foreach($partial_results as $part_res)
  {
   
$result = bcmul($result, $part_res);
   
$result = bcmod($result, $r);
  }

  
return $result;
 }

 
//--
 // Function to add padding to a decrypted string
 // We need to know if this is a private or a public key operation [4]
 //--

 function add_PKCS1_padding($data, $isPublicKey, $blocksize)
 {
  
$pad_length = $blocksize - 3 - strlen($data);

  
if($isPublicKey)
  {
   
$block_type = "";

   
$padding = "";
   
for($i = 0$i < $pad_length$i++)
   {
    
$rnd = mt_rand(1, 255);
    
$padding .= chr($rnd);
   }
  }
  
else
  {
   
$block_type = "";
   
$padding = str_repeat("ÿ", $pad_length);
  }

  
return "" . $block_type . $padding . "" . $data;
 }

 
//--
 // Remove padding from a decrypted string
 // See [4] for more details.
 //--

 function remove_PKCS1_padding($data, $blocksize)
 {
  
assert(strlen($data== $blocksize);
  
$data = substr($data, 1);

  
// We cannot deal with block type 0
  if($data{0== '')
  
die("Block type 0 not implemented.");

  
// Then the block type must be 1 or 2
  assert(($data{0== ""|| ($data{0== ""));
  
// Remove the padding
  $offset = strpos($data, "", 1);
  
return substr($data, $offset + 1);
 }

 
//--
 // Remove "kyp" padding
 // (Non standard)
 //--

 function remove_KYP_padding($data, $blocksize)
 {
  
assert(strlen($data== $blocksize);

  
$offset = strpos($data, "");
  
return substr($data, 0, $offset);
 }

 
//--
 // Convert binary data to a decimal number
 //--

 function binary_to_number($data)
 {
  
$base = "256";
  
$radix = "1";
  
$result = "0";

  
for($i = strlen($data- 1$i >= 0$i--)
  {
   
$digit = ord($data{$i});
   
$part_res = bcmul($digit, $radix);
   
$result = bcadd($result, $part_res);
   
$radix = bcmul($radix, $base);
  }

  
return $result;
 }

 
//--
 // Convert a number back into binary form
 //--

 function number_to_binary($number, $blocksize)
 {
  
$base = "256";
  
$result = "";

  
$div = $number;
  
while($div > 0)
  {
   
$mod = bcmod($div, $base);
   
$div = bcdiv($div, $base);

   
$result = chr($mod. $result;
  }

  
return str_pad($result, $blocksize, "", STR_PAD_LEFT);
 }
}
?>

-------------RSAProcessor.class.php------------------------


<?php
/**
*fileName RSAProcessor.class.php
*author: laiyunqing<laiyunqing#gmail.com>
*/
require_once("rsa.class.php");

class RSAProcessor
{
 
 
private $public_key = null;
 
 
private $private_key = null;
 
 
private $modulus = null;
 
 
private $key_length = "1024";
 
 
 
public function __construct($xmlRsakey=null,$type=null)
 {
         
$xmlObj = null;
 
   
if($xmlRsakey==null)
          {
           
$xmlObj = simplexml_load_file("xmlfile/RSAKey.xml");
          }
          
elseif($type==RSAKeyType::XMLFile)
          {
           
$xmlObj = simplexml_load_file($xmlRsakey);
          }
          
else
          {
           
$xmlObj = simplexml_load_string($xmlRsakey);
          }
         
$this->modulus = RSA::binary_to_number(base64_decode($xmlObj->Modulus));
   
$this->public_key = RSA::binary_to_number(base64_decode($xmlObj->Exponent));
   
$this->key_length = strlen(base64_decode($xmlObj->Modulus))*8;
 }
 
/**
  * get public key
  *
  * @return string public key
  
*/
 
public function getPublicKey()
 {
  
//return base64_encode(RSA::number_to_binary($this->public_key,($this->key_length)/8));
  return $this->public_key;
 }
 
public function getPrivateKey()
 {
  
//return base64_encode(RSA::number_to_binary($this->private_key,($this->key_length)/8));
  return $this->private_key;
 }
 
public function getKeyLength()
 {
  
return $this->key_length;
 }
 
public function getModulus()
 {
  
return $this->modulus;
 }
 
/**
  * encrypt data
  *
  * @param string $data
  * @return base64 encoded  binary string
  
*/
 
public function encrypt($data)
 {
  
return base64_encode(RSA::rsa_encrypt($data,$this->public_key,$this->modulus,$this->key_length));
 }
 
 
public function dencrypt($data)
 {
  
return RSA::rsa_decrypt($data,$this->private_key,$this->modulus,$this->key_length);
 }
 
 
public function sign($data)
 {
  
return RSA::rsa_sign($data,$this->private_key,$this->modulus,$this->key_length);
 }
 
 
public function verify($data)
 {
  
return RSA::rsa_verify($data,$this->public_key,$this->modulus,$this->key_length);
 }
}

class RSAKeyType
{
 
const XMLFile = 0;
 
const XMLString = 1;
}
?>

-------------- encrypt data with public key-----------------

<?php
/**
*fileName testrsa.php
*author: laiyunqing<laiyunqing#gmail.com>
*/
require_once("RSAProcessor.class.php");
$processor = new RSAProcessor

(
"<RSAKeyValue><Modulus>m6ljoeWhmnd0oRnsVEH5iNw3B8+vKVu7v7CVfMyf6bnKEzHa62TRmT/baJiSevoI/vgm2ph/s1JrQQTaGiErHicigwSC

Aw7+i05WFbnz7tOyiiJJVMfsdd+v7Xan9Hiud05FzxoMbM8vpiMHPEIDbGJ1MiXyupTVkz2WcMHyBoJ4S189opktZ43pviUhy0PeuWkyoU7zR54akPmK

Yg+z5Zr1r7K8lUZ1a3TThfJGxTQR/uZMtZz/q8QF0AANVQ/eyahTv9icBzBoDuncS0Y5l3vqogW1C/ltJvhJpvSn/OgjbRjuixCAptOUmRd13sDWU95/

x0bMq+Lg68lj2OjJ1Q==</Modulus><Exponent>AQAB</Exponent><P>zfvdBsMLlmo+4PAUYLgSV2xyyVa7ZqFjkJaAE4EbYuH24EoZjrzeiJR++D

FUT/GUhjfZ5eZ/5e29dXwk0sKUw6nHzBdBtOPp5fr4t5SKLEcWY+J+zLUSOlhG9NUkohFf6+Miy2Y7BLpXVrcl6UwXV0ak8KkTPB2l/aIMwYj5dgc=</

P><Q>wXV0sA3nDzoSDQA/4QSu/WIlBhkA3jZ7K7G9Z9rpP1A0vH+bZeyCIyo52u8ahGuYbubaizF1XMp+Xv3Mh2KmRbt7+UptwEwbFAUiiad2a312mqm

j7IJd7gRjGkyzKEm+6fpNeY3NFLNVNhccBqzhNkRoM22xnvQcImD10XVAakM=</Q><DP>wd1HdCLEWCfc0DYE59a2pINUMXyo2foRTDbpifHcRZ+ojAY

Rsc6+nsssCQnccXVMNVqBgSgEvfGYe+eAfMBX5SN5APPuioJrVGF2DsoFlZC+WPoGH0JYSoNlHO8yEDrMDaXzzH2GFHgQ1XOAged0nFbHzB1FFjJNVL5

cxRXWu6c=</DP><DQ>QDKuCk5SwubOXqoaiJ15RHRxPNjHRPZnYVSWOgSXKn9/QJ5H/0bA2NKGaHS4JAFgkEzjcRV0kNpRnUwztymxa6qPtWZRjWK0Ca

y6jVuZHIqB9UkeMLoCWZ3zFSMmwNPYGuUJGLFJwPjR6iU5E64C/nMs8QQR0WHIhFAQwvVZ7uk=</DQ><InverseQ>JckMSlJR10VZdnp83VPjrZ/Z+63

CGu3tWHm7f4DJ8IwjJWr8FlCpbSwiP6a4e9Upv6bUn/tOj2gY6MMq5G5yTKm2SCRvpUKRu4NCmWAt7vlFv0Z6pkXlTOpzvVjv3v16+dIZOA5Zn+v7+r1

xbdYdH20KRAbiBO3MfQP7s+VJJvM=</InverseQ><D>W1xrBr2hQOj1wgxWAgoK7IHbprEFrK+TnWmGA46SGPsbmHJ9fAVbY6fwHg7Wgmk4WHXLUCeLY

/Nu0eWIISfwh60Oe3ls2WC2k4qxyeSvQDBuLNb81U7WAUT9m9E1uK4QMCP3oxs1ybM80zTh7UMNgVK0WG+fbFUomVffcWTTqW+Fu12PEIO+UR/85oq+x

qVlTzYAEzt1OE9IhkYiRzi99ePXeH2gFltzJ/fb/7jLsDTkhM2eiYTGyOTZmBnen6c6a8b9LFTY4Bc0bGpk5ezHkub6F8p2ZgL/JgIOJMyRZICjDjs+9

k9PTmMTFsCF6xzHY15Fg25xIDYzIyx1rrRUjQ==</D></RSAKeyValue>
",RSAKeyType::XMLString);
$rs =  $processor->encrypt("Hello,It's Works.");
echo $rs;
?>

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值