开发者

RSA Android Encrypt / RSA PHP Decrypt

开发者 https://www.devze.com 2023-04-03 09:33 出处:网络
i need some help for solve my problem. Problem : I want to encrypt a number (A) with public RSA Key from Android platform and then decrypt it on PHP Server with the private key.

i need some help for solve my problem.

Problem : I want to encrypt a number (A) with public RSA Key from Android platform and then decrypt it on PHP Server with the private key. On each platform, i can encrypt and decrypt data (it works well), but when the PHP script try to decrypt data encrypted from ANDROID, it doesn't work !!

Problem is not from HTTP Transmission, because I try to decrypt directly a generating Encryption from ANDROID (coded in Base64) and it not work at all ...

Findhere after my PHP Code for dec开发者_开发技巧rypt data :

class MyEncryption
{

public $privkey = '';
public $pubkey = '';
public function __construct(){

}

public function initialize() {
    $fp=fopen("./encryption/asasap_public.pub","r");
    $temp=fread($fp,8192);
    fclose($fp);
    $this->pubkey = openssl_pkey_get_public($temp);

    $fp=fopen("./encryption/asasap.pem","r");
    $temp=fread($fp,8192);
    fclose($fp);
    $this->privkey = openssl_get_privatekey($temp,'');

}

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;
}

public function hex2bin($hexdata) {
    $bindata = '';

    for ($i = 0; $i < strlen($hexdata); $i += 2) {
        $bindata .= chr(hexdec(substr($hexdata, $i, 2)));
    }

    return $bindata;
}
}

And i use this class like here :

$enc = new MyEncryption();
$enc->initialize();
$data_1 = 'K27booXr0zZK4BQlI45MIPJJjPPkpCCPELGvoK/wKYUwShIWE6szlZtrmV83C5eBIrT/3lxWTH3+IOA+5mefurVUvXmQIV7fXEHNHLphyM6L9gQsMAGZMCroPjWKvJM59OMS/d5dwwhiRgzVarxXSKpxBYhEYWJTu7nRJ+bZKjumeoqnCSpmntIiV+tRYgkYflOU6j2QlesjO5tzj/TL6n7vHSO/O1qafJkzHcv8Kn2hTy+IH7QXm7z5vtjXOucHkvBm1xWORXdifh+ChyVvP16dSEmCaCAH6KqtA4viX/HwRFEi4mIWaYSIQk74NdcnQOpFcTgEu2nDwtHaBMqahw==';
$data_2 = $enc->decrypt($data_1);

Here data_1 is initialized from the encrypt data (A=5) from android with the RSA Public Key (note : decrypt works well on Android), but after decryption in PHP, i get empty String ...

------------------------------------------ UPDATE -------

Please find here after the code for ANDROID part :

public byte[] encryptRSA(final InputStream publicKeyFile, String in) throws IOException, NoSuchAlgorithmException,
    InvalidKeySpecException, InvalidKeyException, NoSuchPaddingException, IllegalBlockSizeException,
    BadPaddingException {
    byte[] encodedKey = new byte[5000];
    publicKeyFile.read(encodedKey);
    X509EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(encodedKey);
    KeyFactory kf = KeyFactory.getInstance("RSA");
    PublicKey pkPublic = kf.generatePublic(publicKeySpec);
    // Encrypt
    Cipher pkCipher = Cipher.getInstance("RSA/ECB/PKCS1PADDING");
    pkCipher.init(Cipher.ENCRYPT_MODE, pkPublic);
    return pkCipher.doFinal(in.getBytes());
}

After encrypt data, i convert the byte[] into Base64 (Base64.encodeToString(input, Base64.DEFAULT)).

For the certificate, i use RSA 2048 Bits convert into DER Format for Android.

------------------------------------------ SOLUTION -------

Error are in following Lines :

byte[] encodedKey = new byte[5000];
publicKeyFile.read(encodedKey);

We must read exactely the Public Key :

byte[] encodedKey = new byte[/*lenght of file*/];
publicKeyFile.read(encodedKey);


There are a lot of places this can go wrong:

  1. You are passing 5000 bytes to X509EncodedKeySpec, most of which are 0. Are you sure you are getting the proper public key?
  2. How long is the in String?
  3. String.getBytes() uses the platform default encoding and may have unintended results. Use getBytes("ASCII") or getBytes("UTF-8").

Generally, you should just use SSL, and don't try to implement asymmetric encryption yourself.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号