gpt4 book ai didi

java - php中的RSA加密到JAva中的RSA解密

转载 作者:太空宇宙 更新时间:2023-11-04 10:39:13 28 4
gpt4 key购买 nike

目前,我尝试使用 Android 应用程序中生成的公钥在 php 中使用 rsa 进行加密,然后再次在 Android 应用程序中解密。

我在android中生成 key 的代码是:

KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
kpg.initialize(1024);
KeyPair kp = kpg.generateKeyPair();
PublicKey publicKey = kp.getPublic();
PrivateKey privateKey = kp.getPrivate();

有了这些 key ,我可以很好地进行加密和解密。 pub key 如下所示:

OpenSSLRSAPublicKey{modulus=9ee9f82dd8429d9fa7f091c1d375b9c289bcf2c39ec57e175a2998b4bdd083465ef0fe6c7955c821b7e883929d017a9164a60290f1622f664a72096f5d2ffda7c7825c3d657c2d13d177445fa6cdd5d68b96346006a96040f5b09baae56d0c3efeaa77d57602f69018f5cefd60cb5c71b6b6f8a4b0472e8740367266917d8c13,publicExponent=10001}

在 php 中,我采用模数和指数,使用 phpseclib 1.0 创建加密字符串

$rsa = new Crypt_RSA();
// $rsa->createKey();
$m = "9ee9f82dd8429d9fa7f091c1d375b9c289bcf2c39ec57e175a2998b4bdd083465ef0fe6c7955c821b7e883929d017a9164a60290f1622f664a72096f5d2ffda7c7825c3d657c2d13d177445fa6cdd5d68b96346006a96040f5b09baae56d0c3efeaa77d57602f69018f5cefd60cb5c71b6b6f8a4b0472e8740367266917d8c13";
$e = "10001";
$data = "hallo";
$modulus = new Math_BigInteger($m, 16);
$exponent = new Math_BigInteger($e, 16);
$rsa->loadKey(array('n' => $modulus, 'e' => $exponent));
$messageEncrypt = $rsa->encrypt($data);

再次在 Android 中,我加载 key ,并像这样解密:

Cipher cipher1 = Cipher.getInstance("RSA");
cipher1.init(Cipher.DECRYPT_MODE, privateKey);
byte[] decryptedBytes = cipher1.doFinal(encrypted.getBytes());
String decrypted = new String(decryptedBytes);

我总是收到错误的解密明文或来自 Android 的“由 java.lang.ArrayIndexOutOfBoundsException: RSA block 数据过多”错误消息。

我的想法:问题在于编码传输。 php 输出与 java 使用的编码版本不同的版本。所以我尝试了很多不同的方法。我尝试将输出转换为 String/bin/hex/byte。然后使用套接字或直接在代码中复制+粘贴来传输它。将其从十六进制/二进制...转换回字节[]并尝试对其进行解码。没有任何效果...

谁有解决办法吗?

最佳答案

由于您没有使用 phpseclib 指定加密模式,这意味着您正在使用(更安全且不太常见)OAEP 加密模式。我的猜测是 Java 默认使用 PKCS1 加密 ($rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1);)。

也就是说,对于 OAEP 模式和您正在使用的 key (1024 位 key ;128 字节),限制为 86 字节。 PKCS1 模式的限制是 117 字节。

phpseclib 1.0/2.0 可能不会给出错误,因为 phpseclib 尝试对所有用户友好,并将字符串分割成最大大小的 block ,并将单独加密每个 block 。 Java 不太可能做到这一点。

关于java - php中的RSA加密到JAva中的RSA解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49183713/

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