Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/253.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的RSA加密,PHP中的解密_Java_Php_Android_Rsa_Phpseclib - Fatal编程技术网

Java中的RSA加密,PHP中的解密

Java中的RSA加密,PHP中的解密,java,php,android,rsa,phpseclib,Java,Php,Android,Rsa,Phpseclib,我正在尝试在Android应用程序中使用RSA公钥加密AES密钥,然后在服务器上使用PHP和phpseclib解密AES密钥。我已经通过对静态文本进行加密,然后对其进行解密,以检查我是否仍然获得原始文本,从而确保RSA加密/解密在这两个平台上都能工作。根据测试,RSA代码在每个平台上单独工作,但平台之间似乎存在差异 在Java中,我使用的是Bouncy Castle库,代码如下: RSAPublicKeySpec pubKeySpec = new RSAPublicKeySpec( new Bi

我正在尝试在Android应用程序中使用RSA公钥加密AES密钥,然后在服务器上使用PHP和phpseclib解密AES密钥。我已经通过对静态文本进行加密,然后对其进行解密,以检查我是否仍然获得原始文本,从而确保RSA加密/解密在这两个平台上都能工作。根据测试,RSA代码在每个平台上单独工作,但平台之间似乎存在差异

在Java中,我使用的是Bouncy Castle库,代码如下:

RSAPublicKeySpec pubKeySpec = new RSAPublicKeySpec(
new BigInteger("00c897f9e401819e223ffbecc6f715a8d84dce9022762e0e2d54fa434787fcaf230d28bd0c3b6b39b5211f74ffc4871c421362ccfc07ae98b88fa9728f1e26b8210ebbf4981e45867fe810938294d0095d341b646b86dcbd4c246676c203cb1584d01eef0635299714d94fa12933ecd35e6c412573156d9e6e549b7804eb6e165660507d8748bcc8c60da10099bacb94d3f7b50b1883ee108489e0dd97ed7d28e564edd4ee5d6b4225f5c23cdaaf495c3fa08c3b82e1674946e4fa1e79b2493204d6953c261105ba5d0f8dcf3fcd39a51fbc18a5f58ffff169b1bed7ceeded2ae0e8e8e2238e8b77b324d1a482593b1a642e688c860e90d5a3de8515caf384133b", 16),
new BigInteger("11", 16));
keyFactory = KeyFactory.getInstance("RSA", "BC");
//RSAPublicKeySpec rsaKeySpec = new RSAPublicKeySpec(rsaKey.MODULUS, new BigInteger("11", 16));
RSAPublicKey pubKey = (RSAPublicKey)keyFactory.generatePublic(pubKeySpec);  

//Set up the cipher to RSA encryption
Cipher cipher = Cipher.getInstance("RSA/None/PKCS1Padding", "BC");
cipher.init(Cipher.ENCRYPT_MODE, pubKey);

// make sure the Aes Key is less than a block size
// otherwise major errors will occur
if(AesKey.length * 8 > pubKey.getModulus().bitLength())
    return "Error: AesKey bigger than block size of RSA Key";

byte[] encryptedKey = cipher.doFinal(AesKey);

// return result Base64 encoded
return Base64.encodeToString(encryptedKey, Base64.DEFAULT);
然后在PHP中,我使用以下代码解密AES密钥:

$AESkey = base64_decode($AES);

$rsa = new Crypt_RSA();
$private = file_get_contents($_SERVER['DOCUMENT_ROOT'].'/PrivateData/private_key.pem');
$rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1);
$rsa->loadKey($private);
$AESkey = $rsa->decrypt($AESkey);
当服务器解密AES密钥时,我总是得到以下错误:第1911行C:\xampp\php\PEAR\phpseclib\Crypt\RSA.php中的解密错误。查看RSA.php中的代码,我认为该错误与加密过程中不正确的填充有关,但我似乎无法找到修复该错误的方法


更新:我发现上面的加密/解密代码实际上是正确的。我遇到的问题是,在将数据从应用程序发送到php之前,我没有对输出进行url编码,因此一些信息丢失了。

您使用的是哪个版本的phpseclib?根据版本的不同,以下内容可能会有所帮助:


该错误意味着前两个高阶字节中的一个错误,通常表示一个非常严重的错误,例如私钥不正确。可能有一个持久性问题吗?这是我要检查的另一件事。我到底要怎么检查呢?我有一种感觉,密钥本身没有任何问题,因为如果我用PHP进行加密和解密,我可以让它工作,但我想可能是我如何将公钥输入Java或我在Java中使用的填充方案有问题。检查的一种方法是反转密码字节,看看解密是否成功。但是最好的方法是找到一些已知的好的测试向量,看看PHP端是如何处理它们的。如果您可以在phpseclib中设置断点来检查中间值,这也会有所帮助。在做了进一步的测试之后,我确定这可能是java和php使用的不同字符集的问题。Java默认使用UTF-8,PHP默认使用ISO-8859-1。我不知道如何在不丢失任何数据的情况下在两者之间进行转换。我也不知道如何让PHPBASE 64解码utf-8字符串。如果您在Java中不是以字符串的形式生成密码,而是以ByteArray或其他形式生成密码呢?实际上,在进行了一系列测试和调试以找到解决方案之后,我发现加密是正确的,但android应用程序和php之间发送的信息必须在经过Base64编码后进行url编码,否则数据会被弄乱。