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

Java 使用PGP实现签名加密

    博客分类:
  • PGP
阅读更多
具体的给一个我写的Util类,在这里使用到了第三方包cryptix,具体的可以去www.cryptix.org网站上去找资料。ceryptix的jar包放在附件中。
示例类:
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.security.NoSuchAlgorithmException;
import java.security.Security;
import java.security.UnrecoverableKeyException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;


import cryptix.message.EncryptedMessage;
import cryptix.message.EncryptedMessageBuilder;
import cryptix.message.KeyBundleMessage;
import cryptix.message.LiteralMessage;
import cryptix.message.LiteralMessageBuilder;
import cryptix.message.Message;
import cryptix.message.MessageException;
import cryptix.message.MessageFactory;
import cryptix.message.NotEncryptedToParameterException;
import cryptix.message.SignedMessage;
import cryptix.message.SignedMessageBuilder;
import cryptix.openpgp.PGPArmouredMessage;
import cryptix.pki.KeyBundle;

public class PGPUtil {
	
	/**
	 * 添加提供者
	 */
	static{
		Security.addProvider(new cryptix.jce.provider.CryptixCrypto());
	    Security.addProvider(new cryptix.openpgp.provider.CryptixOpenPGP() );
	}
	
	/**
	 * 构建 LiteralMessage 对象
	 * @param message		
	 * @return
	 * @throws MessageException
	 */
	private static LiteralMessage buildLiteralMessage(byte[] message) throws MessageException{
		LiteralMessageBuilder lmb = null;
		
		try {
			lmb = LiteralMessageBuilder.getInstance("OpenPGP");
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		}
		lmb.init(message);
		LiteralMessage literal = (LiteralMessage)lmb.build();
		return literal;
	}
	
	/**
	 * 使用多个公钥对明文加密
	 * @param plain			明文
	 * @param recipientKeys	公钥集合
	 * @return				加密后的明文
	 * @throws MessageException
	 */
	public static byte[] encrypt(byte[] plain,List<KeyBundle> recipientKeys) throws MessageException{
		LiteralMessage literal = buildLiteralMessage(plain);
		
		EncryptedMessageBuilder emb = null;
		try {
			emb = EncryptedMessageBuilder.getInstance("OpenPGP");
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		}
		emb.init(literal);
		
		//添加接受者
		for(KeyBundle key : recipientKeys){
			emb.addRecipient(key);
		}
		//压缩
		emb.setAttribute("compressed", "true");
		//得到加密信息
		Message msg = emb.build();
		PGPArmouredMessage pgpMsg = new PGPArmouredMessage(msg);
		return pgpMsg.getEncoded();
	}
	
	/**
	 * 使用单张公钥加密
	 * @param plain		明文	
	 * @param publicKey	公钥
	 * @return	返回加密后的密文
	 * @throws MessageException
	 */
	public static byte[] encrypt(byte[] plain,KeyBundle publicKey) throws MessageException{
		List<KeyBundle> list = new ArrayList<KeyBundle>();
		list.add(publicKey);
		return encrypt(plain, list);
		
	}
	
	/**
	 * 使用私钥和密码对明文签名
	 * @param plain			明文
	 * @param privateKey	私钥
	 * @param keypass		私钥密码
	 * @return				签名后的明文
	 * @throws MessageException
	 * @throws UnrecoverableKeyException
	 */
	public static byte[] sign(byte[] plain,KeyBundle privateKey,String keypass)throws MessageException,UnrecoverableKeyException{
        SignedMessageBuilder smb = null;
		try {
			smb = SignedMessageBuilder.getInstance("OpenPGP");
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		}
		
        // SignedMessageBuilder smb = SignedMessageBuilder.getInstance("OpenPGP/V3");
		
        LiteralMessage literal = buildLiteralMessage(plain);
        smb.init(literal);
        smb.addSigner(privateKey, keypass.toCharArray());
        
        Message msg = smb.build();
        PGPArmouredMessage armoured = new PGPArmouredMessage(msg);
		return armoured.getEncoded();
	}
	
	/**
	 * 使用私钥和密码解密加密后的数据
	 * @param encrypted		PGP加密过的数据
	 * @param privateKey	私钥
	 * @param keypass		私钥密码
	 * @return				解密后的明文
	 * @throws MessageException
	 * @throws IOException
	 * @throws UnrecoverableKeyException
	 * @throws NotEncryptedToParameterException
	 */
	public static byte[] decrypt(byte[] encrypted,KeyBundle privateKey,String keypass) throws MessageException, IOException, UnrecoverableKeyException, NotEncryptedToParameterException{
		
		MessageFactory mf = null;
		try {
			mf = MessageFactory.getInstance("OpenPGP");
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		}
		
		Collection msgs = mf.generateMessages(new ByteArrayInputStream(encrypted));
		
		//得到集合中的EncryptedMessage对象
		Message message = (Message)msgs.iterator().next();
		
		if (!(message instanceof EncryptedMessage)) {
            throw new MessageException("Not a encrypted message.");
        }
		
		EncryptedMessage em = (EncryptedMessage)message;
		Message msg = em.decrypt(privateKey,keypass.toCharArray());
		return ((LiteralMessage)msg).getBinaryData();
	}
	
