在 Scala 上验证 SHA1withECDSA 签名
Verify SHA1withECDSA signature on Scala
我正在尝试编写用于创建 public/private 密钥、签名和验证 ECDSA 签名的简单代码。我不知道为什么验证 returns 错误。请帮助我。
** 我也尝试将提供程序设置为 "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"))
提供数据,就像在生成签名的方法中一样。
我正在尝试编写用于创建 public/private 密钥、签名和验证 ECDSA 签名的简单代码。我不知道为什么验证 returns 错误。请帮助我。
** 我也尝试将提供程序设置为 "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"))
提供数据,就像在生成签名的方法中一样。