`
yuankai
  • 浏览: 106057 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

证书加密解密

    博客分类:
  • java
阅读更多
开始以为可以对文件进行加密,使用后发现不支持文件加密,其中证书类型是浏览器支持的XX.p12证书,现在正在研究Itext使用证书签名加密pdf文件,找了很多资料,这方面的资料实在是太少了。
  
 /**
     * 证书加密解密(不能对文件加密,这个只能对一小段字符加密解密)
     * @param certPath    证书路径
     * @param password    证书密码
     */
    private static void encrypAndDecryption(String certPath,String certPassWord,String encryptData){
        //此类表示密钥和证书的存储设施
        KeyStore keyStore;
        String alias = "";
        //String testEncrypt = "certificate encrypt decryption";
        System.out.println("加密前: " + encryptData);
        try {
            FileInputStream is = new FileInputStream(certPath);
            //得到KeyStore实例
            keyStore = KeyStore.getInstance("PKCS12");
            //从指定的输入流中加载此 KeyStore。
            keyStore.load(is, certPassWord.toCharArray());
            is.close();
            //获取keyStore别名
            alias = (String)keyStore.aliases().nextElement();
            Certificate cert = keyStore.getCertificate(alias);
            //根据给定别名获取相关的私钥
            PrivateKey priKey = (PrivateKey)keyStore.getKey(alias, certPassWord.toCharArray());
            //获取证书的公钥
            PublicKey pubKey = cert.getPublicKey();
            //获取Cipher的实例 getInstance(算法/模式/填充)或getInstance("算法")
            Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
            //公钥初始化Cipher 公钥加密
            cipher.init(Cipher.ENCRYPT_MODE, pubKey);
            //加密
            byte [] encodeEncryp = cipher.doFinal(encryptData.getBytes());
            System.out.println("加密后: " + new String(encodeEncryp));
            //encodeEncryp = cipher.doFinal(getFileContentToByte(encrypFile));
            //私钥初始化Cipher 私钥解密
            cipher.init(Cipher.DECRYPT_MODE, priKey);
            //解密
            byte [] encodeDecryption = cipher.doFinal(encodeEncryp);
            
            String content = new String(encodeDecryption);
            System.out.println("解密后: " + content + "length: " + content.length());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

下面有个测试用的certificate.
分享到:
评论
4 楼 yuankai 2008-12-02  
fjlyxx 写道

代码没看过.不过提两点意见.1.文件中是否有中文,如果有建议进行BASE64转换.2.建议不要使用Cipher,不同中间件的实现是不同的,修改JVM安全文件有可能会影响中间件的安全机制,所以最好自己去实现RSA.再有 你说密码是12345678 好像RSA是一个密码对吧?模和素数. 共需要三个密码.

有中文的,处理中文Itext已经封装好了,有个包。
至于修改jvm的sucerity文件是因为sun不提供这种加密算法才修改的,jce只限于美国和加拿大地区使用。
Cipher 这个类也是Itext包封装好的类,这个因该不会有什么问题的。
我说的密码是证书的密码,这是在CA发布这张证书的时候设置的密码,这张证书只是个私钥而已。
很谢谢你给提的意见。
3 楼 fjlyxx 2008-12-02  
代码没看过.不过提两点意见.

1.文件中是否有中文,如果有建议进行BASE64转换.
2.建议不要使用Cipher,不同中间件的实现是不同的,修改JVM安全文件有可能会影响中间件的安全机制,所以最好自己去实现RSA.

再有 你说密码是12345678 好像RSA是一个密码对吧?模和素数. 共需要三个密码.
2 楼 yuankai 2008-12-02  
edisonwin 写道

密码是多少??

密码是12345678
1 楼 edisonwin 2008-11-05  
密码是多少??

相关推荐

Global site tag (gtag.js) - Google Analytics