[英]RSA Publickey implemenation in android
我已經在使用庫的php,javascript和android應用中使用RSA加密技術:
phpseclib用於php端
pidcrypt用於javascript
機器人服務提供者的bouncrycastle版本(bcprov-jdk14-151)
我的加密機制如下:
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密鑰生成
$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-----
來自服務器的請求密鑰和服務器生成公鑰和私鑰,並將公鑰MODULUS和EXPONENT發送到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;
}
第二種情況是獲取publick密鑰字符串並對其進行解析
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編碼解碼來指導我-
第三種情況是
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加密/ RSA PHP解密 PhpSeclib <-> BouncyCastle RSA
請研究代碼並為我提供幫助。
OK經過數小時使用EXPONENT和MODULUS的工作,我已經成功地加密和解密了android app和php server之間的數據,這是可能對某些人有用的解決方案
我的錯誤是,當密碼數據准備好進行編碼時,我正在使用JAVA內部BASE64類,該類生成x2大小的編碼數據,而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差異的更多信息
謝謝
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.