java加密与解

    加密分为双向加密与单向加密。双向加密再为对称加密与非对称加密。对称加密即是加密与解密相同(DES)。非对称加密则密钥不同分为公钥与私钥(RSA)。单向加密则不可逆。用作信息摘要。

一、双向加密

可逆的加密,可以通过加密的数据还原原有数据,常用于数据信息传送的加密。分为两种,对称加密和非对称加密。

 

(一)对称加密

对称的主要体现是:加密和解密使用的密钥是相同的。

    存在的问题是,加密、解密使用的是同一把钥匙,解密方获得了密钥也获得了加密方式,密钥的保管称为了重要问题。


经典算法:

1DES算法:典型对称加密算法,对称加密的基础算法,56位。由于计算机技术的发展,已不再那么安全。

2DESede算法:三重DES算法,由DES演变而来,使用的多次迭代DES的方式,安全性提高,但速度慢。

3AES算法:优秀的DES代替算法,支持128位、192位、256位,安全、速度快。

4IDEA算法:DES的代替算法之一,邮件加密的一种算法。

5PEB算法:基于口令的算法,特殊的对称加密算法,使用了口令和盐两部分同时进行加密、解密,比较灵活。

 

(二)非对称加密

非对称的主要体现是:加密及解密的密钥是不同的,分别为私钥和公钥,成对出现。

非对称加密针对对称加密的不足进行了改变,使用成对的公钥和私钥代替了原先的密钥,非对称加密只需对解密方公布公钥,而不需要公布公钥,在安全上得到了进一步保证。

经典算法:

1DH算法:密钥交行算法,思想过度的算法。

2RSA算法:典型非对称加密算法,特点是公钥短、私钥长,公钥、私钥都可以进行加密和解密(公钥加密需要私钥解密、私钥加密需要公钥解密),基于数学大数因子分解。

3ElGaml算法:常用非对称加密算法,基于数学离散对数。

 

 二、单向加密(散列函数)

不可逆的加密,无法进行数据解密。

(一)信息摘要

常用于用户密码的存储、文件或数据完整性的校验。

 经典算法:

1MD算法:典型信息摘要算法,例如经典的MD5,算法包括MD2128位)、MD3MD4128位)、MD5128位)。

2SHA算法MD算法的继任者,通过MD4算法演变而来。更安全,摘要信息更长。算法包括:SHA-1160位)、SHA-256256位)、SHA-512512位)等。

3MAC算法:结合了MDSHA算法的优势,加入了密钥的支持(需要通过密钥对数据斤进行摘要处理)。算法包括:HmacMD2HmacMD5HmacSHA1HmacSHA256等。

 

(二)数字签名

带双钥的信息摘要算法,私钥签名、公钥校验。相比信息摘要,数字签名更安全。常用于交易验证、权限合法性校验。

 

经典算法:

1RSA算法:经典数字签名算法,与非对称加密的RSA算法是同一算法。

2DSA算法:数字签名标准算法。

3ECDSA算法:椭圆曲线数字签名算法,强度高、速度快、签名短、构建相当麻烦。

 

三、数字证书

有私钥库、公钥证书,私钥库保留、公钥证书公布,综合了非对称加密、数字签名、信息摘要技术。是网络平台安全的重要组成部分。

 非对称加密:用于确保数据的安全。

数字签名:用于确保数据的完整性、校验信息来源。

信息摘要:用于确保证书的完整性。

 

 

四、加密相关

Hex:十六进制转换,常用于信息摘要算法处理摘要值。

Base64:表单加密、加密方式公开。最早使用在电子邮件上,为处理编码问题产生,通常会做为密钥、密文的通用处理方式。



java RSA加密实例:


   package jiami;


import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;


import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;


public class EncrypRSA {


/**
* 加密

* @param publicKey
* @param srcBytes
* @return
* @throws NoSuchAlgorithmException
* @throws NoSuchPaddingException
* @throws InvalidKeyException
* @throws IllegalBlockSizeException
* @throws BadPaddingException
*/
protected byte[] encrypt(RSAPublicKey publicKey, byte[] srcBytes)
throws NoSuchAlgorithmException, NoSuchPaddingException,
InvalidKeyException, IllegalBlockSizeException, BadPaddingException {


if (publicKey != null) {
// Cipher负责完成加密或解密工作,基于RSA
Cipher cipher = Cipher.getInstance("RSA");
// 根据公钥,对Cipher对象进行初始化
cipher.init(Cipher.ENCRYPT_MODE, publicKey);


byte[] resultBytes = cipher.doFinal(srcBytes);


return resultBytes;
}


return null;
}


/**
* 解密

* @param privateKey
* @param srcBytes
* @return
* @throws NoSuchAlgorithmException
* @throws NoSuchPaddingException
* @throws InvalidKeyException
* @throws IllegalBlockSizeException
* @throws BadPaddingException
*/
protected byte[] decrypt(RSAPrivateKey privateKey, byte[] srcBytes)
throws NoSuchAlgorithmException, NoSuchPaddingException,
InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
if (privateKey != null) {
// Cipher负责完成加密或解密工作,基于RSA
Cipher cipher = Cipher.getInstance("RSA");
// 根据公钥,对Cipher对象进行初始化
cipher.init(Cipher.DECRYPT_MODE, privateKey);
byte[] resultBytes = cipher.doFinal(srcBytes);
return resultBytes;
}
return null;
}


/**
* @param args
* @throws NoSuchAlgorithmException
* @throws BadPaddingException
* @throws IllegalBlockSizeException
* @throws NoSuchPaddingException
* @throws InvalidKeyException
* @throws UnsupportedEncodingException
*/
public static void main(String[] args) throws NoSuchAlgorithmException,
InvalidKeyException, NoSuchPaddingException,
IllegalBlockSizeException, BadPaddingException,
UnsupportedEncodingException {
EncrypRSA rsa = new EncrypRSA();
String msg = "ccc";
// KeyPairGenerator类用于生成公钥和私钥对,基于RSA算法生成对象
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
// 初始化密钥对生成器,密钥大小为1024位
keyPairGen.initialize(1024);
// 生成一个密钥对,保存在keyPair中
KeyPair keyPair = keyPairGen.generateKeyPair();





// 得到私钥
RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
// 得到公钥
RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();


// 用公钥加密
byte[] srcBytes = msg.getBytes();
byte[] resultBytes = rsa.encrypt(publicKey, srcBytes);


// 用私钥解密
byte[] decBytes = rsa.decrypt(privateKey, resultBytes);


System.out.println("明文是:" + msg);
System.out.println("加密后是:" + new String(resultBytes));
System.out.println("解密后是:" + new String(decBytes));


byte[] b = keyPair.getPrivate().getEncoded();
Base64 enc = new Base64();
String s = enc.encode(b);
System.out.println(s);


}


}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值