Java 在Scala上使用ECDSA签名验证SHA1

Java 在Scala上使用ECDSA签名验证SHA1,java,scala,digital-signature,ecdsa,key-pair,Java,Scala,Digital Signature,Ecdsa,Key Pair,我正在尝试编写创建公钥/私钥、签名和验证ECDSA签名的简单代码。我不知道为什么验证返回false。请帮帮我 **我还尝试将提供者设置为“SunEC”,但它仍然不起作用 val signatureECDSA = "SHA1withECDSA" val signatureInstance = Signature.getInstance(signatureECDSA) def sign(text: String, privateKey: PrivateKey): Array[Byte] = {

我正在尝试编写创建公钥/私钥、签名和验证ECDSA签名的简单代码。我不知道为什么验证返回false。请帮帮我

**我还尝试将提供者设置为“SunEC”,但它仍然不起作用

val signatureECDSA = "SHA1withECDSA"

val signatureInstance = Signature.getInstance(signatureECDSA)

def sign(text: String, privateKey: PrivateKey): Array[Byte] = {

  signatureInstance.initSign(privateKey)
  signatureInstance.update(text.getBytes("UTF-8"))
  signatureInstance.sign
}

def verify(signature: Array[Byte], publicKey: PublicKey): Boolean = {

  signatureInstance.initVerify(publicKey)
  signatureInstance.verify(signature)
}

def createPrivatePublicKeyPair(): Unit = {

  val keyGen = KeyPairGenerator.getInstance("EC")
  val ecSpec = new ECGenParameterSpec("secp256k1")
  keyGen.initialize(ecSpec)

  val keyPair = keyGen.generateKeyPair
  val publicKey = keyPair.getPublic
  val privateKey = keyPair.getPrivate

  val ecPrivateKey = privateKey.asInstanceOf[ECPrivateKey]
  val ecPublicKey = publicKey.asInstanceOf[ECPublicKey]

  val msg = "This is a message"

  val signature = sign(msg, ecPrivateKey)

  System.out.println("Signature: " + new BigInteger(1, signature).toString(16))

  val result = verify(signature, ecPublicKey)
  System.out.println("public key matched with signature " + result)
}

签名确实以某种方式封装了数据上的散列。对于RSA签名,哈希仅包含在签名中。在ECDSA的情况下,哈希在签名计算中使用,无法检索,但它当然仍然可以用于验证签名


签名中不包括的是计算签名所依据的数据。相反,您需要在验证方法中使用
signatureInstance.update(text.getBytes(“UTF-8”))
提供数据,就像在生成签名的方法中一样。

您必须根据公钥和签名的数据验证任何数字签名,包括ECDSA。将相同的数据传递给signatureInstance。在verify中更新,就像在sign中更新一样。@dave_thompson_085谢谢,现在它提供了答案,以便将问题标记为已回答。如果您同意,请标记为已接受;我把它作为社区维基放进去了,所以我不会因此而出名。