Java:ECDSA签名验证返回不一致的结果

Java:ECDSA签名验证返回不一致的结果,java,digital-signature,ecdsa,Java,Digital Signature,Ecdsa,注意:我曾尝试使用“ECDSA验证”搜索侧面,但发布的问题是,使用来自软件包或框架的服务,而不是纯粹的实现,这就是我提出此问题的原因 所以,基本上,我想在每次发送信息时签名。。。我如何发送和签名的代码如下 发送消息 send.setOnClickListener(新视图.OnClickListener(){ @凌驾 公共void onClick(视图){ 字符串messageContent=typeMessage.getText().toString(); 字符串符号=新字符串(); final

注意:我曾尝试使用“ECDSA验证”搜索侧面,但发布的问题是,使用来自软件包或框架的服务,而不是纯粹的实现,这就是我提出此问题的原因

所以,基本上,我想在每次发送信息时签名。。。我如何发送和签名的代码如下

发送消息

send.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
字符串messageContent=typeMessage.getText().toString();
字符串符号=新字符串();
final biginger dA=biginger.probablePrime(192,new Random());
ecdsa.setdA(dA);
点QA=新点();
QA=ecdsa.getQA();
Sign=ecdsa.SignMessage(messageContent);
如果((!messageContent.equals(“”)&&(ecdsa.MessageVerify(messageContent,Sign))){
Map messageTextBody=newhashmap();
messageTextBody.put(“Message”,messageContent);
messageTextBody.put(“用户”,用户名);
messageTextBody.put(“签名”,Sign);
reference1.push().setValue(messageTextBody);
reference2.push().setValue(messageTextBody);
typeMessage.setText(“”);
}否则{
Toast.makeText(getApplicationContext(),“您不是发件人”,Toast.LENGTH\u SHORT.show();
}
}
});
问题是,每次在上述代码中验证签名时,它都会随机返回true或false,即使发送消息的用户是同一用户。。。因此,问题是:

  • 为什么结果总是随机的,即使它是由同一个用户发送的
  • 我怎样才能使它同意总是返回true,因为 发送的基本上是同一个用户
  • 下面我发布了关于签名生成和签名验证的代码,以获取更多信息

    签名生成

    //签名消息
    公共字符串签名消息(字符串消息){
    点符号=符号生成(消息);
    String signString=sign.toHexString();
    返回符号串;
    }
    //生成签名
    专用点信号生成(字符串消息){
    BigInteger k=BigInteger.0;
    BigInteger哈希=BigInteger.0;
    BigInteger r=BigInteger.0;
    BigInteger s=BigInteger.0;
    Random Random=new Random();//随机k的variabel
    点xy=新点();//kG的变量
    字符串H=GenerateShareString(消息);
    hash=新的BigInteger(H,16);//计算hash
    //散文
    做{
    k=randomBigInt(n.subtract(biginger.ONE));//生成最大范围为n-1的随机bigint
    xy=G.乘法(k);//做k*G
    r=xy.getX().mod(n);//通过从xy获取x_1并用n对其进行mod来计算r
    if(!(r.compareTo(BigInteger.ZERO)=0)){
    if(k.gcd(n).compareTo(BigInteger.ONE)==0){
    BigInteger温度=k.modInverse(n);
    s=(临时乘法((dA.multiply(r)).add(hash)).mod(n);//计算s
    }
    }
    }而((r.compareTo(biginger.ZERO)==0)| |(s.compareTo(biginger.ZERO)==0));
    点符号=新点();
    sign.setX(r);//将x值设置为r
    sign.setY(s);//将y值设置为s
    返回标志;
    }
    
    签名验证

    //验证消息签名
    公共布尔消息验证(字符串消息、字符串符号){
    int length=sign.length();
    点签名=新点();
    Signature.setX(新的biginger(sign.substring(0,长度/2),16));
    Signature.setY(新的biginger(sign.substring(长度/2),16));
    返回签名验证(消息、签名);
    }
    //签名验证
    专用布尔符号验证(字符串消息、点符号){
    //验证最大n-1范围内的r和s随机整数
    BigInteger r=sign.getX();
    BigInteger s=sign.getY();
    biginger w,u1,u2=biginger.ZERO;
    如果(((r.compareTo(biginger.ONE)>=0)和&(r.compareTo(n.subtract(biginger.ONE))=0)和&(s.compareTo(n.subtract(biginger.ONE))=0)和
    (r.compareTo(n.subtract(biginger.ONE))=0和
    
    (s.compareTo(n.subtract(biginger.ONE))如果我应该在这里发布两个点操作代码,请在这里添加注释
    Message:test
    Signature:188da80eb03090f67cbf20eb43a18800f4ff0afd82ff10127aa1eed4767a2a901f168332709baf22fc29f202527a2059
    SetX:602046282375688656758213480587526111916698976636884684818
    SetY:3006941389036669779186569967069188912278324616389591703641
    
    Message:test
    Signature: 188da80eb03090f67cbf20eb43a18800f4ff0afd82ff10126ed05452fa30cf258551fde4bc9453f7ed4fe08aa38e78d6
    SetX:602046282375688656758213480587526111916698976636884684818
    SetY:2717146143357900544226079474350104288116509888386597550294
    
    4932586797028446313791604162219331331880743384320484031523
    4995058672683066518736860284447908987220060049995439736509
    5862956776220859815493689331273390248765373547354939967957
    6201324543883668844361639115428609811595727287245749002217
    5222838399154712950243036378095036772903676114969495577797
    
    5425881164364981298041514040021735320995877440649227863027
    5470323348832879969905327607374162405372818407344053932703
    4946291572348807919810717095782002153268269929161598490177
    4769474209716033018356422804849914975531275486757124133339
    5134885695167195771629094047829365443294217726343663308709