具体的给一个我写的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是用来测试的公钥和私钥。
分享到:
相关推荐
PGP 加解密及签名验签示例
JAVA-PGP加密验签完整Demo 项目通过ssl实现发送, 项目分为2个项目,一个是对pgp加密的完整demo 另外一个是针对pgp加密后通过HTTP client发送 可以修改项目中HTTPclient-》okhhtp 实现不了的可以找我,携带ca证书...
这是一个含PGP软件,数字签名,数字水印的各种详细讲解,对爱学习的同学来说是很有用的。
本系统是基于java的文件加密传输系统,采用类PGP的思想,对传输的文件进行加密,签名,计算摘要等。
该项目实现了OpenPGP卡功能。 OpenPGP是用于签名和加密的开放标准... 它通过PKCS#11之类的通用接口,使用存储在智能卡(例如)上的私钥来启用RSA或ECC签名/加密操作。 要下载有关该项目或讨论的所有文件,您可以访问:
Java相当不错的隐私夹具JPGPJ在 Java OpenPGP实现(它是完整而强大的实现,并且与其他流行的PGP实现(例如 , 和 )兼容)之上提供了一个简单的API。 JPGPJ API仅限于文件加密,签名,解密和验证。 它不具有生成,...
OpenPGP API提供了执行OpenPGP操作的方法,例如签名,加密,解密,验证等,而无需用户与后台线程进行交互。 这是通过将客户端应用程序连接到或其他OpenPGP提供程序提供的远程服务来。 消息 第12章 ...
加密 解密 对称的加密解密 签名 验证 2.CSTTEST2 写的比前个好些 但是平时上班 下班自己也要写论文 所以花的时间也不太多 很多地方都偷懒了 比如文件大小我没有用NEW 而且指定了1024 有需要的朋友可以自己修改。这...
特征以下功能是在applet级别实现的,但是其中一些功能取决于基础硬件支持和可用的(非易失性)内存资源: 用于签名,加密和身份验证的RSA(> = 2048位模数,17位指数)和ECC(NIST P-256,NIST P-384,NIST P-521,...
只需几行代码即可加密,解密,签名和验证GPG / PGP文件 通过使用读取加密文件来保护所有 您甚至可以-永远不要让纯文本打入您的服务器磁盘! 例子 Bouncy GPG内置了几个。 密钥管理 Bouncy GPG支持读取gpg 密钥环和...
此项目是完全用Java编写的OpenPGP(RFC2440)的实现。 它使您可以使用公共密钥密码术来签名,加密,解密消息和文件。
Portable PGP是功能齐全的轻量级基于Java的PGP工具。 它允许使用漂亮且绝对直接的图形界面对文本和文件进行加密,解密,签名和验证。
将1组PGP密钥对安全地存储在智能卡环境中,以进行电子邮件加密和签名。 HOTP 2FA授权智能卡发送/接收电子邮件。 自毁功能包括1个自毁PIN(在配置文件初始化时指定)和自毁命令。 整个电子邮件配置文件上的无导出...
提交使用PGP签名。 有关更多信息,请参见 。 许可证检查 虽然Android的Threema的源代码是在开放源代码许可下发布的,但Threema仍然是付费应用程序。 要将应用程序与我们的官方服务器基础结构结合使用,您必须在...
签名密钥在提交到版本控制之前已被PGP加密。 密钥库密码为njitdev 。 执照 sa-android Copyright (C) 2017 sa-android authors This program is free software: you can redistribute it and/or modify it under ...
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...