	/**
	 * 解密验签
	 * @param encrypted		密文	
	 * @param privateKey	私钥
	 * @param keypass		私钥密码
	 * @param publicKey		公钥
	 * @return				返回明文
	 * @throws UnrecoverableKeyException
	 * @throws MessageException
	 * @throws IOException
	 * @throws NotEncryptedToParameterException
	 */
	public static byte[] decryptVerify(byte[] encrypted,KeyBundle privateKey,String keypass,KeyBundle publicKey) throws UnrecoverableKeyException, MessageException, IOException, NotEncryptedToParameterException{
		return PGPUtil.verify(PGPUtil.decrypt(encrypted, privateKey, keypass), publicKey);
	}
	
	/**
	 * 验证Message
	 * @param signed	验证的内容
	 * @param publickey	公钥
	 * @return			返回验证后的内容
	 * @throws MessageException
	 * @throws IOException
	 */
	public static byte[] verify(byte[] signed,KeyBundle publickey) throws MessageException, IOException{
		
		MessageFactory mf = null;
		try {
			mf = MessageFactory.getInstance("OpenPGP");
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		}
		
        Message msg = (Message)mf.generateMessages(new ByteArrayInputStream(signed)).iterator().next();
        if (!(msg instanceof SignedMessage)) {
            throw new MessageException(" Not a signed message.");
        }
    
        SignedMessage sm = (SignedMessage)msg;
        if (sm.verify(publickey)) {
            
        } else {
        	throw new MessageException(" Signature verify fail. ");
        }

        if (!(sm.getContents() instanceof LiteralMessage)){
        	throw new MessageException(" Not a signed message.");
        }

        LiteralMessage lm = (LiteralMessage)sm.getContents();
		return lm.getBinaryData();
	}
	
	/**
	 * 流转换为PGP KeuBundle 对象
	 * @param inputStream 	Key
	 * @return	转换后的 KeuBundle
	 * @throws MessageException
	 * @throws IOException
	 */
	public static KeyBundle streamToKeyBundle(InputStream inputStream) throws MessageException, IOException {
		MessageFactory messageFactory = null;
		try {
			messageFactory = MessageFactory.getInstance("OpenPGP");
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		}
		Collection msgs = messageFactory.generateMessages(inputStream);
		KeyBundleMessage keybm = (KeyBundleMessage)msgs.iterator().next();
		
		return keybm.getKeyBundle();
		
	}
	
	/**
	 * 签名加密
	 * @param plain			明文	
	 * @param privateKey	私钥	
	 * @param keypass		私钥密码
	 * @param recipientKeys	公钥
	 * @return				返回签名加密后的数据
	 * @throws UnrecoverableKeyException
	 * @throws MessageException
	 */
	public static byte [] signAndEncrypt(byte[] plain,KeyBundle privateKey,String keypass,List<KeyBundle> recipientKeys) throws UnrecoverableKeyException, MessageException{
		return PGPUtil.encrypt(PGPUtil.sign(plain, privateKey, keypass),recipientKeys);
	}
	
	/**
	 * 签名加密
	 * @param plain			明文	
	 * @param privateKey	私钥	
	 * @param keypass		私钥密码
	 * @param recipientKeys	公钥
	 * @return				返回签名加密后的数据
	 * @throws UnrecoverableKeyException
	 * @throws MessageException
	 */
	public static byte [] signAndEncrypt(byte[] plain,KeyBundle privateKey,String keypass,KeyBundle publicKey) throws UnrecoverableKeyException, MessageException{
		return PGPUtil.encrypt(PGPUtil.sign(plain, privateKey, keypass),publicKey);
	}
}


需要修改jre里面的security下面的local_policy.jar包给替换。
替换为附件中的local_policy.jar包,然后找到security文件下面的java.security文件,在文件中添加下面的内容:
security.provider.10=cryptix.jce.provider.CryptixCrypto
security.provider.11=cryptix.openpgp.provider.CryptixOpenPGP
增加java的cryptix提供者,sun提供的jre的security下面的local_policy.jar不提供cryptix的加密算法。
在附件中的testCert.jar是用来测试的公钥和私钥。
分享到:
评论
2 楼 yuankai 2009-02-20  
upcboy 写道
没有提供用来测试的私钥的密码。。。
有什么办法可以得到这个密码吗?

这个密码是在生成整数的时候设置的。
测试的私钥的密码不懂你是什么意思!
1 楼 upcboy 2009-02-20  
没有提供用来测试的私钥的密码。。。
有什么办法可以得到这个密码吗?

