具体的给一个我写的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是用来测试的公钥和私钥。
分享到:
相关推荐
JAVA-PGP加密验签完整Demo 项目通过ssl实现发送, 项目分为2个项目,一个是对pgp加密的完整demo 另外一个是针对pgp加密后通过HTTP client发送 可以修改项目中HTTPclient-》okhhtp 实现不了的可以找我,携带ca证书...
- 这个文件很可能是一个Java实现的PGP客户端应用源代码,用于演示如何在Java环境中实现PGP的加解密和签名验证功能。 - 源代码可能包含类和方法,如`PGPEncryptor`、`PGPDecryptor`、`PGPSigner`和`...
总的来说,基于Java的类PGP文件加密传输系统利用了Java的安全特性,如加密库和数字签名,实现了类似PGP的文件加密、签名和传输功能,确保了数据在传输过程中的隐私和完整性。通过这样的系统,用户可以更安心地进行...
Java版的PGP加密解密程序是PGP技术在Java平台上的实现,它允许开发者和用户在Java环境中执行加密、解密和验证操作。由于Java的跨平台特性,这样的实现使得PGP功能可以轻松地集成到各种操作系统和应用程序中。 **...
PGP(Pretty Good Privacy)是一种广泛使用的数据加密和签名软件,它结合了公钥加密和对称加密技术,为用户提供了一种安全的数据保护方式。在本文中,我们将深入探讨PGP加解密工具类,包括PGP文件和文本的加密解密、...
PGP(Pretty Good Privacy)是一种广泛使用的加密软件,它提供了数据加密和数字签名服务,确保信息的安全传输。在本文中,我们将深入探讨PGP的工作原理、数字签名的概念以及数字水印的应用。 首先,我们来理解PGP...
"PGP.java"文件很可能是实现了PGP加密和解密功能的Java类,可能包含了OpenPGP标准的关键部分,如密钥环管理、消息包装和解包、以及哈希和压缩算法的集成。 最后,"testPGP.java"文件可能是针对PGP功能的测试代码,...
在Java环境中使用PGP,通常需要借助相关的库,如Bouncy Castle,来实现对PGP密钥的管理和解密操作。 首先,理解PGP的基本原理非常重要。PGP使用公钥/私钥对进行加密和解密。公钥是公开的,任何人都可以获取并用它来...
该项目实现了OpenPGP卡功能。 OpenPGP是用于签名和加密的开放标准... 它通过PKCS#11之类的通用接口,使用存储在智能卡(例如)上的私钥来启用RSA或ECC签名/加密操作。 要下载有关该项目或讨论的所有文件,您可以访问:
在IT行业中,安全性和可信度是软件发布的重要考量因素,特别是在开源社区中。Maven作为Java项目管理和...随着PGP4Win 2.0版本的推出,使用PGP签名工件变得更加易用,对于维护开源生态的安全性和信任度具有积极意义。
PGP(Pretty Good Privacy)是一种广泛使用的加密软件,主要用于数据的加密和数字签名,确保信息在传输过程中的安全性和完整性。PGP 5.0 是该软件的一个早期版本,其源代码的提供对于开发者和安全研究者来说具有极高...
在电子邮件系统中,PGP(Pretty Good Privacy)使用RSA和SHA1进行端到端的加密和签名,确保邮件的隐私和完整性。 总结来说,这个“各种加密签名工具合集”是IT从业者宝贵的资源,它涵盖了数据加密和完整性验证的...
这个压缩包"基于Java的非对称加密源码实例.zip"显然包含了用于演示如何在Java中实现非对称加密算法的源代码。让我们深入探讨一下这个话题。 非对称加密的核心在于使用一对密钥:公钥和私钥。公钥可以公开给任何人,...
Java非对称加密技术是一种基于数学难题的安全加密方法,它主要使用两个密钥:公钥和私钥。这种加密方式相比对称加密(如DES、AES)更为安全,因为公钥可以公开,而私钥必须保密。在Java中,非对称加密主要通过Java ...
在Java编程中,非对称加密常用于实现安全的数据传输、数字签名以及证书管理等场景。RSA(Rivest–Shamir–Adleman)算法是最早被广泛使用的非对称加密算法之一,它基于两个大素数的乘积来生成公钥和私钥,公钥用于...
Java Cryptography Extension (JCE) 是Java开发工具包(JDK)的一部分,它提供了解密、加密、哈希和数字签名等高级加密功能。在JDK8中,JCE(Java Cryptography Extension)的一个关键更新是它开始支持256位加密算法...
非对称加密常用于数字签名、SSL/TLS协议、PGP加密、SSH等场景,确保数据的完整性和安全性。 在提供的"Java非对称加密源码实例"压缩包中,你将找到完整的Java源代码示例,包括密钥对生成、加密、解密等功能的实现。...
7. **加密算法实现**:书中可能涵盖了各种加密算法的Java实现,如RSA、AES、DES等,以及如何在Java代码中使用这些算法进行加密和解密操作。 8. **安全编码实践**:强调了在实际开发中应遵循的安全编码原则,如何...
PGP签名通常使用公钥加密技术,用户可以通过验证签名来确保文件在传输过程中没有被篡改,并且确实来自预期的发布者。 在"压缩包子文件的文件名称列表"中,我们只看到了"commons-net-1.4.1"这一项,这可能是解压后的...