有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

安卓中的java rsa php加密和解密

我需要帮助解决这个问题。在互联网上,我找到了许多在安卓系统上用rsa加密和用php解密的例子。在我的例子中,我在安卓上生成密钥对,发送php公钥,然后在php中用该密钥加密,在安卓中用私钥解密。 我在安卓中使用海绵城堡,在php中使用Phpseclib

在安卓中,我使用类org.spongycastle.util.encoders.Base64

生成密钥对:

KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA", "SC");
generator.initialize(1024);
KeyPair kPair = generator.generateKeyPair();
byte[] privateKeyEnc = kPair.getPrivate().getEncoded();
byte[] publicKeyEnc = kPair.getPublic().getEncoded();
String publicKey = new String(Base64.encode(publicKeyEnc)); //this key is send to php
String privateKey = new String(Base64.encode(privateKeyEnc));

在php中加密:

$message = "...";
$publicKey = "..."; //key received from 安卓
$rsa = new Crypt_RSA();
$rsa->setHash('sha1');
$rsa->setMGFHash('sha1');
$rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_OAEP);
$rsa->setPrivateKeyFormat(CRYPT_RSA_PRIVATE_FORMAT_PKCS1);
$rsa->setPublicKeyFormat(CRYPT_RSA_PUBLIC_FORMAT_PKCS1);
$key = "-----BEGIN PUBLIC KEY-----\n" . base64_decode($publicKey) 
            . '-----END PUBLIC KEY-----';
$rsa->loadKey($key);
$messageEncrypt = base64_encode($rsa->encrypt($message)); //this message is send to 安卓

在安卓中解密:

String message = "..."; //this received from php
String privateKey = "..."; //this key was generated in 安卓
byte[] privateKeyBytes = Base64.decode(privateKey);
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKeyBytes);
KeyFactory fact = KeyFactory.getInstance("RSA", "SC");
PrivateKey priv = fact.generatePrivate(keySpec);
Cipher rsaCipher = Cipher.getInstance("RSA/None/OAEPWithSHA1AndMGF1Padding", "SC");
rsaCipher.init(Cipher.DECRYPT_MODE, priv);
byte[] messageDecryptBytes = rsaCipher.doFinal(message);
String messageDecrypt = new String(Base64.encode(messageDecryptBytes));

在安卓系统中,我遇到以下错误:

Exception:java.lang.ArrayIndexOutOfBoundsException: too much data for RSA block

正如我读到的,错误的原因是要解密的消息中的字节没有遵循rsa的预期格式。如果是这种情况,那么加密时错误将出现在php中

我可以在安卓上成功运行php加密和解密。但我还没有在php中找到使用安卓上生成的公钥进行加密的示例


共 (0) 个答案