在PHP中使用RSAencryption和解密文本

有什么PHP 5.3的类,将提供文本encryption/解密与RSA没有填充?

我有私钥和公钥,p,q和模数。

您可以使用phpseclib,一个纯粹的PHP RSA实现 :

<?php include('Crypt/RSA.php'); $privatekey = file_get_contents('private.key'); $rsa = new Crypt_RSA(); $rsa->loadKey($privatekey); $plaintext = new Math_BigInteger('aaaaaa'); echo $rsa->_exponentiate($plaintext)->toBytes(); ?> 
 class MyEncryption { public $pubkey = '...public key here...'; public $privkey = '...private key here...'; public function encrypt($data) { if (openssl_public_encrypt($data, $encrypted, $this->pubkey)) $data = base64_encode($encrypted); else throw new Exception('Unable to encrypt data. Perhaps it is bigger than the key size?'); return $data; } public function decrypt($data) { if (openssl_private_decrypt(base64_decode($data), $decrypted, $this->privkey)) $data = $decrypted; else $data = ''; return $data; } } 

2017年(或以后)没有写入有意join严格密码学的申请,应该再使用RSA。 PHP公钥encryption有更好的select 。

人们决定使用RSA进行encryption时,会犯两大错误:

  1. 开发人员select错误的填充模式 。
  2. 由于RSA本身不能encryption很长的string,因此开发人员通常会将string分解为小块并独立encryption每个块。 有点像ECB模式 。

最好的select: sodium_crypto_box_seal() (libsodium)

 $keypair = sodium_crypto_box_keypair(); $publicKey = sodium_crypto_box_publickey($keypair); // ... $encrypted = sodium_crypto_box_seal( $plaintextMessage, $publicKey ); // ... $decrypted = sodium_crypto_box_seal_open( $encrypted, $keypair ); 

简单而安全。 Libsodium将在PHP 7.2中提供,或者通过PECL为早期版本的PHP提供。 如果你需要一个纯PHP的polyfill ,得到paragonie / sodium_compat

勉强:正确使用RSA

在2017年使用RSA的唯一原因是“我禁止安装PECL扩展,因此不能使用libsodium ,并且出于某种原因也不能使用paragonie / sodium_compat ”。

你的协议应该是这样的:

  1. 生成一个随机的AES密钥。
  2. 用AES密钥encryption明文信息,使用AEADencryption模式,否则,CBC再加HMAC-SHA256。
  3. 使用RSA公钥对RSAES-OAEP + MGF1-SHA256encryptionAES密钥(步骤1)
  4. 连接RSAencryption的AES密钥(步骤3)和AESencryption的消息(步骤2)。

不要自己实施这个,请查看EasyRSA 。

是。 看看http://jerrywickey.com/test/testJerrysLibrary.php

它给出了PHP中RSAencryption和解密的示例代码示例以及javascript中的RSAencryption。

如果你想encryption文本,而不是只有10个数字,你还需要基地转换。 这是将文本转换为一个非常大的数字。 文本实际上只是写在基础63. 26小写字母加26大写+ 10数字+空格字符。 这个代码也在下面。

$ GETn参数是保存encryption函数的密钥的文件名。 如果你不明白,问。 我会帮忙的。

