Я пытаюсь сгенерировать подпись RSA SHA512 на своем серверном приложении (написано в C#) и проверить эту подпись на клиентском приложении (написано в Java). Перед обменом сигнатурами сервер генерирует пару publi c - и секретный ключ и делится ключом publi c с клиентским приложением, передавая ему значения модуля и экспоненты, которые были сгенерированы. Клиентское приложение сохраняет значения для последующего использования, когда необходимо проверить подпись.
Сервер генерирует 128-байтовый модуль и 128-байтовую подпись. Я просто использую байтовый массив [0x00, 0x01, 0x02, 0x03] в качестве исходных данных для подписи во время тестирования.
По какой-то причине мое приложение Java всегда терпит неудачу при проверке подпись.
Мой C# код (создает подпись):
RSACryptoServiceProvider crypto = new RSACryptoServiceProvider();
crypto.FromXmlString(this.myStoredPrivateKeyXml);
List<byte> signatureBytes = new List<byte>();
signatureBytes.Add(0x00);
signatureBytes.Add(0x01);
signatureBytes.Add(0x02);
signatureBytes.Add(0x03);
byte[] signature = crypto.SignData(signatureBytes.ToArray(), "SHA512");
Мой Java код (который получает / проверяет подпись):
byte[] expectedData = new byte[4];
expectedData[0] = 0;
expectedData[1] = 1;
expectedData[2] = 2;
expectedData[3] = 3;
byte[] exponent = getStoredExponent(); // three-byte value from server
byte[] modulus = getStoredModulus(); // 128-byte value from server
RSAPublicKeySpec spec = new RSAPublicKeySpec(new BigInteger(modulus), new BigInteger(exponent));
PublicKey publicKey = KeyFactory.getInstance("RSA").generatePublic(spec);
Signature verifier = Signature.getInstance("SHA512withRSA");
verifier.initVerify(publicKey);
verifier.update(expectedData);
if(verifier.verify(signature)) {
System.out.println("signature verified");
} else {
System.out.println("signature failed verification"); // always ends up here :(
}
Криптообъекты на стороне C# взяты из пространства имен System.Security.Cryptography и java .security на стороне Java.
Байты передаются между приложениями через веб-сервисы и строки base64. Я просмотрел и напечатал значения самих байтовых массивов, чтобы убедиться, что значения правильны для показателя степени, модуля и сигнатуры между двумя приложениями. Есть ли причина, по которой подпись не будет совместима между двумя языками / приложениями? Может, я пропускаю какой-то параметр? Я сделал их оба RSA с SHA512, но, возможно, нужно учитывать и другие аспекты подписи?