Проверка SHA1 с подписью ECDSA на Scala

Я пытаюсь написать простой код для создания открытых/закрытых ключей, подписания и проверки подписи 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)
}

person jtheerawee    schedule 01.05.2018    source источник
comment
Вы должны сверять любую цифровую подпись, включая ECDSA, с открытым ключом И подписанными данными. Передайте те же данные signatureInstance.update при проверке, что и при подписи.   -  person dave_thompson_085    schedule 01.05.2018
comment
@dave_thompson_085 спасибо теперь работает   -  person jtheerawee    schedule 01.05.2018


Ответы (1)


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

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

person Community    schedule 11.05.2018
comment
Предоставил ответ, чтобы вопрос можно было пометить как отвеченный. Пожалуйста, отметьте как принятый, если вы согласны с этим; Я поместил его как вики сообщества, поэтому я не получу за него репутацию. - person Maarten Bodewes; 11.05.2018