java验证RSA公钥提示InvalidKeySpecException的一个原因之一

最近一个项目要用一个RSA公钥对签名过的文件进行验证。公钥如下:
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtohucPE/IWn+S+nFbMvQ
L8cGcxltm+AJsSQS1W+o1uMALERPnQt2Xas5zVxiFUCx9IBatkR+l/3yVSFwCfEd
mFmIzkR2Y6sgL3DWfZ3ff7KK6rbL5hYw10n+AGp+/JfDmlWx2ANQmTG0djX8MsQo
Nb6OgHko3pO8w6TJ2VzFMKPGOpIavIN8Q7euSZiuzsQl/IP0acW9c601lQxP0cnA
1KbtpDlm37cOgVIpc51NaQU660WpR6UitNcXM+rrPCdOMKBS8LwXKT6p8SDt5ojD
1aJA6sNr1cHRoL+UI+bCX+WwRYdgv+dZM0+4+RNNejGJ+ecFP6NAigXrIDR3Caih
GwIDAQAB
-----END PUBLIC KEY-----

于是找了公钥加载的java函数方法,如下:
/**
* 从字符串中加载公钥
*
* @param publicKeyStr
* 公钥数据字符串
* @throws Exception
* 加载公钥时产生的异常
*/
public static void loadPublicKey(String publicKeyStr) throws Exception {
try {
BASE64Decoder base64Decoder = new BASE64Decoder();
byte[] buffer = base64Decoder.decodeBuffer(publicKeyStr);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(buffer);
publicKey = (RSAPublicKey) keyFactory.generatePublic(keySpec);
} catch (NoSuchAlgorithmException e) {
throw new Exception("无此算法");
} catch (InvalidKeySpecException e) {
throw new Exception("公钥非法");
} catch (IOException e) {
throw new Exception("公钥数据内容读取错误");
} catch (NullPointerException e) {
throw new Exception("公钥数据为空");
}
}

在加载的时候用了如下方法获取公钥内容:
private static String readFileToString(String filePath) {
BufferedReader reader = null;
StringBuilder fileData = null;
try {
fileData = new StringBuilder(1000);
reader = new BufferedReader(new FileReader(filePath));

        char[] buf = new char[1024];
        int numRead = 0;
        while ((numRead = reader.read(buf)) != -1) {
            String readData = String.valueOf(buf, 0, numRead);
            fileData.append(readData);
            buf = new char[1024];
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        try {
            if (null != reader)
                reader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    return fileData.toString();
}

然后调用loadPublicKey函数对上面的获取的字符串进行解析成RSAPublicKey,于是报了InvalidKeySpecException异常。
后面发现是由于loadPublicKey只需要解析的字符串不能有回车换行和空格,只要传入公钥内容即可。于是把公钥中的
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtohucPE/IWn+S+nFbMvQ
L8cGcxltm+AJsSQS1W+o1uMALERPnQt2Xas5zVxiFUCx9IBatkR+l/3yVSFwCfEd
mFmIzkR2Y6sgL3DWfZ3ff7KK6rbL5hYw10n+AGp+/JfDmlWx2ANQmTG0djX8MsQo
Nb6OgHko3pO8w6TJ2VzFMKPGOpIavIN8Q7euSZiuzsQl/IP0acW9c601lQxP0cnA
1KbtpDlm37cOgVIpc51NaQU660WpR6UitNcXM+rrPCdOMKBS8LwXKT6p8SDt5ojD
1aJA6sNr1cHRoL+UI+bCX+WwRYdgv+dZM0+4+RNNejGJ+ecFP6NAigXrIDR3Caih
GwIDAQAB 整合成一个不含回车空格的字符串即可。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Base64.java public final class Base64 { static private ...
    BUG弄潮儿阅读 819评论 0 0
  • 首先还是科普一下RSA RSA加密算法 这里有一篇文章详解了RSA加密算法的数学理论支持 详细解读RSA算法 放上...
    抢你辣条阅读 888评论 0 2
  • 50道经典Java编程练习题,将数学思维运用到编程中来。抱歉哈找不到文章的原贴了,有冒犯的麻烦知会声哈~ 1.指数...
    OSET我要编程阅读 7,022评论 0 9
  • 1. ASCII 编码 ASCII(American Standard Code for Information ...
    s酸菜阅读 8,724评论 0 8
  • 前言 自学了4个多月的安卓,试着写了一个小程序,虽然功能按照预想基本实现了,但是也很清楚代码质量肯定不好。在...
    maxwellyue阅读 59,749评论 2 16