首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RSA公钥在android中的实现

RSA公钥在android中的实现
EN

Stack Overflow用户
提问于 2014-09-15 05:47:09
回答 1查看 1.7K关注 0票数 6

我在php、javascript和android应用程序中使用库实现了RSA加密:

  1. 用于php端的phpseclib
  2. 用于javascript的pidcrypt
  3. 用于anrdroid的版本(bcprov-jdk14 14-151)

我有我的密码机制,比如:

代码语言:javascript
复制
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

代码语言:javascript
复制
$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

代码语言:javascript
复制
$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);

就像我的公钥。

代码语言:javascript
复制
-----BEGIN RSA PUBLIC KEY-----
MIGJAoGBALrBdN8F83hT2+pBsAwiNx+v3FWp51IdEElE8UvVhfZYmePbitpzLcJi
jZ4/tvRFXJGhqa3PKPUQkH2F4VrHruA2kNceiL/Btywc9oM+tDMeX1jcRKwXwK1k
KdccKwn0qywG6YxQuqWQIotOfV+IIuhcHdaHBl6CZ05/cBo6AlMlAgMBAAE=
-----END RSA PUBLIC KEY-----
  1. 从服务器和服务器请求密钥生成公钥和私钥,并将公钥、模数、指数发送到android应用程序,并应用以下代码: rsaPublicKeySpec RSAPublicKeySpec =新RSAPublicKeySpec(mod,exp);keyFactory KeyFactory = KeyFactory.getInstance("RSA","BS");PublicKey publicKey = keyFactory.generatePublic(rsaPublicKeySpec);密码=Cipher.getInstance(“RSA/None/PKCS1Padd”,"BS");cipher.init(Cipher.ENCRYPT_MODE,publicKey);byte[] encryptedBytes =publicKey(encryptedBytes();en21#EN20#= String =新字符串();

此代码无法解密消息,我从PHP端获得此错误

代码语言:javascript
复制
Decryption error in /security/RSA.php on line **2493**

RSA.php 2493码

代码语言:javascript
复制
 if (ord($em[0]) != 0 || ord($em[1]) > 2) {
     user_error('Decryption error');
     return false;
 }
  1. 第二个场景是获取公钥字符串并对其进行解析。 byte[] keyBytes = Base64.decode(keyString,Base64.DEFAULT);字符串rsaPublicKeyString =新字符串(KeyBytes);字符串sliceKeyHeader = rsaPublicKeyString.replaceAll("(-+BEGIN RSA公钥-+r?\n-+END RSA PublicKey -+\r?\n?“);byte[] encodedDER =Base64.encode(sliceKeyHeader.getBytes,Base64.DEFAULT);X509EncodedKeySpec publicKeySpec =新X509EncodedKeySpec(encodedDER);KeyFactory kf = KeyFactory.getInstance("RSA","BC");X509EncodedKeySpec publicKeySpec=()();

有了这个,我就错了

代码语言:javascript
复制
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编码解码来引导我--

  1. 第三种情况是 最终读取器=新StringReader(rsaPublicKeyString);PemReader pemReader =新PemReader(读取器);PemObject pemObject= pemReader.readPemObject();pemReader.close();AsymmetricKeyParameter publicKey =rsaPublicKeyString

我忘了错误就像

代码语言:javascript
复制
 unable to cast pemObject to asymmetric ( not sure but something like that )

我甚至尝试了一些代码从下面的链接,但我得到了不同的错误。

RSA Android Encrypt / RSA PHP Decrypt PhpSeclib <-> BouncyCastle RSA

请查一下密码,帮帮我。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-15 15:03:13

好的,经过几个小时的指数、模数,我已经成功地加密和解密了android应用程序和php服务器之间的数据。

我的错误是,当密码数据准备好编码时,我使用的是JAVA内部BASE64类,它生成x2大小、编码数据和php,具有不同的解码和编码机制(我不太确定这只是猜测)。

因此,为了避免使用APACHE Commons-1.8库,这里是正确的代码。

代码语言:javascript
复制
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之间的区别的知识。

谢谢

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25841512

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档