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

java 公钥 私钥加密

    博客分类:
  • Java
 
阅读更多
SHACodeTest
import java.io.FileInputStream;
import java.security.KeyStore;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
import java.security.cert.Certificate;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import javax.crypto.Cipher;

public class SHACoderTest {
	// 类型证书X509
	public static final String CERT_TYPE = "X.509";

	/**
	 * * 获得KeyStore * @param keyStorePath 密钥库路径 * @param password 密码 * @return
	 * KeyStore 密钥库
	 */
	private static KeyStore getKeyStore(String keyStorePath, String password)
			throws Exception {
		// 实例化密钥库
		KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
		// 获得密钥库文件流
		FileInputStream is = new FileInputStream(keyStorePath);
		// 加载密钥库
		ks.load(is, password.toCharArray());
		// 关闭密钥库文件流
		is.close();
		return ks;
	}

	/**
	 * * 由KeyStore获得私钥 * @param keyStorePath 密钥库路径 * @param alias 别名 * @param
	 * password 密码 * @return PrivateKey 私钥 * @throws Exception
	 */
	private static PrivateKey getPrivateKeyByKeyStore(String keyStorePath,
			String alias, String password) throws Exception {
		// 获得密钥库
		KeyStore ks = getKeyStore(keyStorePath, password);
		// 获得私钥
		return (PrivateKey) ks.getKey(alias, password.toCharArray());
	}

	/**
	 * * 由Certificate获得公钥 * @param certificatePath证书路径 * @return PublicKey 公钥 * @throws
	 * Exception
	 */
	private static PublicKey getPublicKeyByCertificate(String certificatePath)
			throws Exception {
		// 获得证书
		Certificate certificate = getCertificate(certificatePath);
		// 获得公钥
		return certificate.getPublicKey();
	}

	/**
	 * * 获得Certificate * @param certificatePath 证书路径 * @return Certificate 证书 * @throws
	 * Exception
	 */
	private static Certificate getCertificate(String certificatePath)
			throws Exception {
		// 实例化证书工厂
		CertificateFactory certificateFactory = CertificateFactory
				.getInstance(CERT_TYPE);
		// 取得证书文件流
		FileInputStream in = new FileInputStream(certificatePath);
		// 生成证书
		Certificate certificate = certificateFactory.generateCertificate(in);
		// 关闭证书文件流
		in.close();
		return certificate;
	}

	/**
	 * * 获得Certificate * @param keyStorePath 密钥库路径 * @param alias 别名 * @param
	 * password 密码 * @return Certificate 证书 * @throws Exception
	 */
	private static Certificate getCertificate(String keyStorePath,
			String alias, String password) throws Exception {
		// 获得密钥库
		KeyStore ks = getKeyStore(keyStorePath, password);
		// 获得证书
		return ks.getCertificate(alias);
	}

	/***
	 * * 私钥加密 * @param data 待加密数据 * @param keyStorePath 密钥库路径 * @param alias 别名
	 * * @param password 密码 * @return byte[] 加密数据 * @throws Exception
	 */
	public static byte[] encryptByPrivateKey(byte[] data, String keyStorePath,
			String alias, String password) throws Exception {
		// 取得私钥
		PrivateKey privateKey = getPrivateKeyByKeyStore(keyStorePath, alias,
				password);
		// 对数据加密
		Cipher cipher = Cipher.getInstance(privateKey.getAlgorithm());
		cipher.init(Cipher.ENCRYPT_MODE, privateKey);
		return cipher.doFinal(data);
	}

	/**
	 * * 私钥解密 * @param data 待解密数据 * @param keyStorePath 密钥库路径 * @param alias 别名
	 * * @param password 密码 * @return byte[] 解密数据 * @throws Exception
	 */
	public static byte[] decryptByPrivateKey(byte[] data, String keyStorePath,
			String alias, String password) throws Exception {
		// 取得私钥
		PrivateKey privateKey = getPrivateKeyByKeyStore(keyStorePath, alias,
				password);
		// 对数据加密
		Cipher cipher = Cipher.getInstance(privateKey.getAlgorithm());
		cipher.init(Cipher.DECRYPT_MODE, privateKey);
		return cipher.doFinal(data);
	}

	/**
	 * * 公钥加密 * @param data 待加密数据 * @param certificatePath 证书路径 * @return byte[]
	 * 加密数据 * @throws Exception
	 */
	public static byte[] encryptByPublicKey(byte[] data, String certificatePath)
			throws Exception {
		// 取得公钥
		PublicKey publicKey = getPublicKeyByCertificate(certificatePath);
		// 对数据加密
		Cipher cipher = Cipher.getInstance(publicKey.getAlgorithm());
		cipher.init(Cipher.ENCRYPT_MODE, publicKey);
		return cipher.doFinal(data);
	}

