Java加解密

Java加解密

实现方式:JDK实现,CCBC

JDK提供比较基础的底层的实现;CC提供一些简化的操作;BC提供补充

一、Base64加密

非常简单,加密解密就一个函数。

代码如下:

public static void jdkBase64() {

	try {

		//加密:

		BASE64Encoder encoder = new BASE64Encoder();

		String encode = encoder.encode(src.getBytes());

		System.out.println("encode : " + encode);

		

		//解密

		BASE64Decoder decoder = new BASE64Decoder();

		String decode = new String(decoder.decodeBuffer(encode));

		System.out.println("decode : " + decode);

	} catch (IOException e) {

		e.printStackTrace();

	}

}



public static void commonsCodesBase64(){

	//加密

	byte[] encodeBytes = Base64.encodeBase64(src.getBytes());

	System.out.println("encode : " + new String(encodeBytes));

	//解密

	byte[] decodeBytes = Base64.decodeBase64(encodeBytes);

	System.err.println("decode : " + new String(decodeBytes));

}


 

二、消息摘要算法加密————主要用于验证数据完整性。

MD(消息摘要):

public static void jdkMD5(){

	try {

		MessageDigest md = MessageDigest.getInstance("MD5");

		byte[] md5Bytes = md.digest(src.getBytes());

		//把byte数组转换为字符串

		System.out.println("jdkmd5 : " + Hex.encodeHexString(md5Bytes));//CC实现转换

			} catch (NoSuchAlgorithmException e) {

		e.printStackTrace();

	}

}

 

SHA(安全散列)

JDK实现和MD一样。

BC实现如下:(Digest类)

public static void bcSHA1() {

	Digest digest = new SHA1Digest();

	digest.update(src.getBytes(), 0, src.getBytes().length);

	byte[] sha1Bytes = new byte[digest.getDigestSize()];

	digest.doFinal(sha1Bytes, 0);

	System.out.println("bc sha-1 : " + org.bouncycastle.util.encoders.Hex.toHexString(sha1Bytes));

}

CC实现最简单(就是一个DigestUtils静态方法):

public static void ccSHA1() {

	System.out.println("cc sha1 - 1 :" + DigestUtils.sha1Hex(src.getBytes()));

	System.out.println("cc sha1 - 2 :" + DigestUtils.sha1Hex(src));

}

 

MAC(消息认证码)——含有密钥的散列函数算法

兼容MDSHA的特性,但加入了密钥。

主要JDKBouncy Castle实现。

JDK实现:获取或定义密钥(byte[]数组),Mac类 实例化、初始化、执行。

BC实现:Hmac类 实例化、初始化、执行。

 

三、对称加解密

对称加密指加密和解密使用相同密钥的加密算法。这里将介绍DES3DESAESPBE几种常见的对称加密算法在Java中的实现。

DES3DESAES(密钥)、PBE(口令和盐)

DES

JDK实现:生成并转换KeyCipher类的实例化(getInstance)、初始化(init选择模式与Key);执行(doFinal)加解密。

推荐BC实现方式:Security.addProvider(new BouncyCastleProvider());

然后剩下的代码就可以和JDK实现代码基本一样了。

 

3DESAES实现基本一样,所以就不一一介绍。。。

 

PBE(基于口令的加密)

特点:通过 salt + 口令

实现:初始化盐;生成口令;Cipher类加解密。

 

四、非对称加解密

非对称加密算法是一种基于密钥的保密方法,需要公开密钥和私有密钥,在文件加密、尤其是网银中应用广泛。这里主要介绍非对称加密算法的实现过程,DHRSAELGamal等几种常见的非对称加密算法的在Java中的应用。

 

概念:公钥、私钥;

DH(密钥交换算法)

代码实现有些麻烦

——初始化发送方密钥

-KeyPairGenerator :能产生KeyPair

-KeyPair :常用的密钥载体,称为密钥对,分为公钥PublicKey与私钥PrivateKey

-PublicKey

——初始化接收方密钥

-KeyFactory :密钥工厂,生成密钥,通过某种密钥的规范来还原密钥

-X509EncodedKeySpec :根据ASN.1进行密钥编码

-DHPublicKey

-DHParameterSpec :遵从DH算法发参数的集合

-KeyPairGenerator

-PrivateKey

——双发根据公布的对方的PublicKey构建本地密钥,

——构建出来的本地密钥是一致的

-KeyAgreement :用来提供密钥一致性协议

