Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/203.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java BouncyCastle上的ECDSA始终返回true_Java_Android_Digital Signature_Elliptic Curve - Fatal编程技术网

Java BouncyCastle上的ECDSA始终返回true

Java BouncyCastle上的ECDSA始终返回true,java,android,digital-signature,elliptic-curve,Java,Android,Digital Signature,Elliptic Curve,我有一个android程序,可以将ECDSA数据写入NFC标记并签名,还有一个程序可以读取数据并验证NFC标记的签名。 我设法将数据写入NFC标记并签名,但每当我尝试验证签名时,程序总是返回true,即使我故意更改了签名。 有人能告诉我怎么了吗 以下是我用来签名的代码: public static String Generate(String x) throws Exception{ KeyPairGenerator kpg; kpg = KeyPairGenerator.get

我有一个android程序,可以将ECDSA数据写入NFC标记并签名,还有一个程序可以读取数据并验证NFC标记的签名。
我设法将数据写入NFC标记并签名,但每当我尝试验证签名时,程序总是返回
true
,即使我故意更改了签名。
有人能告诉我怎么了吗

以下是我用来签名的代码:

public static String Generate(String x) throws Exception{
    KeyPairGenerator kpg;
    kpg = KeyPairGenerator.getInstance("EC","BC");
    ECGenParameterSpec ecsp;
    ecsp = new ECGenParameterSpec("prime192v1");
    kpg.initialize(ecsp); 

    KeyPair kp = kpg.genKeyPair();
    PrivateKey privKey = kp.getPrivate();

    Signature ecdsaSign;
    ecdsaSign = Signature.getInstance("SHA256withECDSA");
    ecdsaSign.initSign(privKey);
    byte[] baText = x.getBytes("UTF-8");

    ecdsaSign.update(baText);
    byte[] baSignature = ecdsaSign.sign();
    String signature = (new BigInteger(1,baSignature).toString(16)).toUpperCase();
    return signature;
}
下面是我用来验证的代码:

public static boolean Verify(String x) throws Exception{
    KeyPairGenerator kpg;
    kpg = KeyPairGenerator.getInstance("EC","BC");
    ECGenParameterSpec ecsp;
    ecsp = new ECGenParameterSpec("prime192v1");
    kpg.initialize(ecsp);

    KeyPair kp = kpg.genKeyPair();
    PrivateKey privKey = kp.getPrivate();
    PublicKey pubKey = kp.getPublic();

    Signature ecdsaSign;
    ecdsaSign = Signature.getInstance("SHA256withECDSA");
    ecdsaSign.initSign(privKey);

    byte[] baText = x.getBytes("UTF-8");
    ecdsaSign.update(baText);
    byte[] baSignature = ecdsaSign.sign();

    Signature ecdsaVerify;
    ecdsaVerify = Signature.getInstance("SHA256withECDSA");
    ecdsaVerify.initVerify(pubKey);
    ecdsaVerify.update(baText);
    boolean result = ecdsaVerify.verify(baSignature);
    return result;
}

您的验证方法实际上没有任何意义。它生成自己的密钥对,然后创建自己的签名,然后立即验证它。看起来你只是复制了一个例子,却没有试图去理解它。@GregS是的,我注意到我的代码确实有缺陷,我正在试图弄清楚我必须做些什么才能使它正常工作。我知道要验证签名,您需要公钥,但在验证android活动中,如何在签名android活动中使用公钥?