我正在使用Bouncycastle的C#Xamarin.iOS / Mono.Android端口,并且尝试使用secp256r1曲线和我在iOS / Android设备上本地拥有的给定公钥来验证ECC签名。
签名生成是在具有单独私钥的远程设备上完成的,并通过BLE链接将其发送给我。收到后,我尝试使用以下代码进行验证。
myLocalPublicKey
和'signatureFromDevice'是byte[]
并在其他位置设置
bool verify(byte[] signatureFromDevice)
{
bool status = false;
X9ECParameters curve = SecNamedCurves.GetByName("secp256r1");
string caString = Utilities.ByteArrayToString(myLocalPublicKey).Replace(" ", "");
Console.WriteLine("------ CA PUBLIC KEY " + Utilities.ByteArrayToString(myLocalPublicKey));
ECDomainParameters curveSpec = new ECDomainParameters(curve.Curve, curve.G, curve.N, curve.H, curve.GetSeed());
byte[] hex = Hex.Decode("04" + caString);
Org.BouncyCastle.Math.EC.ECPoint q = curve.Curve.DecodePoint(hex);
ECPublicKeyParameters publicKeyParameters = new ECPublicKeyParameters(q, curveSpec);
var signer = SignerUtilities.GetSigner("SHA-256withECDSA");
signer.Init(false, publicKeyParameters);
signer.BlockUpdate (message, 0, message.Length);
Console.WriteLine("------ SIGNATURE TO BE VERIFIED " + Utilities.ByteArrayToString(signatureFromDevice));
status = signer.VerifySignature(signatureFromDevice) // returns false
return status;
}
但是在运行时,verifySignature()总是返回false
但是,由于ECPublicKeyParameters,ECPoint和ECurve似乎都在正常实例化,因此我尚未在线找到该场景的任何API文档和/或示例或下一步要检查的内容。有人从经验等中有任何想法吗?谢谢!