相关推荐

    PGP 加解密及签名验签示例

    PGP 加解密及签名验签示例

    JAVA-PGP加密验签完整Demo.rar

    JAVA-PGP加密验签完整Demo 项目通过ssl实现发送, 项目分为2个项目,一个是对pgp加密的完整demo 另外一个是针对pgp加密后通过HTTP client发送 可以修改项目中HTTPclient-》okhhtp 实现不了的可以找我,携带ca证书...

    PGP加密、数字签名、数字水印

    这是一个含PGP软件,数字签名,数字水印的各种详细讲解,对爱学习的同学来说是很有用的。

    基于java的类PGP文件加密传输系统

    本系统是基于java的文件加密传输系统,采用类PGP的思想,对传输的文件进行加密,签名,计算摘要等。

    Java-Card-OpenPGP-Applet:OpenPGP是用于签名和加密的智能卡/ java卡标准。-开源

    该项目实现了OpenPGP卡功能。 OpenPGP是用于签名和加密的开放标准... 它通过PKCS#11之类的通用接口,使用存储在智能卡(例如)上的私钥来启用RSA或ECC签名/加密操作。 要下载有关该项目或讨论的所有文件,您可以访问:

    jpgpj:Java相当不错的隐私夹具

    Java相当不错的隐私夹具JPGPJ在 Java OpenPGP实现(它是完整而强大的实现,并且与其他流行的PGP实现(例如 , 和 )兼容)之上提供了一个简单的API。 JPGPJ API仅限于文件加密,签名,解密和验证。 它不具有生成,...

    openpgp-api:OpenPGP API库

    OpenPGP API提供了执行OpenPGP操作的​​方法,例如签名,加密,解密,验证等,而无需用户与后台线程进行交互。 这是通过将客户端应用程序连接到或其他OpenPGP提供程序提供的远程服务来。 消息 第12章 ...

    非对称的密钥的导出和导入

    加密 解密 对称的加密解密 签名 验证 2.CSTTEST2 写的比前个好些 但是平时上班 下班自己也要写论文 所以花的时间也不太多 很多地方都偷懒了 比如文件大小我没有用NEW 而且指定了1024 有需要的朋友可以自己修改。这...

    SmartPGP:SmartPGP是OpenPGP卡规范的JavaCard实现

    特征以下功能是在applet级别实现的,但是其中一些功能取决于基础硬件支持和可用的(非易失性)内存资源: 用于签名,加密和身份验证的RSA(&gt; = 2048位模数,17位指数)和ECC(NIST P-256,NIST P-384,NIST P-521,...

    bouncy-gpg:再次将Bouncy Castle与OpenPGP结合使用会很有趣!

    只需几行代码即可加密,解密,签名和验证GPG / PGP文件 通过使用读取加密文件来保护所有 您甚至可以-永远不要让纯文本打入您的服务器磁盘! 例子 Bouncy GPG内置了几个。 密钥管理 Bouncy GPG支持读取gpg 密钥环和...

    Pakay - OpenPGP compliant app-开源

    此项目是完全用Java编写的OpenPGP(RFC2440)的实现。 它使您可以使用公共密钥密码术来签名,加密,解密消息和文件。

    Portable PGP-开源

    Portable PGP是功能齐全的轻量级基于Java的PGP工具。 它允许使用漂亮且绝对直接的图形界面对文本和文件进行加密,解密,签名和验证。

    MailCard:试图在JavaCard小程序中安全地托管小型电子邮件客户端

    将1组PGP密钥对安全地存储在智能卡环境中,以进行电子邮件加密和签名。 HOTP 2FA授权智能卡发送/接收电子邮件。 自毁功能包括1个自毁PIN(在配置文件初始化时指定)和自毁命令。 整个电子邮件配置文件上的无导出...

    threema-android:安卓版Threema App

    提交使用PGP签名。 有关更多信息,请参见 。 许可证检查 虽然Android的Threema的源代​​码是在开放源代码许可下发布的,但Threema仍然是付费应用程序。 要将应用程序与我们的官方服务器基础结构结合使用,您必须在...

    sa-android:适用于大学生的通用学校应用

    签名密钥在提交到版本控制之前已被PGP加密。 密钥库密码为njitdev 。 执照 sa-android Copyright (C) 2017 sa-android authors This program is free software: you can redistribute it and/or modify it under ...

    Computer Networking - A Top Down Approach, 7th, converted .pdf

    2.1.3/可供应用程序使用的运输服务/56 2.1.4/因特网提供的运输服务/57 2.1.5/应用层协议/60 2.1.6/本书涉及的网络应用/61 2.2/Web应用和HTTP协议/61 2.2.1/HTTP概况/62 2.2.2/非持久连接和持久连接/63 2.2.3/HTTP...

Global site tag (gtag.js) - Google Analytics