java 实现PGP生成公私钥对生成,以及加解密文件

介绍

最近和联通的数据生成系统对接需要使用PGP工具,网上查了资料,调了一整天终于出来了,下面介绍下使用方法以及碰到的一些的小坑

使用方法

依赖jar包

  <dependency>
            <groupId>org.bouncycastle</groupId>
            <artifactId>bcprov-jdk15on</artifactId>
            <version>1.56</version>
        </dependency>
 
<!-- OpenPGP包依赖 -->
<!-- https://mvnrepository.com/artifact/org.bouncycastle/bcpg-jdk15on -->
        <dependency>
            <groupId>org.bouncycastle</groupId>
            <artifactId>bcpg-jdk15on</artifactId>
            <version>1.56</version>
        </dependency>

bcprov-jdk15on.jar 常用的加解密jar包,相信大家都很熟悉了,我们通过它来实现PGP加解密及生成公私钥对

生成公私钥对的方法

public class PgpUtil {
   

	
	/**
	 * 私有方法,用于生成指定位宽的PGP RSA密钥对
	 *
	 * @param rsaWidth_ RSA密钥位宽
	 * @return 未经私钥加密的PGP密钥对
	 * @throws Exception IO错误,数值错误等
	 */
	private static PGPKeyPair generateKeyPair(int rsaWidth_) throws Exception {
   
	    KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA", "BC");//获取密钥对生成器实例
	    kpg.initialize(rsaWidth_);//设定RSA位宽
	    KeyPair kp = kpg.generateKeyPair();//生成RSA密钥对
	    return new JcaPGPKeyPair(PGPPublicKey.RSA_GENERAL, kp, new Date());//返回根据日期,密钥对生成的PGP密钥对
	}
	 
	/**
	 * 获取PGP密钥<br>
	 * 密钥是将密钥对的私钥部分用对称的加密方法CAST-128算法加密,再加上公钥部分
	 *
	 * @param identity_   密钥ID也就是key值,可以用来标记密钥属于谁
	 * @param passPhrase_ 密钥的密码,用来解出私钥
	 * @param rsaWidth_   RSA位宽
	 * @return PGP密钥
	 * @throws Exception IO错误和数值错误等
	 */
	public static PGPSecretKey getSecretKey(String identity_, String passPhrase_, int rsaWidth_) throws Exception {
   
	    char[] passPhrase = passPhrase_.toCharArray(); //将passPharse转换成字符数组
	    PGPKeyPair keyPair = PgpUtil.generateKeyPair(rsaWidth_); //生成RSA密钥对
	    PGPDigestCalculator sha1Calc = new JcaPGPDigestCalculatorProviderBuilder().build().get(HashAlgorithmTags.SHA1); //使用SHA1作为证书的散列算法
	    /**
	     * 用证书等级生成的认证,将公私钥对和PGP ID密码绑定构造PGP密钥(SecretKey)
	     *
	     * @param certificationLevel PGP密钥的证书等级
	     * @param keyPair 需要绑定的公私钥对
	     * @param id 需要绑定的ID
	     * @param checksumCalculator 散列值计算器,用于计算私钥密码散列
	     * @param hashedPcks the hashed packets to be added to the certification.(先不管)
	     * @param unhashedPcks the unhashed packets to be added to the certification.(也先不管)
	     * @param certificationSignerBuilder PGP证书的生成器
	     * @param keyEncryptor 如果需要加密私钥,需要在这里传入私钥加密器
	     * @throws PGPException 一些PGP错误
	     */
	    return new PGPSecretKey(
	            PGPSignature.DEFAULT_CERTIFICATION,
	            keyPair,
	            identity_,
	            sha1Calc,
	            null,
	            null,
	            new JcaPGPContentSignerBuilder(keyPair.getPublicKey().getAlgorithm(), HashAlgorithmTags.SHA1),
	            //密钥的加密方式
	            new JcePBESecretKeyEncryptorBuilder(PGPEncryptedData.CAST5, sha1Calc).setProvider("BC").build(passPhrase)
	    );
	}
	
	@SuppressWarnings("restriction")
	public static void main(String[] args) throws Exception {
   
		Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
		String passPhrase_ = "123456789";
	    char[] passPhrase = passPhrase_.toCharArray(); //将passPharse转换成字符数组

		PGPSecretKey secretKey = PgpUtil.getSecretKey("wathdata", passPhrase_, 2048);

		// 这里打印私钥-------------重要
		String privateKeySt
评论 29
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值