建议和反馈

请填写你的反馈内容

问答 > 密码学 > 问答详情
求助中

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

我遇到问题使用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");

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

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


2019-12-03
0
请先登陆或注册

卖拐卖拐2019-12-03
Cipher cipher = Cipher.getInstance("RSA/None/OAEPWithSHA1AndMGF1Padding", "BC");

也许这就是问题?

不,这不对。

OAEPWith<digest>And<mgf>Padding

表示PKCS1中定义的最佳非对称加密填充方案,其中<digest>应由消息摘要算法替换, <mgf>掩码生成函数替换。 示例: OAEPWithMD5AndMGF1PaddingOAEPWithSHA-512AndMGF1Padding 。

参考标准名称RFC 4055 。

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

  • 首先,您需要分离模数和指数。

  • 然后Base64解码模数和指数。

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

BigInteger modBigInteger = new BigInteger(1, modulus);//modulus must be byte array
BigInteger exBigInteger = new BigInteger(1, exponent);//exp must be byte array

RSAPublicKeySpec spec = new RSAPublicKeySpec(modBigInteger, exBigInteger);
KeyFactory factory = KeyFactory.getInstance("RSA");
PublicKey publicKey = factory.generatePublic(spec);


投一票
评论(0)
赞赏(0)
邀请

感谢您的善举,每一次解答会成为新人的灯塔,回答被采纳后获得20算力和相应的LK币奖励