tags:

views:

250

answers:

3

I using:

  • c#: RSACryptoServiceProvider
  • JAVA: KeyFactory.getInstance("RSA")+Cipher

I sending public key (exponent + modulus) as byte array from java to c#. It's ok, there is the same bytes. But when i try to encrypt some data with one key in Java and c# - there is different results.

Java Key Generation:

KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
keyGen.initialize( Config.CRYPTO_KEY_NUM_BITS );

m_KeyPair = keyGen.genKeyPair();

m_PublicKey = KeyFactory.getInstance("RSA").generatePublic(
 newX509EncodedKeySpec(m_KeyPair.getPublic().getEncoded()));

byte[] exponent = m_PublicKey.getPublicExponent().toByteArray();
byte[] modulus  = m_PublicKey.getModulus().toByteArray(); // then sending...

C# Key Recieve:

// Recieved...
m_ExternKey = new RSAParameters();
m_ExternKey.Exponent    = exponent;
m_ExternKey.Modulus     = modulus;

m_RsaExtern = new RSACryptoServiceProvider();
m_RsaExtern.ImportParameters(m_ExternKey);

byte[] test = m_RsaExtern.Encrypt(bytesToEncrypt, true);

and problem is that encrypted bytes is different.

Thank you.

A: 

RSA Encription mustn't return diffferent values with simular keys - its standardized algorithm. Check your keys.

Stremlenye
normally padding with random data is added before RSA encryption (see pkcs #1, OAEP).
stmax
A: 

RSA Parameters contains more parameters than modulus and exponent if i remember correctly. You need fully initialized rsa parameters to get the encryption correct (in .net).

Moreover, your private and private key is not even set in .net

Henri
yes, but as I know, RSA needs just public exponent and modulus to encrypt. other parameters is for decryption.
ActioN
In theory, yes, but it might be that the implementation requires more. I would just try to use a certificate containing a private key and use that certificate to do the encryption.
Henri
+3  A: 

RSA encryption is randomized. For a given public key and a given message, each attempt at encryption yields a distinct sequence of bytes. This is normal and expected; random bytes are injected as part of the padding phase, and not injecting random bytes would result in a weak encryption system. During decryption, the padding bytes are located and removed, and the original message is recovered unscathed.

Hence it is expected that you will get distinct encrypted messages with Java and C#, but also if you run your Java or C# code twice.

Thomas Pornin
+1 i haven't tried it but i'm also pretty sure that randomized padding is causing this.
stmax