title: Base64 encoded string to Public Key using RSA From C# to Java
body: <p>I am converting legacy application from .net to java.  Legacy method using encryption using public key.</p>
  
  <pre class="lang-cs prettyprint-override"><code>string text = "&lt;base64encodedstring here&gt;";
  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);
  </code></pre>
  
  <p>Here is my Java code to convert the given <strong>text</strong> into the public key</p>
  
  <pre class="lang-java prettyprint-override"><code>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;
      }
  
  }
  </code></pre>
  
  <p>Here is my main method</p>
  
  <pre class="lang-java prettyprint-override"><code>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();
      }
  }
  </code></pre>
  
  <p>But When I try to get the public key I get the exception below</p>
  
  <pre><code>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)
  </code></pre>
  
  <p>Am I doing something wrong?  I am new to cryptography.</p>
  
  <p>With some more research I found the way how it is doing in C#, but not able to convert it into java</p>
  
  <pre><code> 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 &gt; -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;
  
      }
  </code></pre>
  
  <p>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#
  <a href="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" rel="nofollow">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</a></p>