Android验证签名始终返回false

时间:2018-01-17 20:03:00

标签: java public-key-encryption signature spongycastle

我正在尝试使用ECDSA和spongycastle验证一些已签名的内容。这是我用来生成带有brainpoolP512t1 ec曲线的密钥对的代码:

public static KeyPair getKeyPairbrainpoolP512t1() throws Exception {
    KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("EC", "SC");
    ECNamedCurveParameterSpec curveParameterSpec = ECNamedCurveTable.getParameterSpec("brainpoolP512t1");
    keyPairGenerator.initialize(curveParameterSpec, new SecureRandom());
    return keyPairGenerator.generateKeyPair();
}

以下是我用于签名和验证签名的代码:

private byte[] ecdsaSign(ECPrivateKey key, byte[] content) throws Exception {
    Signature ecdsaSign = Signature.getInstance("SHA256withECDSA", "SC");
    ecdsaSign.initSign(key);
    ecdsaSign.update(content);
    byte[] signature = ecdsaSign.sign();

    return signature;
}

public static boolean ecdsaVerify(ECPublicKey key, byte[] content, byte[] signature) throws Exception {
    Signature ecdsaVerify = Signature.getInstance("SHA256withECDSA", "SC");
    ecdsaVerify.initVerify(key);
    ecdsaVerify.update(content);
    boolean result = ecdsaVerify.verify(signature);
    return result;
}

我传入的是使用私钥签名的简单字符串消息的字节,还有公钥以验证。然而,我总是变得虚假。我究竟做错了什么?非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

弄清楚出了什么问题。我正在将密钥导出到PEM,以便在调用sign和verify之前将它们以字符串格式导出,然后解码回私钥原始格式。当我省略了这个转换并直接使用私钥调用Verify(没有PEM字符串来回转换)时,内容得到了验证。