3、B收到数据后,需要使用A提供的公钥信息进行验签,此处使用公钥的N、E进行验签

  首先通过公钥N、E得到公钥PublicKey,如下:

/**
     * 根据公钥n、e生成公钥
     * @param modulus   公钥n串
     * @param publicExponent  公钥e串
     * @return 返回公钥PublicKey
     * @throws Exception
     */
    public static PublicKey getPublickKey(String modulus, String publicExponent)
            throws Exception {
        KeySpec publicKeySpec = new RSAPublicKeySpec(
                new BigInteger(modulus, 16), new BigInteger(publicExponent, 16));
        KeyFactory factory = KeyFactory.getInstance("RSA");
        PublicKey publicKey = factory.generatePublic(publicKeySpec);
        return publicKey;
    }


  得到公钥PublicKey后,再去验证签名,代码如下:

/**
     * 用公钥证书进行验签
     * @param message  签名之前的原文
     * @param cipherText  签名
     * @param pubKeyn 公钥n串
     * @param pubKeye 公钥e串
     * @return boolean 验签成功为true,失败为false
     * @throws Exception
     */
    public static boolean verify(String message, String cipherText,String pubKeyn,
            String pubKeye) throws Exception {
        Cipher c4 = Cipher.getInstance("RSA/ECB/PKCS1Padding");
        // 根据密钥,对Cipher对象进行初始化,DECRYPT_MODE表示解密模式
        c4.init(Cipher.DECRYPT_MODE, getPublickKey(pubKeyn,pubKeye));
        // 解密
        byte[] desDecTextBytes = c4.doFinal(Base64.base64ToByteArray(cipherText));
        // 得到前置对原文进行的MD5
        String md5Digest1 = Base64.byteArrayToBase64(desDecTextBytes);
        MessageDigest md5 = MessageDigest.getInstance("MD5");
        md5.update(message.getBytes("utf-8"));
        byte[] digestBytes = md5.digest();
        // 得到商户对原文进行的MD5
        String md5Digest2 = Base64.byteArrayToBase64(digestBytes);
        // 验证签名
        if (md5Digest1.equals(md5Digest2)) {
            return true;
        } else {
            return false;
        }
    }


  至此,签名验签已经完毕

  4、提供一个从.cer文件读取公钥的方法:

/**
     * 读取公钥cer
     * @param path .cer文件的路径  如:c:/abc.cer
     * @return  base64后的公钥串
     * @throws IOException
     * @throws CertificateException
     */
    public static String getPublicKey(String path) throws IOException,
    CertificateException{
        InputStream inStream = new FileInputStream(path);
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        int ch;
        String res = "";
        while ((ch = inStream.read()) != -1) {
            out.write(ch);
        }
        byte[] result = out.toByteArray();
        res = Base64.byteArrayToBase64(result);
        return res;
    }