RSA криптография между Java и C# приложениями

Почему при генерации RSA ключа длиной 512 бит в C# и в Java разная длина в байтах публичного ключа?

Пример кода C#:

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(512); XDocument xdocPub = XDocument.Parse(rsa.ToXmlString(false)); string publicKey = xdocPub.Element("RSAKeyValue").Element("Modulus").Value;  byte[] publicArray = Convert.FromBase64String(publicKey); Console.WriteLine("Public Key Byte Array Length: " + publicArray.Length); Console.WriteLine("Public Key Base64 Length: " + publicKey.Length); Console.WriteLine("Public Key Text: " + publicKey); 

Результат:

Public Key Byte Array Length: 64 Public Key Base64 Length: 88 Public Key Text: uELcIjgR6GpiayZ1wHruHOtO8dpg+xmg85VAvunWUEL+aifoyk9+CA/dez4UmuIwLEgRlpVoIIOD0e5i9v8lrQ== 

Пример кода Java:

final KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA"); keyGen.initialize(new RSAKeyGenParameterSpec(512, RSAKeyGenParameterSpec.F4)); KeyPair pair = keyGen.genKeyPair();  final byte[] arrayPublic = ((RSAPublicKey) pair.getPublic()).getModulus().toByteArray();  System.out.println("Public Key [origin] lenght: " + arrayPublic.length);  String publicBase64 = Base64.getEncoder().encodeToString(arrayPublic);  System.out.println("Public Key [base64] lenght : " + publicBase64.length()); System.out.println("Public Key [base64]: " + publicBase64); 

Результат:

Public Key [origin] lenght: 65 Public Key [base64] lenght : 88 Public Key [base64]: ANuun1/CnOmk2ghsydz4cKvPCd7q0YqqeyjzLqtKx7QHqv1tFjJYsXquYGcY8zkaPsPBrRlCAJov7+J88GaFDKc= 

Заметил, что в байт массиве ключа сгенерированного в Java присутствует нулевой байт в начале массива ключа.

Самое интересное, что если я отправляю ключ из C# приложения длиной 64 байта, то в Java приложении получаю ошибку “exponent is larger than modulus” в следующем коде:

try {     final KeyFactory kfac = KeyFactory.getInstance("RSA");     final BigInteger modulus = new BigInteger("здесь вставляется byte[] массив публичного ключа от C#");     final RSAPublicKeySpec kspec1 = new RSAPublicKeySpec(modulus, RSAKeyGenParameterSpec.F4);      RSAPublicKey publicKey = (RSAPublicKey) kfac.generatePublic(kspec1); } catch (GeneralSecurityException e) {     e.printStackTrace(); } 

При этом, если я добавлю нулевой байт в начало ключа перед отправкой из C# приложения в Java приложение, то со стороны Java приложения нет никаких проблем с инициализацией криптографии и шифровкой отправляемых данных. Но в этом случае я не могу декодировать входящие данные в C# приложении этим же экземпляром криптографии. Получаю ошибку “Плохие данные”.

Подскажите, что я делаю не так и почему длина ключей разная?