0

我正在phpseclib使用RSA加密http://phpseclib.sourceforge.net/

这是我的 php 代码:

include('Math/BigInteger.php');
include('Crypt/RSA.php');


$message="123456";
$private_modulus = "272435F22706FA96DE26E980D22DFF67";
$private_exponent = "158753FF2AF4D1E5BBAB574D5AE6B54D";

$rsa = new Crypt_RSA();

$message = new Math_BigInteger(base64_decode($message), 256);
$private_modulus = new Math_BigInteger(base64_decode($private_modulus), 256);
$private_exponent = new Math_BigInteger(base64_decode($private_exponent), 256);


$rsa->loadKey(array('n' => $private_modulus, 'e' => $private_exponent));
$encryptedText=$rsa->encrypt($message);
echo  $encryptedText;

然而,encryptedText是空白的。有什么帮助吗?

4

2 回答 2

0

如果未明确定义加密模式,则默认为 OAEP。OAEP 要求密钥至少为 2 * 散列大小 + 2。phpseclib 使用的默认散列是 sha1,长度为 20 字节。所以密钥至少需要 22 字节长或 176 位。

你的是 16 字节长或 128 位。

因此,您要么需要使用更大的密钥,要么将加密模式更改为使用 PKCS1 填充。PKCS1 填充要求模数至少为 11 个字节。

如果 phpseclib 在所选模数的长度不足时显示错误,这可能会很有用。我会尽量向他建议。

此外,FWIW,教科书 RSA 没有规定任何最小长度要求,但 phpseclib 目前没有实现教科书 RSA。我想你可以通过直接调用 _exponentiate 来获得它,但这是唯一的方法。

教科书 RSA 很糟糕,因为它容易受到诸如 PKCS1 / OAEP 之类的随机填充所防止的某些类型的攻击。

于 2013-08-16T16:16:16.670 回答
0

您对公钥/私钥有一些问题。从函数$rsa->loadKey()注释看,第一个参数是字符串,但是你分配了一些奇怪的数组......

/**
 * Loads a public or private key
 *
 * Returns true on success and false on failure (ie. an incorrect password was provided or the key was malformed)
 *
 * @access public
 * @param String $key
 * @param Integer $type optional
 */
function loadKey($key, $type = false)

使用随机公钥/私钥进行加密/解密的示例:

include('_seclib/Math/BigInteger.php');
include('_seclib/Crypt/RSA.php');

$rsa = new Crypt_RSA();
extract($rsa->createKey());

# encrypt
$message = '123456';
$rsa->loadKey($publickey);
$ciphertext = $rsa->encrypt($message);
var_dump($ciphertext);

# decrypt
$rsa->loadKey($privatekey);
var_dump($rsa->decrypt($ciphertext));

有关更多信息,请参阅文档

于 2013-08-16T10:34:33.880 回答