gpt4 book ai didi

java - 使 MessageDigest 和 Cipher 等同于 java.security.Signature

转载 作者:行者123 更新时间:2023-12-01 10:35:51 25 4
gpt4 key购买 nike

我想使用 RSA 作为密码算法和 SHA-1 作为哈希函数来实现我自己的签名函数,为此我实现了这两个函数:

public byte[] mySign(byte[] aMessage){
try{
// get an instance of a cipher with RSA with ENCRYPT_MODE
// Init the signature with the private key
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, this.thePrivateKey);

// get an instance of the java.security.MessageDigest with sha1
MessageDigest meassDs = MessageDigest.getInstance("SHA-1");

// process the digest
meassDs.update(aMessage);
byte[] digest = meassDs.digest();

byte [] signature = cipher.doFinal(digest);

// return the encrypted digest
return signature;

}catch(Exception e){
System.out.println(e.getMessage()+"Signature error");
e.printStackTrace();
return null;
}

}



public boolean myCheckSignature(byte[] aMessage, byte[] aSignature, PublicKey aPK){
try{
// get an instance of a cipher with RSA with DECRYPT_MODE
// Init the signature with the public key
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, aPK);

// decrypt the signature
byte [] digest1 = cipher.doFinal(aSignature);

// get an instance of the java.security.MessageDigest with sha1
MessageDigest meassDs = MessageDigest.getInstance("SHA-1");

// process the digest
meassDs.update(aMessage);
byte[] digest2 = meassDs.digest();

// check if digest1 == digest2
if (digest1 == digest2)
return true;
else
return false;

}catch(Exception e){
System.out.println("Verify signature error");
e.printStackTrace();
return false;
}
}

然后,当我使用这些函数时,我总是得到 false 结果,这意味着我的函数无法正常工作:

byte[] message = "hello world".getBytes();
byte[] signature;

signature = mySign(message );
boolean bool = myCheckSignature(message , signature, thePublicKey);
System.out.println(bool);

最佳答案

虽然您的要求

to implement a method to create a signature using an alternative to java.security.Signature

整体上是有问题的(正如您问题的评论中提到的),您的解决方案可以改进。

特别是您的 myCheckSignature 代码中存在错误:

// check if digest1 == digest2
if (digest1 == digest2)
return true;
else
return false;

(digest1 ==digest2) 检查是否有相同的数组对象,而不是是否有两个内容相同的数组

你真正想做的是

if (Arrays.equals(digest1, digest2))
return true;
else
return false;

或更紧凑

return Arrays.equals(digest1, digest2);

Arraysjava.util 包中的实用程序类。

<小时/>

顺便说一下,你是这样的

byte[] message = "hello world".getBytes();

getBytes 未显式选择字符编码可能会导致在不同平台或不同 Java 版本上出现不同的结果。在这种情况下不应该发生的事情!

关于java - 使 MessageDigest 和 Cipher 等同于 java.security.Signature,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34741668/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com