我首先使用私钥对字符串消息进行了签名,然后使用公钥验证签名消息。verify返回false,它应该验证true。我在下面附上了使用的代码。我是密码学的新手,不确定我是否遵循了这里的逻辑。谢谢你的时间和帮助。
import java.math.BigInteger;
import java.nio.charset.StandardCharsets;
import java.security.*;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.RSAPrivateKeySpec;
import java.security.spec.RSAPublicKeySpec;
import java.util.Base64;
public class JWT2 {
public static void main(String[] args) throws Exception {
String plainTextMessage = "A Secret!";
String n = "nsvTaplDkhFc-M1T-9EUtPPmzHsEvxFtiyZO9XXpx6HbU3NSIquvKAetH6LFteKGGqnF_XV2Qs9lQ2ZSI57YUyvFSWAiNoxT9a36smm71lxm8slvu6K6WGnQlKzCWZ0AxWqAB2lHUsff_OgXCOam9rGMizCQAuTyowvY6XtMswLB-FoVyRaM2zoRPo9_dEeu1y1Cyn8Bu2Ff02mGX_rP0J_UZM1OH1GpjfP4IU51ToqxZx-ZeTZsIoSgd7xfSt5vMS-Q-kvVWXcljoPyNEZ3vegwPHwXUMI4xKPpaXqZzuChfDFHIHwsSafwbCfcx0CHBURuYbjNYjeCBgtbPtaLCw";
e = "AQAB";
byte[] signedMessageBytes = signMessage(plainTextMessage, generatePrivateKey(n, e));
boolean isMsgValid = verifySignedMessage(plainTextMessage.getBytes(StandardCharsets.UTF_8), signedMessageBytes, generatePublicKey(n, e));
System.out.println("isMsgValid = " + isMsgValid);
}
static boolean verifySignedMessage(byte[] plainTextMessagebytes, byte[] signedMessageBytes, PublicKey publicKey) throws Exception {
Signature signature = Signature.getInstance("SHA256withRSA");
signature.initVerify(publicKey);
signature.update(plainTextMessagebytes);
return signature.verify(signedMessageBytes);
}
static byte[] signMessage(String plainTextMessage, PrivateKey privateKey) throws Exception {
Signature signature = Signature.getInstance("SHA256withRSA");
signature.initSign(privateKey);
signature.update(plainTextMessage.getBytes(StandardCharsets.UTF_8));
return signature.sign();
}
static PublicKey generatePublicKey(String modulus, String publicExponent) throws NoSuchAlgorithmException, InvalidKeySpecException {
BigInteger n = new BigInteger(1, Base64.getUrlDecoder().decode(modulus));
BigInteger e = new BigInteger(1, Base64.getUrlDecoder().decode(publicExponent));
PublicKey pk = KeyFactory.getInstance("RSA").generatePublic(new RSAPublicKeySpec(n, e));
return pk;
}
static PrivateKey generatePrivateKey(String modulus, String publicExponent) throws NoSuchAlgorithmException, InvalidKeySpecException {
BigInteger n = new BigInteger(1, Base64.getUrlDecoder().decode(modulus));
BigInteger e = new BigInteger(1, Base64.getUrlDecoder().decode(publicExponent));
PrivateKey pk = KeyFactory.getInstance("RSA").generatePrivate(new RSAPrivateKeySpec(n, e));
return pk;
}
}