首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RSA Android加密/ RSA PHP解密

RSA Android加密/ RSA PHP解密
EN

Stack Overflow用户
提问于 2011-09-07 17:38:03
回答 1查看 5.9K关注 0票数 1

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

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

问题不是来自HTTP传输,因为我试图直接解密一个生成加密的安卓系统(用Base64编码),它根本不起作用…

在我的用于解密数据的PHP代码后面找到这里:

代码语言:javascript
复制
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;
}
}

我像这样使用这个类:

代码语言:javascript
复制
$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);

这里的data_1是用RSA Public Key从安卓的加密数据(A=5)中初始化的(注意: decrypt在安卓上工作得很好),但是在PHP中解密后,我得到了空字符串...

请在这里找到ANDROID部分的代码:

代码语言:javascript
复制
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());
}

加密数据后,我将byte[]转换为Base64 (Base64.encodeToString(input,Base64.DEFAULT))。

对于证书,我使用RSA2048位转换为DER格式的Android。

错误在以下行中:

代码语言:javascript
复制
byte[] encodedKey = new byte[5000];
publicKeyFile.read(encodedKey);

我们必须准确地阅读公钥:

代码语言:javascript
复制
byte[] encodedKey = new byte[/*lenght of file*/];
publicKeyFile.read(encodedKey);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-09-07 20:13:34

有很多地方可能会出错:

  1. 您正在向X509EncodedKeySpec传递5000个字节,其中大部分是0。是否确实获得了正确的公钥?
  2. String.getBytes()使用平台默认编码,可能会产生意外的结果。
  3. in字符串的长度是多少。使用getBytes("ASCII")getBytes("UTF-8")

通常,您应该只使用SSL,而不要尝试自己实现非对称加密。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7331684

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档