我昨天实际上发布了这个encryption库,但Brad Larson是一个mod,杀死了它,并且说这种东西并不是真正的Stack Overflow。 但是您仍然可以在上面的链接中find所有的代码示例和整个函数库来为AJAX执行客户端/服务器encryption解密。

 function RSAencrypt( $num, $GETn){ if ( file_exists( 'temp/bigprimes'.hash( 'sha256', $GETn).'.php')){ $t= explode( '>,', file_get_contents('temp/bigprimes'.hash( 'sha256', $GETn).'.php')); return JL_powmod( $num, $t[4], $t[10]); }else{ return false; } } function RSAdecrypt( $num, $GETn){ if ( file_exists( 'temp/bigprimes'.hash( 'sha256', $GETn).'.php')){ $t= explode( '>,', file_get_contents('temp/bigprimes'.hash( 'sha256', $GETn).'.php')); return JL_powmod( $num, $t[8], $t[10]); }else{ return false; } } function JL_powmod( $num, $pow, $mod) { if ( function_exists('bcpowmod')) { return bcpowmod( $num, $pow, $mod); } $result= '1'; do { if ( !bccomp( bcmod( $pow, '2'), '1')) { $result = bcmod( bcmul( $result, $num), $mod); } $num = bcmod( bcpow( $num, '2'), $mod); $pow = bcdiv( $pow, '2'); } while ( bccomp( $pow, '0')); return $result; } function baseToBase ($message, $fromBase, $toBase){ $from= strlen( $fromBase); $b[$from]= $fromBase; $to= strlen( $toBase); $b[$to]= $toBase; $result= substr( $b[$to], 0, 1); $f= substr( $b[$to], 1, 1); $tf= digit( $from, $b[$to]); for ($i=strlen($message)-1; $i>=0; $i--){ $result= badd( $result, bmul( digit( strpos( $b[$from], substr( $message, $i, 1)), $b[$to]), $f, $b[$to]), $b[$to]); $f= bmul($f, $tf, $b[$to]); } return $result; } function digit( $from, $bto){ $to= strlen( $bto); $b[$to]= $bto; $t[0]= intval( $from); $i= 0; while ( $t[$i] >= intval( $to)){ if ( !isset( $t[$i+1])){ $t[$i+1]= 0; } while ( $t[$i] >= intval( $to)){ $t[$i]= $t[$i] - intval( $to); $t[$i+1]++; } $i++; } $res= ''; for ( $i=count( $t)-1; $i>=0; $i--){ $res.= substr( $b[$to], $t[$i], 1); } return $res; } function badd( $n1, $n2, $nbase){ $base= strlen( $nbase); $b[$base]= $nbase; while ( strlen( $n1) < strlen( $n2)){ $n1= substr( $b[$base], 0, 1) . $n1; } while ( strlen( $n1) > strlen( $n2)){ $n2= substr( $b[$base], 0, 1) . $n2; } $n1= substr( $b[$base], 0, 1) . $n1; $n2= substr( $b[$base], 0, 1) . $n2; $m1= array(); for ( $i=0; $i<strlen( $n1); $i++){ $m1[$i]= strpos( $b[$base], substr( $n1, (strlen( $n1)-$i-1), 1)); } $res= array(); $m2= array(); for ($i=0; $i<strlen( $n1); $i++){ $m2[$i]= strpos( $b[$base], substr( $n2, (strlen( $n1)-$i-1), 1)); $res[$i]= 0; } for ($i=0; $i<strlen( $n1) ; $i++){ $res[$i]= $m1[$i] + $m2[$i] + $res[$i]; if ($res[$i] >= $base){ $res[$i]= $res[$i] - $base; $res[$i+1]++; } } $o= ''; for ($i=0; $i<strlen( $n1); $i++){ $o= substr( $b[$base], $res[$i], 1).$o; } $t= false; $o= ''; for ($i=strlen( $n1)-1; $i>=0; $i--){ if ($res[$i] > 0 || $t){ $o.= substr( $b[$base], $res[$i], 1); $t= true; } } return $o; } function bmul( $n1, $n2, $nbase){ $base= strlen( $nbase); $b[$base]= $nbase; $m1= array(); for ($i=0; $i<strlen( $n1); $i++){ $m1[$i]= strpos( $b[$base], substr($n1, (strlen( $n1)-$i-1), 1)); } $m2= array(); for ($i=0; $i<strlen( $n2); $i++){ $m2[$i]= strpos( $b[$base], substr($n2, (strlen( $n2)-$i-1), 1)); } $res= array(); for ($i=0; $i<strlen( $n1)+strlen( $n2)+2; $i++){ $res[$i]= 0; } for ($i=0; $i<strlen( $n1) ; $i++){ for ($j=0; $j<strlen( $n2) ; $j++){ $res[$i+$j]= ($m1[$i] * $m2[$j]) + $res[$i+$j]; while ( $res[$i+$j] >= $base){ $res[$i+$j]= $res[$i+$j] - $base; $res[$i+$j+1]++; } } } $t= false; $o= ''; for ($i=count( $res)-1; $i>=0; $i--){ if ($res[$i]>0 || $t){ $o.= substr( $b[$base], $res[$i], 1); $t= true; } } return $o; }