【问题标题】:Encrypt in Android, Decrypt in PHP using phpseclib在 Android 中加密,在 PHP 中使用 phpseclib 解密
【发布时间】:2013-07-22 14:59:27
【问题描述】:

我在 Android 应用程序中加密数据并对其进行编码以发送到 php webservice。
然后我对其进行解码并使用 $rsa->decrypt(base64_decode($data)); 解密它
$rsa->解密返回假。为什么呢?

这是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));

【问题讨论】:

    标签: android security base64 rsa phpseclib


    【解决方案1】:

    我解决了我的问题。这是那些和我做类似事情的人的参考。希望这对其他人有所帮助。

    在android中(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】:

    您是否将正确的参数传递给 cipher.doFinal?

    引用javadoc entry

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

    此外,您似乎在加密前对明文进行 base64 编码,而您应该在加密后加密密文?

    【讨论】:

    • 我做了一些更改,但它仍然是错误的 byte[] encrpytedText = cipher.doFinal(phoneUid.getBytes("CP1252"); encoded= Base64.encode(encrpytedText, Base64.DEFAULT); data =新字符串(编码,“CP1252”);
    猜你喜欢
    • 1970-01-01
    • 2017-11-01
    • 1970-01-01
    • 2022-01-12
    • 1970-01-01
    • 1970-01-01
    • 2019-01-26
    • 2018-04-08
    • 1970-01-01
    相关资源
    最近更新 更多