he encontrado la solución, para lograr primero hay que convertir el formato de clave pública como punto net utiliza tipo de clave diferente como una entrada.
No conozco las otras formas, pero podemos obtener la clave de formato dot net usando un código java que debe ejecutarse solo una vez para generar la clave pública RSA friendly. (esto sólo se recomienda cuando el público dado no hacer cambios rápidamente, por ejemplo en caso de Android mercado de facturación en la aplicación)
siguiente código Java trabajó para mí
public static DotNetRSA GenerateDotNetKey(String base64PubKey)
throws IOException, NoSuchAlgorithmException,
InvalidKeySpecException {
/*
* String base64PubKey -
* Is a Key retrieved from Google Checkout Merchant Account
*/
BASE64Decoder decoder = new BASE64Decoder();
byte[] publicKeyBytes = decoder.decodeBuffer(base64PubKey);
EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(publicKeyBytes);
RSAPublicKey publicKey = (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(publicKeySpec);
byte[] modulusBytes = publicKey.getModulus().toByteArray();
byte[] exponentBytes = publicKey.getPublicExponent().toByteArray();
modulusBytes = stripLeadingZeros(modulusBytes);
BASE64Encoder encoder = new BASE64Encoder();
String modulusB64 = encoder.encode(modulusBytes);
String exponentB64 = encoder.encode(exponentBytes);
return new DotNetRSA(modulusB64, exponentB64);
}
private static byte[] stripLeadingZeros(byte[] a) {
int lastZero = -1;
for (int i = 0; i < a.length; i++) {
if (a[i] == 0) {
lastZero = i;
}
else {
break;
}
}
lastZero++;
byte[] result = new byte[a.length - lastZero];
System.arraycopy(a, lastZero, result, 0, result.length);
return result;
}
Ahora para verificar la firma digital que pueda utilizar el siguiente código en su programa de la red del punto (C#) proporcionan GCHO_PUB_KEY_EXP es su exponente y GCHO_PUB_KEY_MOD es su módulo extraído por encima del código de Java
public static bool VerifyDataSingature(string data, string sign)
{
using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
{
RSAParameters rsaKeyInfo = new RSAParameters()
{
Exponent = Convert.FromBase64String(GCHO_PUB_KEY_EXP),
Modulus = Convert.FromBase64String(GCHO_PUB_KEY_MOD)
};
rsa.ImportParameters(rsaKeyInfo);
return rsa.VerifyData(Encoding.ASCII.GetBytes(data),
"SHA1",
Convert.FromBase64String(sign));
}
}
espero que funcione para todos, ya que funcionó para mí. Gracias
mérito es de Code Project Artical
Gracias por la solución! Es muy útil. – Michael
¿Qué sucede si 'data' contiene caracteres que no son ASCII? Desde el nombre de la publicación, supongo que 'data' contendrá JSON, que es una cadena y permite caracteres que no sean ASCII. –
@Ivan Akcheurov: no estoy seguro, este es definitivamente el primer borrador del código. entonces tal error es esperado. No recuerdo haber modificado el código yo mismo. –