Проверьте подпись SHA1 с помощью ECDSA на Scala - PullRequest
0 голосов
/ 01 мая 2018

Я пытаюсь написать простой код для создания открытых / закрытых ключей, подписи и проверки подписи ECDSA. Я понятия не имею, почему проверка возвращает ложь. Пожалуйста, помогите мне.

** Я также пытался установить провайдер на «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)
}

1 Ответ

0 голосов
/ 11 мая 2018

Подпись действительно так или иначе инкапсулирует хеш поверх данных . В случае подписей RSA хэш просто содержится в подписи. В случае ECDSA хеш используется в вычислении подписи и не может быть получен, но, конечно, он все еще может использоваться для проверки подписи.

Что не входит в подпись, так это данные, по которым рассчитывается подпись. Вместо этого вам нужно предоставить данные, используя signatureInstance.update(text.getBytes("UTF-8")) в методе проверки, так же, как в методе, который генерирует подпись.

...