gpt4 book ai didi

android - RSA 公钥在 android 中的实现

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:16:09 24 4
gpt4 key购买 nike

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

  1. phpseclib 用于 php 端

  2. pidcrypt 用于 javascript

  3. bouncrycaSTLe version(bcprov-jdk14-151) for anrdroid serviceprovider

我的加密机制如下:

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 key 生成

$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 解密代码

$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-----
  1. 从服务器请求 key ,服务器生成公钥和私钥,并将公钥MODULUSEXPONENT发送到android应用程序并应用此代码:

    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(plaintText.getBytes());
    byte[] encodedBytes = org.bouncycastle.util.encoders.Base64.encode(encryptedBytes);
    String encryptedData = new String(encodedBytes);

此代码无法解密消息,我从 PHP SIDE 收到此错误

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;
}
  1. 第二种情况是获取公钥字符串并解析它

    byte[] keyBytes =   Base64.decode(keyString, Base64.DEFAULT);
    String rsaPublicKeyString = new String(keyBytes);
    String sliceKeyHeader = rsaPublicKeyString.replaceAll("(-+BEGIN RSA PUBLIC KEY-+\\r?\\n|-+END RSA PUBLICKEY-+\\r?\\n?)", "");
    byte[] encodedDER = Base64.encode(sliceKeyHeader.getBytes(),Base64.DEFAULT);

    X509EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(encodedDER);
    KeyFactory kf = KeyFactory.getInstance("RSA","BC");
    PublicKey pkPublic = (PublicKey) kf.generatePublic(publicKeySpec);

有了这个我得到了错误

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. 第三种情况是

     final Reader reader = new StringReader(rsaPublicKeyString);
    PemReader pemReader = new PemReader(reader);
    PemObject pemObject= pemReader.readPemObject();
    pemReader.close();
    AsymmetricKeyParameter publicKey = PublicKeyFactory.createKey(pemObject.getContent());

我忘了是什么错误了

 unable to cast pemObject to asymmetric ( not sure but something like that )

我什至尝试了以下链接中的一些代码,但出现了不同的错误。

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

请查看代码并帮助我。

最佳答案

OK 几个小时后开始处理 EXPONENTMODULUS我已经成功地加密和解密了 android 应用程序和 php 服务器之间的数据这是可能对某些人有用的解决方案

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

为了避免我使用了 APACHE commons-codec-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和PHP之间的BASE64差异

谢谢

关于android - RSA 公钥在 android 中的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25841512/

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