Android-PHP 使用 RSA 传递给 PHP 的编码字符串

Android-PHP Encoded String with RSA passed to PHP

我知道使用 https 连接会更容易,但对于大学项目来说,没有钱这样做。我们有一个 Apache2 Web 服务器,但由于权限限制无法包含证书。 URL 发送数据的连接是正确的,所以我没有将它包含在我的问题中,所以问题出在格式或 de-/encryption。

所以基本想法是:使用 openssl 生成自己的证书。加密 Android 上的数据,使用 UrlConnection 发送到服务器,必须在那里解密才能执行更多操作。

Android 加密:

    AssetManager assetManager=activity.getAssets();
    InputStream in=assetManager.open("certificate.crt");
    CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
    X509Certificate certificate = (X509Certificate)certificateFactory.generateCertificate(in);
    PublicKey publicServerKey = certificate.getPublicKey();
    Cipher cipher = Cipher.getInstance("RSA");
    cipher.init(Cipher.ENCRYPT_MODE,publicServerKey);
    byte[] parametersCipher = cipher.doFinal(parameters.getBytes());
    String encoded=new String(Base64.encode(parametersCipher, Base64.DEFAULT));
    String parametersencrypted="data="+URLEncoder.encode(encoded,"UTF-8");

加密的字符串参数将与 POST 数据一起发送到服务器 现在是服务器部分: PHP解密:

$data=utf8_decode(urldecode($_POST['data']));    
$privateKey=openssl_pkey_get_private("file://certificate.key", "password");
$data = base64_decode($data);
openssl_private_decrypt($data, $decrypted,$privateKey);

服务器正在获取 Base64 编码字符串,但解密字符串为空。如果我在 php 中加密一个字符串,我可以解密它,在 Android 中也是如此,我认为问题在于使用 UTF-8 Urlencoding 左右的 HTTP 请求的格式,但我没有得到一个解决方案。 请帮我解决这个具体问题。

更新

好的,我确实在 Java 上使用了它,但在 Android 上却不行: Java代码:

Cipher cipher=Cipher.getInstance("RSA/ECB/NoPadding");
cipher.init(Cipher.ENCRYPT_MODE,publicServerKey);
byte[] parametersCipher = cipher.doFinal(urlParameters.getBytes("UTF-8"));
String encoded=new String(encoder.encode(parametersCipher)); //encoder= base64 encoder 
encoded=encoded.replace("+", "-");
encoded=encoded.replace("/", "_");

修改后PHP:

$data = base64_decode(strtr($string, '-_', '+/')); 
openssl_private_decrypt($data, $decrypted, $this->privateKey,OPENSSL_NO_PADDING);

Android代码:

Cipher cipher = Cipher.getInstance("RSA/ECB/NoPadding");
cipher.init(Cipher.ENCRYPT_MODE,publicServerKey);
byte[] parametersCipher = cipher.doFinal(parameters.getBytes("UTF-8"));
String encoded=new String(Base64.encode(parametersCipher, Base64.URL_SAFE)); //URL_SAFE from Android Documentation + as - and / as _
String parametersencrypted="data="+encoded;

知道我做错了什么吗?

使用更新的代码,我将错误的证书放入应用程序。现在可以使用了。