gpt4 book ai didi

php - RSA 安卓加密/RSA PHP 解密

转载 作者:行者123 更新时间:2023-11-30 04:33:10 27 4
gpt4 key购买 nike

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

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

问题不在于 HTTP 传输,因为我尝试直接解密从 ANDROID(以 Base64 编码)生成的加密,但它根本不起作用 ...

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

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

我在这里使用这个类:

$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 公钥从 android 的加密数据 (A=5) 初始化的(注意:解密在 Android 上运行良好),但在 PHP 中解密后,我得到空字符串 ...

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

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

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))。

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

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

错误在以下几行:

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

我们必须准确读取公钥:

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

最佳答案

有很多地方可能会出错:

  1. 您要将 5000 个字节传递给 X509EncodedKeySpec,其中大部分为 0。您确定获得了正确的公钥吗?
  2. in 字符串有多长?
  3. String.getBytes() 使用平台默认编码,可能会产生意想不到的结果。使用 getBytes("ASCII")getBytes("UTF-8")

一般情况下,您应该只使用 SSL,不要尝试自己实现非对称加密。

关于php - RSA 安卓加密/RSA PHP 解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7331684/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com