Android XML RSA,ERROR:java.security.InvalidKeyException:传递给RSA的未知密钥类型

时间:2015-07-21 13:46:28

标签: java android xml encryption cryptography

我遇到问题使用RSA加密字符串。 我的RSA是XML格式,看起来像这样:

<RSAKeyValue><Modulus>lT8ykfyV0R8o3mJZZezLKTKJpYB90Pzvp0moLzh9CTGfgsxLKYiAl+YGaoRfQ7hVQos5UlLIONHWKPNco9kKcmL6EBJvFc8wqBnhX0p4ML2WSv1yDIRsm9XXra82WHIa3+fxK8bNUJHrucxmpr9pDRPdZGZkz+Q9s94FcOyFKbs=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>

我尝试使用此类加密字符串:

import java.io.BufferedReader;
import java.io.StringReader;
import java.security.KeyPair;
import java.security.PublicKey;
import java.security.Security;
import javax.crypto.Cipher;
import org.bouncycastle.openssl.PEMReader;
import android.util.Base64;
import android.util.Log;

public class RsaEncryption {

private String publicKey;

public RsaEncryption(String publicKey)
{
    this.publicKey = publicKey;

}


/*
 * Function to encrypt the data.
 *
 */

public String encrypt( String data ) throws Exception
{



    Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
    Cipher cipher = Cipher.getInstance("RSA/None/OAEPWithSHA1AndMGF1Padding", "BC");


    byte[] keyBytes =   Base64.decode( this.publicKey, 0 );

    PublicKey publickey       = strToPublicKey(new String(keyBytes));
    cipher.init( Cipher.ENCRYPT_MODE , publickey );

    // Base 64 encode the encrypted data
    byte[] encryptedBytes = Base64.encode( cipher.doFinal(data.getBytes()), 0 );

    return new String(encryptedBytes);


}


public static PublicKey strToPublicKey(String s)
{

    PublicKey pbKey = null;
    try {

        BufferedReader br   = new BufferedReader( new StringReader(s) );
        PEMReader pr        = new PEMReader(br);
        Object obj = pr.readObject();

        if( obj instanceof PublicKey )
        {
            pbKey = (PublicKey) pr.readObject();
        }
        else if( obj instanceof KeyPair )
        {
            KeyPair kp = (KeyPair) pr.readObject();
            pbKey = kp.getPublic();
        }
        pr.close();

    }
    catch( Exception e )
    {
        Log.d("CIPHER", e.getMessage() );
    }

    return pbKey;
}

}

你可以看到我正在使用bouncycastle的jar 我得到的错误是: java.security.InvalidKeyException:传递给RSA的未知密钥类型

我不确定这部分

Cipher cipher = Cipher.getInstance("RSA/None/OAEPWithSHA1AndMGF1Padding", "BC");

也许这就是问题? 如果是的话,那需要什么呢?

我做了几个小时的研究,仍然没有找到解决方案......

提前致谢:)

2 个答案:

答案 0 :(得分:2)

CLOUDAMQP_URL=amqp://guest:guest@localhost:5672/
  

也许这就是问题?

不,不是。

Cipher cipher = Cipher.getInstance("RSA/None/OAEPWithSHA1AndMGF1Padding", "BC");

PKCS1中定义的最佳非对称加密填充方案,其中OAEPWith<digest>And<mgf>Padding 应替换为消息摘要算法和{{1} } 掩码生成函数。示例:<digest><mgf>

参考Standard NamesRFC 4055

问题出在您的公钥生成中。因为您的密钥是XML和Base64编码:

  • 首先,您需要分离模数和指数。
  • 然后Base64解码模数和指数。

解码后,您将获得模数和指数的 字节数组 ,因此您可以轻松准备公钥对象,如下所示:

OAEPWithMD5AndMGF1Padding

答案 1 :(得分:1)

XML不是PEM。

您需要从XML中提取模数和公共指数,然后使用"RSA" KeyFactory实例和RSAPublicKeySpec生成密钥。