-SecretKey :秘密密钥,对称

-KeyFactory

-X509EncodedKeySpec

-PublicKey

——加密、解密(利用本地密钥)

-Cipher :为加密和解密提供密码功能的类

 

解释:

首先,发送方产生密钥对,并公开 公钥;接收方根据这个公钥产生密钥对,然后也公开自己的 公钥。

然后,发送方根据接收方的 公钥 产生自己本地的密钥(本地密钥一般是采用对称密钥),接收方也根据发送方的 公钥 产生自己本地的密钥。其实,这样双方产生的本地密钥是相同的。

最后,双方就可以利用本地密钥进行加解密了。

 

RSA(基于因子分解):代码实现较为简单

初始化密钥(包含公钥、密钥)。

可以利用公钥加密,私钥解密;也可以私钥加密,公钥解密

使用过程:双方分别掌握公钥与私钥中的一种,然后就可以加密并传输数据了。

public static void jdkRSA() {

	try {

		//1.初始化密钥

		KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");

		keyPairGenerator.initialize(512);

		KeyPair keyPair = keyPairGenerator.generateKeyPair();

		RSAPublicKey rsaPublicKey = (RSAPublicKey)keyPair.getPublic();

		RSAPrivateKey rsaPrivateKey = (RSAPrivateKey)keyPair.getPrivate();

		System.out.println("Public Key : " + Base64.encodeBase64String(rsaPublicKey.getEncoded())); 

		System.out.println("Private Key : " + Base64.encodeBase64String(rsaPrivateKey.getEncoded())); 

		

		//2.私钥加密、公钥解密——加密

		PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(rsaPrivateKey.getEncoded());

		KeyFactory keyFactory = KeyFactory.getInstance("RSA");

		PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);

		Cipher cipher = Cipher.getInstance("RSA");

		cipher.init(Cipher.ENCRYPT_MODE, privateKey);

		byte[] result = cipher.doFinal(src.getBytes());

		System.out.println("私钥加密、公钥解密——加密 : " + Base64.encodeBase64String(result));

		

		//3.私钥加密、公钥解密——解密

		X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(rsaPublicKey.getEncoded());

		keyFactory = KeyFactory.getInstance("RSA");

		PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec);

		cipher = Cipher.getInstance("RSA");

		cipher.init(Cipher.DECRYPT_MODE, publicKey);

		result = cipher.doFinal(result);

		System.out.println("私钥加密、公钥解密——解密:" + new String(result));

		

		//4.公钥加密、私钥解密——加密

		x509EncodedKeySpec = new X509EncodedKeySpec(rsaPublicKey.getEncoded());

		keyFactory = KeyFactory.getInstance("RSA");

		publicKey = keyFactory.generatePublic(x509EncodedKeySpec);

		cipher = Cipher.getInstance("RSA");

		cipher.init(Cipher.ENCRYPT_MODE, publicKey);

		result = cipher.doFinal(src.getBytes());

		System.out.println("公钥加密、私钥解密——加密 : " + Base64.encodeBase64String(result));

		

		//5.公钥加密、私钥解密——解密

		pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(rsaPrivateKey.getEncoded());

		keyFactory = KeyFactory.getInstance("RSA");

		privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);

		cipher = Cipher.getInstance("RSA");

		cipher.init(Cipher.DECRYPT_MODE, privateKey);

		result = cipher.doFinal(result);

		System.out.println("公钥加密、私钥解密——解密:" + new String(result));

	} catch (Exception e) {

		e.printStackTrace();

	}

}

 

EIGamal(基于离散因数)

JDK没有实现,只能利用BC实现。

首先,Security.addProvider(new BouncyCastleProvider());

之后实现类似于RSA

 

五.Java实现数字签名

 

数字签名用于鉴别数字信息,公钥和私钥,私钥对数据签名,公钥用于检验。

过程为:首先初始化一个密钥对,在密钥对的基础上进行签名与验证。

1、RSA:既可以加解密,也可以数字签名。

初始化密钥对:KeyPairGeneratorKeyPairRSAPublicPSAPrivate

执行签名;Signature

验证签名;Signature

2、DSA(数字签名算法)

初始化密钥对,公钥、私钥;

执行签名,用私钥签名;

验证签名,用公钥验证;

3、ECDSA

微软序列号便是采用的ECDSA算法进行的签名。速度快,强度高,签名短。

初始化密钥对;

执行签名;

验证签名

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值