代码之家  ›  专栏  ›  技术社区  ›  Kuldeep Singh

使用PublicKey验证Java签名无效

  •  0
  • Kuldeep Singh  · 技术社区  · 1 年前

    我首先使用私钥对字符串消息进行了签名,然后使用公钥验证签名消息。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;
        }
    }
    
    
    0 回复  |  直到 1 年前