Base64编码字符串到公钥使用RSA从C#到Java

时间:2015-12-10 18:54:55

标签: java .net encryption rsa bouncycastle

我正在将遗留应用程序从.net转换为java。使用公钥加密的旧方法。

string text = "<base64encodedstring here>";
IBuffer buffer = CryptographicBuffer.DecodeFromBase64String(text);
AsymmetricKeyAlgorithmProvider asymmetricKeyAlgorithmProvider = AsymmetricKeyAlgorithmProvider.OpenAlgorithm(AsymmetricAlgorithmNames.get_RsaPkcs1());
CryptographicKey cryptographicKey = asymmetricKeyAlgorithmProvider.ImportPublicKey(buffer, 3);
IBuffer buffer2 = CryptographicBuffer.ConvertStringToBinary(data, 0);
IBuffer buffer3 = CryptographicEngine.Encrypt(cryptographicKey, buffer2, null);
byte[] array;
CryptographicBuffer.CopyToByteArray(buffer3, ref array);
//return CryptographicBuffer.EncodeToBase64String(buffer3);

这是我的Java代码,用于将给定的文本转换为公钥

public static PublicKey getKey(String key) throws Exception{
    try{
        byte[] byteKey = Base64.getDecoder().decode(key);

        X509EncodedKeySpec X509publicKey = new X509EncodedKeySpec(byteKey);
        KeyFactory kf = KeyFactory.getInstance("RSA","BC");

        return kf.generatePublic(X509publicKey);

    }
    catch(Exception e){
       throw e;
    }

}

这是我的主要方法

public static void main(String[] args) {
    String text = "base64encodedstring";
    try {
        Security.addProvider(new BouncyCastleProvider());
        decode(text);
        PublicKey pubKey=getKey(text);
        byte[] input = "plaintext".getBytes();
        Cipher cipher = Cipher.getInstance("RSA/None/PKCS1Padding", "BC");
        cipher.init(Cipher.ENCRYPT_MODE, pubKey);
        byte[] cipherText = cipher.doFinal(input);
        System.out.println("cipher: " + new String(cipherText));

    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

但是当我尝试获取公钥时,我得到了下面的例外

java.security.spec.InvalidKeySpecException: encoded key spec not recognised
    at org.bouncycastle.jcajce.provider.asymmetric.util.BaseKeyFactorySpi.engineGeneratePublic(Unknown Source)
    at org.bouncycastle.jcajce.provider.asymmetric.rsa.KeyFactorySpi.engineGeneratePublic(Unknown Source)
    at java.security.KeyFactory.generatePublic(Unknown Source)
    at com.test.EncryptionUtil.getKey(EncryptionUtil.java:38)
    at com.test.EncryptionUtil.main(EncryptionUtil.java:60)

我做错了吗?我是密码学的新手。

通过更多的研究,我发现它在C#中的表现方式,但无法将其转换为java

 public static CryptographicKey GetCryptographicPublicKeyFromCert(string strCert)

    {

        int length;

        CryptographicKey CryptKey = null;



        byte[] bCert = Convert.FromBase64String(strCert);



        // Assume Cert contains RSA public key

        // Find matching OID in the certificate and return public key

        byte[] rsaOID = EncodeOID("1.2.840.113549.1.1.1");

        int index = FindX509PubKeyIndex(bCert, rsaOID, out length);



        // Found X509PublicKey in certificate so copy it.

        if (index > -1)

        {

            byte[] X509PublicKey = new byte[length];

            Array.Copy(bCert, index, X509PublicKey, 0, length);



            AsymmetricKeyAlgorithmProvider AlgProvider = AsymmetricKeyAlgorithmProvider.OpenAlgorithm(AsymmetricAlgorithmNames.RsaPkcs1);

            CryptKey = AlgProvider.ImportPublicKey(CryptographicBuffer.CreateFromByteArray(X509PublicKey));

        }



        return CryptKey;

    }

EncodeOID方法的目的是什么以及如何在Java中实现它。下面的链接解释了base64编码公钥字符串的创建并在C#中对其进行解码 http://blogs.msdn.com/b/stcheng/archive/2013/03/12/windows-store-app-how-to-perform-rsa-data-encryption-with-x509-certificate-based-key-in-windows-store-application.aspx

3 个答案:

答案 0 :(得分:0)

显然,密钥不是X509编码的。了解它是如何编码的并使用适当的KeySpec。

答案 1 :(得分:0)

C#使用AsymmetricAlgorithmNames。 get_RsaPkcs1 您需要找到JAVA代码的等效代码。

您可能希望查看此Import Public RSA Key From Certificate

答案 2 :(得分:0)

没有直接的方法将微软Capi1PublicKey读入java。我首先在WinRT中将Capi1PublicKey转换为X509编码的公钥。然后我在java中使用了创建的密钥。