	/**
	 * * 公钥解密 * @param data 待解密数据 * @param certificatePath 证书路径 * @return byte[]
	 * 解密数据 * @throws Exception
	 */
	public static byte[] decryptByPublicKey(byte[] data, String certificatePath)
			throws Exception {
		// 取得公钥
		PublicKey publicKey = getPublicKeyByCertificate(certificatePath);
		// 对数据加密
		Cipher cipher = Cipher.getInstance(publicKey.getAlgorithm());
		cipher.init(Cipher.DECRYPT_MODE, publicKey);
		return cipher.doFinal(data);
	}

	/**
	 * * 签名 * @param keyStorePath 密钥库路径 * @param alias 别名 * @param password 密码 * @return
	 * byte[] 签名 * @throws Exception
	 */
	public static byte[] sign(byte[] sign, String keyStorePath, String alias,
			String password) throws Exception {
		// 获得证书
		X509Certificate x509Certificate = (X509Certificate) getCertificate(
				keyStorePath, alias, password);
		// 构建签名,由证书指定签名算法
		Signature signature = Signature.getInstance(x509Certificate
				.getSigAlgName());
		// 获取私钥
		PrivateKey privateKey = getPrivateKeyByKeyStore(keyStorePath, alias,
				password);
		// 初始化签名,由私钥构建
		signature.initSign(privateKey);
		signature.update(sign);
		return signature.sign();
	}

	/**
	 * * 验证签名 * @param data 数据 * @param sign 签名 * @param certificatePath 证书路径 * @return
	 * boolean 验证通过为真 * @throws Exception *
	 */
	public static boolean verify(byte[] data, byte[] sign,
			String certificatePath) throws Exception {
		// 获得证书
		X509Certificate x509Certificate = (X509Certificate) getCertificate(certificatePath);
		// 由证书构建签名
		Signature signature = Signature.getInstance(x509Certificate
				.getSigAlgName());
		// 由证书初始化签名,实际上是使用了证书中的公钥
		signature.initVerify(x509Certificate);
		signature.update(data);
		return signature.verify(sign);
	}

}


TestRun
public class TestRun {
	private String password = "123456";
	private String alias = "test";
	private String certificatePath = "d:/cers/server.crt";
	private String keyStorePath = "d:/cers/server.key";

	/** * 公钥加密—私钥解密 * * @throws Exception */
	public void test1() throws Exception {
		System.out.println("公钥加密—私钥解密");
		String inputStr = "我很喜欢你";
		byte[] data = inputStr.getBytes();
		// 公钥加密
		byte[] encrypt = SHACoderTest.encryptByPublicKey(data, certificatePath);
		// 私钥解密
		byte[] decrypt = SHACoderTest.decryptByPrivateKey(encrypt,
				keyStorePath, alias, password);
		String outputStr = new String(decrypt);
		System.out.println("加密前:" + inputStr);
		System.out.println("解密后:" + outputStr);
	}

	/** * 私钥加密—公钥解密 * * @throws Exception */
	public void test2() throws Exception {
		System.out.println("私钥加密—公钥解密");
		String inputStr = "天空很蓝,我很爱你";
		byte[] data = inputStr.getBytes();
		// 私钥加密
		byte[] encodedData = SHACoderTest.encryptByPrivateKey(data,
				keyStorePath, alias, password);
		// 公钥加密
		byte[] decodedData = SHACoderTest.decryptByPublicKey(encodedData,
				certificatePath);
		String outputStr = new String(decodedData);
		System.out.println("加密前:" + inputStr);
		System.out.println("解密后:" + outputStr);
	}

	/** * 签名验证 * * @throws Exception */
	public void testSign() throws Exception {
		String inputStr = "签名";
		byte[] data = inputStr.getBytes();
		System.out.println("私钥签名—公钥验证");
		// 产生签名
		byte[] sign = SHACoderTest.sign(data, keyStorePath, alias, password);
		// 验证签名
		boolean status = SHACoderTest.verify(data, sign, certificatePath);
		System.out.println("状态:" + status);
	}

	public static void main(String args[]) throws Exception {
		TestRun t = new TestRun();
		t.test1();
		t.test2();
		t.testSign();
	}
}
分享到:
评论

