RSA的Andr​​oid加密/ RSA PHP解密 [英] RSA Android Encrypt / RSA PHP Decrypt

查看:160
本文介绍了RSA的Andr​​oid加密/ RSA PHP解密的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要一些帮助解决我的问题。

问题: 我想一个数字(A)与Android平台的RSA公钥加密,然后用私钥解密PHP服务器上。 在每个平台上,我可以加密和解密数据(它工作得很好),但是当PHP脚本尝试解密加密的ANDROID的数据,这是行不通的!

问题不是来自HTTP传输,因为我尝试直接发电加密的机器人(codeD中的Base64)进行解密,并不能在所有的工作...

Findhere后,我的PHP $ C $下解密数据:

 类MyEncryption
{

公共$的privKey ='';
公共$ PUBKEY ='';
公共职能__construct(){

}

公共函数初始化(){
    $计划生育=的fopen(./加密/ asasap_public.pub,R);
    $ TEMP =的fread($计划生育,8192);
    fclose函数($ FP);
    $这个 - > PUBKEY = openssl_pkey_get_public($ TEMP);

    $计划生育=的fopen(./加密/ asasap.pem,R);
    $ TEMP =的fread($计划生育,8192);
    fclose函数($ FP);
    $这个 - >的privKey = openssl_get_privatekey($温度,'');

}

公共职能加密($的数据)
{
    如果(openssl_public_encrypt($数据,$加密,$这个 - > PUBKEY))
        $数据= base64_en code($加密);
    其他
        抛出新的异常(无法对数据进行加密也许是大于密钥大小。?');

    返回$的数据;
}

公共职能解密($的数据)
{
    如果(openssl_private_decrypt(base64_de code($的数据),$解密,$这个 - >的privKey))
        $数据= $解密;
    其他
        $数据='';

    返回$的数据;
}

公共职能HEX2BIN($ hexdata){
    $ bindata ='';

    为($ i = 0; $ I< strlen的($ hexdata); $ I + = 2){
        。$ bindata = CHR(hexdec(SUBSTR($ hexdata,$ 1,2)));
    }

    返回$ bindata;
}
}
 

和我使用这个类喜欢这里:

  $ ENC =新MyEncryption();
$ enc->初始化();
$ _1 = 'K27booXr0zZK4BQlI45MIPJJjPPkpCCPELGvoK/wKYUwShIWE6szlZtrmV83C5eBIrT/3lxWTH3+IOA+5mefurVUvXmQIV7fXEHNHLphyM6L9gQsMAGZMCroPjWKvJM59OMS/d5dwwhiRgzVarxXSKpxBYhEYWJTu7nRJ+bZKjumeoqnCSpmntIiV+tRYgkYflOU6j2QlesjO5tzj/TL6n7vHSO/O1qafJkzHcv8Kn2hTy+IH7QXm7z5vtjXOucHkvBm1xWORXdifh+ChyVvP16dSEmCaCAH6KqtA4viX/HwRFEi4mIWaYSIQk74NdcnQOpFcTgEu2nDwtHaBMqahw==';
$数据2 = $ enc->解密($ _1);
 

下面_1从加密数据(A = 5)初始化从机器人与RSA公钥(注:解密著作以及在Android),但解密的PHP之后,我得到空String ...

------------------------------------------更新---- ---

请之后​​,$ C $下ANDROID部分在这里找到:

 公共字节[] encryptRSA(最终的InputStream publicKeyFile,字符串中)抛出IOException异常,抛出:NoSuchAlgorithmException,
    InvalidKeySpecException,InvalidKeyException将,NoSuchPaddingException,IllegalBlockSizeException,
    BadPaddingException {
    byte []的EN codeDKEY =新的字节[5000];
    publicKeyFile.read(EN codeDKEY);
    X509En codedKeySpec publicKeySpec =新X509En codedKeySpec(EN codeDKEY);
    的KeyFactory KF = KeyFactory.getInstance(RSA);
    公钥pkPublic = kf.generatePublic(publicKeySpec);
    // 加密
    密码pkCipher = Cipher.getInstance(RSA / ECB / PKCS1PADDING);
    pkCipher.init(Cipher.ENCRYPT_MODE,pkPublic);
    返回pkCipher.doFinal(in.getBytes());
}
 

在加密数据,我转换的byte []为Base64的(Base64.en codeToString(输入,Base64.DEFAULT))。

有关证书,我使用RSA 2048位转换成DER格式为Android。

------------------------------------------解决方案---- ---

错误是如下:

 字节[] EN codeDKEY =新的字节[5000];
publicKeyFile.read(EN codeDKEY);
 

我们必须exactely读公共密钥:

 字节[] EN codeDKEY =新的字节[/ *文件* lenght /]
publicKeyFile.read(EN codeDKEY);
 

解决方案

有很多地方这可能会出错:

  1. 您逝去的5000个字节为 X509En codedKeySpec ,其中大部分是0。你确定你所得到正确的公钥?
  2. 是多长字符串?
  3. String.getBytes()使用平台默认编码,并可能产生意想不到的结果。使用的GetBytes(ASCII)的GetBytes(UTF-8)

通常情况下,你应该只使用SSL,不要试图自己实现非对称加密。

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 decrypt 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.

这篇关于RSA的Andr​​oid加密/ RSA PHP解密的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