2017-06-22 92 views
3

我需要驗證由ECDSA secp256k1曲線遠程生成的簽名。我得到64個字節,代表r和s的原始字節。和ANSI X9.62編碼的公鑰([0x04, X (32 bytes), Y (32 bytes)])。如何使用這些數據驗證簽名?從ANSI X9.62編碼字節構造ECPublicKey

回答

1

假設你已經有X和Y BigIntegers:

// Create the W point 
ECPoint w = new ECPoint(x, y); 

// Create the ECField from hey integer (p) 
ECField field = new ECFieldFp(new BigInteger("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F", 16)); 

// Create the EllipticCurve with a and b 
EllipticCurve curve = new EllipticCurve(field, new BigInteger("0"), new BigInteger("7")); 

// Create the G point: 
BigInteger gx = new BigInteger("79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798", 16); 
    BigInteger gy = new BigInteger("483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8", 16); 
ECPoint g = new ECPoint(gx, gy); 

// Create ECParameterSpec 
ECParameterSpec spec = new ECParameterSpec(curve, new ECPoint(gx, gy), new BigInteger("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141", 16), 1); 

// Create the KeySpec: 
KeySpec keySpec = new ECPublicKeySpec(w, spec); 

// Generate the key 
KeyFactory keyFactory = KeyFactory.getInstance("EC"); 
PublicKey key = keyFactory.generatePublic(keySpec); 

這裏使用的常量可here