2013-07-22 50 views
2

我在Android應用程序中加密數據並對其進行編碼以發送到php webservice。
然後我解碼並使用$ rsa-> decrypt解密(base64_decode($ data));
$ rsa->解密返回false。爲什麼?

在Android中加密,使用phpseclib在PHP中解密

這是Android

//get private key 
String privateKeyString = "MIICWwIBAAKBgQDVIJ8H3Oszc5fWdgpwymWksF1WxkXJHIfdS6Ta1bHeqwEzPIkN f3iVk14LfaoSZpRb9Yvi/jvkXxIzJbHq6aKfnQOC6tKIiixvVvpCfxr1eV4urDdz H9RNy9bqGdXzTQdgQi+KRx0Dcy9RNsl7ZGLAGrUFRnPI4GTdH+7wm4QogQIDAQAB AoGAcUcKX7KC7HDm5h0NRY+94H/AzItLsi3Q5MT81Tc5d+EqHSJysdLrs4yFMtRS 3b7Z4dqrxDVefe4uDTNe0j3lqboKz8oKwAU+paKx3wubHb7aeQnfzwM9mPQJHgEO zBjlvbL4oEa/gklu3VohZAc1daqpPajdWuOQQp4S+jUllrECQQDrITlSjvkxt8ud /vYIcEXHew3iW4nzaAH3z4PRAGZofRpk/OusGZ6cdZoYMTZcdxYTCCbZ5eeyGukW 5QCadie1AkEA6Atx8Z0F7WhLI2lGvCGy+vIOL0vBDZSma0cvLYLAXMx8duoWQ9J2 LwT7SsnRXMeq/8wlNHL7mFEf+YFZBKKlHQJAO78kfrr/zUdjwREBWaGVyZuWKpeS FTyvi1W6rAgK/bAUXeb6x69241DqyAzxQEuuW0WuAZ5u4o39/qhQH++4JQJAAepe RW1TaDNNM3yh/dmVXabz4QYSEOeiPA55YDnNFrcFbAHgryyklxzGakaiOM7ZJYVs 5TLxyr8YsXmU34nsLQJALzC8CaFXJcnU0+6+KoKX7iq1aP3X4LgP4Gianix6pfRo aV8UHnfFLRSgPdn1ZYmKtJfnsJXJYoE+o9xEErb5EQ=="; 

// converts the String to a PublicKey instance 
KeyFactory keyFactory = KeyFactory.getInstance("RSA"); 
PrivateKey key = keyFactory.generatePrivate(new PKCS8EncodedKeySpec(Base64.decode(privateKeyString.toString(), Base64.DEFAULT))); 

// encrypts the message 
Cipher cipher = Cipher.getInstance("RSA"); 
cipher.init(Cipher.ENCRYPT_MODE, key); 
byte[] encrpytedText = cipher.doFinal(Base64.encode(phoneUid.getBytes("CP1252"), Base64.DEFAULT)); 
data = new String(encrpytedText, "CP1252"); 



代碼這是在PHP

include('Crypt/RSA.php'); 
$rsa = new Crypt_RSA(); 
//Set the encryption mode 
$rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1); 

//check for required fields 
if (isset($_POST['data']) { 
$data= $_POST['data']; 
$key = '-----BEGIN PUBLIC KEY----- 
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDVIJ8H3Oszc5fWdgpwymWksF1W xkXJHIfdS6Ta1bHeqwEzPIkNf3iVk14LfaoSZpRb9Yvi/jvkXxIzJbHq6aKfnQOC 6tKIiixvVvpCfxr1eV4urDdzH9RNy9bqGdXzTQdgQi+KRx0Dcy9RNsl7ZGLAGrUF RnPI4GTdH+7wm4QogQIDAQAB 
-----END PUBLIC KEY-----'; 

$rsa->loadKey($key); 
$decrypted = $rsa->decrypt(base64_decode($data)); 

回答

1

我解決了我的問題。以下是對我做類似事情的人的參考。希望這會幫助其他人。

在安卓(RSA加密與私鑰)

String encoded = null; 
byte[] encrypted = null; 
String plaintext = "..."; 

try { 
    String privKeyPEM = "..."; 
    byte[] decoded = Base64.decode(privKeyPEM, Base64.DEFAULT); 
    PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(decoded); 
    KeyFactory kf = KeyFactory.getInstance("RSA"); 
    PrivateKey privKey = kf.generatePrivate(spec); 

    Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); 
    cipher.init(Cipher.ENCRYPT_MODE, privKey); 

    encrypted = cipher.doFinal(plaintext.getBytes()); 
    encoded = Base64.encodeToString(encrypted, Base64.DEFAULT); 
} 
catch (Exception e) { 
    e.printStackTrace(); 
} 

在PHP(解密用公鑰)(使用phpseclib)

$publickey = '...';  
$rsa = new Crypt_RSA(); 
$rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1); 

//decode and decrypt 
$decoded = base64_decode($encrypted); 
$rsa->loadKey($publickey); 
$decrypted = $rsa->decrypt($decoded); 
+2

您使用public用私鑰解密和解密數據e鍵。 – JavaForAndroid

0

你傳遞正確的參數cipher.doFinal代碼?

引述javadoc entry

doFinal(byte[] inBuff, short inOffset, short inLength, byte[] outBuff, short outOffset) 

此外,它看起來你的base64編碼類正在明文加密前時,你應該加密後的加密密文?

+0

我做了一些改變,但它仍然是假 字節[ ] encrpytedText = cipher.doFinal(phoneUid.getBytes(「CP1252」); encoded = Base64.encode(encrpytedText,Base64.DEFAULT); data = new String(encoded,「CP1252」); – Lin