Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Base64 encoded string to Public Key using RSA From C# to Java

I am converting legacy application from .net to java. Legacy method using encryption using public key.

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

Here is my Java code to convert the given text into the public key

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;
    }

}

Here is my main method

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();
    }
}

But When I try to get the public key I get the exception below

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)

Am I doing something wrong? I am new to cryptography.

With some more research I found the way how it is doing in C#, but not able to convert it into 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;

    }

What is the purpose of EncodeOID method and how it can be achieved in Java. The link below explains the creation of base64 encoded public key string and decode it in 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

like image 555
user2672763 Avatar asked Mar 09 '26 00:03

user2672763


1 Answers

There is no direct way to read microsoft Capi1PublicKey into java. I first converted the Capi1PublicKey to X509-encoded public key in WinRT. then I used created key in java.

like image 168
user2672763 Avatar answered Mar 10 '26 14:03

user2672763



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!