相关推荐

    Java 公钥和私钥加密解密代码

    在Java编程语言中,公钥和私钥加密解密是一种重要的安全技术,广泛应用于网络通信、数据传输等领域。本文将详细解析如何使用Java实现公钥和私钥的加解密操作,以及相关的关键概念和代码示例。 首先,我们要了解公钥...

    RSA生成公钥私钥和使用公钥私钥加密解密demo

    本示例提供了一个RSA加密工具类,用于生成公钥和私钥,并使用它们进行加密和解密操作,这对于保护数据库中的敏感信息,如密码,是非常必要的。 1. **RSA算法原理**: RSA算法基于数论中的大数因子分解难题。其基本...

    RSA算法JAVA公钥加密,C#私钥解密

    // 假设RSAParametersFromJava是从Java公钥导出的参数 byte[] decryptedBytes = rsa.Decrypt(encryptedBytes, false); // 假设Decrypt()是解密方法 ``` 在实际应用中,公钥和私钥的管理是非常关键的。公钥可以公开...

    java公钥加密私钥解密数字证书

    java公钥加密私钥解密与数字证书,数字证书的生成看这里 http://hi.baidu.com/chenminliang/blog/item/2b30db24920ae0338744f9db.html

    C# RSA加密、支持JAVA格式公钥私钥

    3. **Java格式的公钥私钥**:Java的`java.security.KeyPairGenerator`和`java.security.KeyFactory`类通常用于生成和处理RSA密钥对。由于不同语言间的数据交换可能涉及不同的密钥格式,这个工具包可能包含了将Java...

    C# RSA加密、解密、加签、验签、支持JAVA格式公钥私钥、PEM格式公钥私钥、.NET格式公钥私钥

    C# RSA加密、解密、加签、验签、支持JAVA格式公钥私钥、PEM格式公钥私钥、.NET格式公钥私钥 对应文章: http://blog.csdn.net/gzy11/article/details/54573973

    Java实现RSA生成公钥私钥

    在Java中实现RSA公钥和私钥的生成,通常我们会使用Java Cryptography Extension (JCE) 提供的API,如`java.security.KeyPairGenerator`类。但是,根据你的描述,这里提供的代码是不直接依赖API,而是通过数学计算来...

    Java公钥加密私钥解密.rar

    这个名为"Java公钥加密私钥解密.rar"的压缩包文件包含了一个使用Java实现的公钥/私钥加密解密的示例。在这个案例中,开发者可能使用了Java的Java Cryptography Extension (JCE) 来实现RSA算法,这是一种非对称加密...

    Java实现RSA公钥私钥加密算法

    Java实现,没有直接调用KeyPairGenerator,自己使用BigInteger计算公钥私钥。 有源码有jar包,包含简单的Demo,不喜欢造轮子的可以直接引入jar包调用, 想要学习的也可以更直观的了解RSA公钥私钥生成及加密、解密...

    java签名私钥加密公钥解密

    Java签名私钥加密和公钥解密是基于非对称加密算法的一种常见操作,主要用于确保数据的完整性和发送方身份的验证。在这个场景中,私钥用于加密数据,而公钥用于解密数据,这样的机制提供了强大的安全保障。下面将详细...

    java中使用公钥加密私钥解密原理实现license控制

    Java 中使用公钥加密私钥解密原理实现 License 控制 Java 中使用公钥加密私钥解密原理实现 License 控制是指在 Java 应用程序中使用公钥加密、私钥解密机制来实现 License 文件的控制。这种机制可以用来限制系统的...

    JavaRSA生成公钥私钥加解密

    在这个Java RSA项目中,可能包含了一个完整的示例程序,演示如何生成公钥私钥,并进行加解密操作。这有助于理解非对称加密的工作原理,特别是在区块链等应用中,多重加密技术可能会结合RSA与其他加密方法,提供更高...

    获取RSA公钥+私钥

    在Java中,我们可以使用Java Cryptography Extension (JCE) 库来生成和操作RSA密钥对,包括公钥和私钥。 生成RSA公钥和私钥的基本步骤如下: 1. **创建KeyPairGenerator对象**:首先,我们需要创建一个...

    通过RSA证书提取XML/PEM公钥私钥

    总结来说,"RSASecretKeyExtractor"是一个工具,它能帮助用户从PFX证书中提取并转换RSA公钥和私钥,以便在XML或PEM格式之间灵活操作,这在多平台通信和加密需求中具有重要价值。了解这些步骤有助于理解密钥管理以及...

    Rsa 私钥加密 公钥解密

    这个压缩包文件的标题和描述提及了“Rsa 私钥加密 公钥解密”,这意味着我们将探讨如何使用RSA算法进行私钥加密和公钥解密的过程,以及在不同编程语言如JAVA、C#、PHP之间的互通性。 首先,RSA加密的基础是大数因子...

    JWT公钥私钥操作工具类

    JWT公钥私钥操作工具类

    asp.net RSA 私钥加密公钥解密 能解 php Java 实现RSA加密互通

    3. PHP或Java端使用对应的公钥尝试解密数据,如果成功,说明密钥匹配且加密过程无误。 文件"RSATest"可能是测试代码或数据,它可能包含了实现上述流程的示例代码,用于验证RSA加密在不同环境下的互通性。 总之,...

    C#使用公钥指数、私钥指数和模数进行私钥加密、公钥解密

    C#使用公钥指数、私钥指数和模数进行私钥加密、公钥解密,可和Linux、Java配合加解密(比如C#加密,Java解密);C#使用的是BouncyCastle.Crypto进行加密及解密。测试过C#加密,用Linux C代码来解密,正常。 vs2008...

Global site tag (gtag.js) - Google Analytics