我在php、javascript和android应用程序中使用库实现了RSA加密:
我有我的密码机制,比如:
user->request->publickey
->server->generate(publickey,privatekey) and save private key into Database
->server->sendpublickey->user
->user->encryptdata->send->server->decrypt然而,这种机制在javascript和php加密和解密之间运行良好,但在android平台上,服务器发送公钥时却是如此。它无法解密公钥。
现在我已经测试了不同的场景
PHP KeyGenerating
$rsa = new Crypt_RSA();
$rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1);
$rsa->setPrivateKeyFormat(CRYPT_RSA_PRIVATE_FORMAT_PKCS1);
$rsa->setPublicKeyFormat(CRYPT_RSA_PUBLIC_FORMAT_PKCS1);
define('CRYPT_RSA_EXPONENT', 65537);
extract($rsa->createKey(1024));PHP DecryptingCode
$rsa = new Crypt_RSA();
$rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1);
$rsa->setPrivateKeyFormat(CRYPT_RSA_PRIVATE_FORMAT_PKCS1);
$rsa->loadKey($pri);
$binaryCiphertext=base64_decode($encrypted);
$strBase64DecryptedData=$rsa->decrypt($binaryCiphertext);
$plaintText = base64_decode($strBase64DecryptedData);就像我的公钥。
-----BEGIN RSA PUBLIC KEY-----
MIGJAoGBALrBdN8F83hT2+pBsAwiNx+v3FWp51IdEElE8UvVhfZYmePbitpzLcJi
jZ4/tvRFXJGhqa3PKPUQkH2F4VrHruA2kNceiL/Btywc9oM+tDMeX1jcRKwXwK1k
KdccKwn0qywG6YxQuqWQIotOfV+IIuhcHdaHBl6CZ05/cBo6AlMlAgMBAAE=
-----END RSA PUBLIC KEY-----此代码无法解密消息,我从PHP端获得此错误
Decryption error in /security/RSA.php on line **2493**RSA.php 2493码
if (ord($em[0]) != 0 || ord($em[1]) > 2) {
user_error('Decryption error');
return false;
}有了这个,我就错了
java.security.spec.InvalidKeySpecException:
java.lang.ClassCastException: com.android.org.bouncycastle.asn1.DERApplicationSpecific
cannot be cast to com.android.org.bouncycastle.asn1.ASN1Sequence我知道编码的公钥是DER编码的,但我还是不知道该怎么做--我想有人可以用DER编码解码来引导我--
我忘了错误就像
unable to cast pemObject to asymmetric ( not sure but something like that )我甚至尝试了一些代码从下面的链接,但我得到了不同的错误。
RSA Android Encrypt / RSA PHP Decrypt PhpSeclib <-> BouncyCastle RSA
请查一下密码,帮帮我。
发布于 2014-09-15 15:03:13
好的,经过几个小时的指数、和模数,我已经成功地加密和解密了android应用程序和php服务器之间的数据。
我的错误是,当密码数据准备好编码时,我使用的是JAVA内部BASE64类,它生成x2大小、编码数据和php,具有不同的解码和编码机制(我不太确定这只是猜测)。
因此,为了避免使用APACHE Commons-1.8库,这里是正确的代码。
RSAPublicKeySpec rsaPublicKeySpec = new RSAPublicKeySpec(mod,exp);
KeyFactory keyFactory = KeyFactory.getInstance("RSA","BS");
PublicKey publicKey = keyFactory.generatePublic(rsaPublicKeySpec);
Cipher cipher = Cipher.getInstance("RSA/None/PKCS1Padding", "BS");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
byte[] encryptedBytes = cipher.doFinal(plainText.getBytes("UTF-8"));//
byte[] coded = Base64.encodeBase64(encryptedBytes); //used library encode decode
String encryptedData = new String(encodedBytes);第二行是将密码二进制数据编码为BASE64。
我将学习更多关于JAVA和BASE64之间的区别的知识。
谢谢
https://stackoverflow.com/questions/25841512
复制相似问题