加密体系

 加密包含:

     1、双向加密,能加密能解密,包含对称加密、非对称加密。
     2、单向加密,只能加密无法解密,包含信息摘要、数字签名。
     3、数字证书,使用非对称加密(加密内容)、数字签名(校验内容完整性)、信息摘要(校验证书文件)。

 

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

 /* Hex字节数组转字符串 */
 String str = Hex.toHexString(byteArr);

 

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

 /* 密文、密钥的处理 */
 String str = new String(Base64.encode(byteArr));
 /* 解密、密钥使用时处理 */
 byte[] bytes = Base64.decode(str.getBytes());

 

 信息摘要:

     经典算法:
         1、MD算法:典型信息摘要算法,例如经典的MD5,算法包括MD2(128位)、MD3、MD4(128位)、MD5(128位)。
         2、SHA算法:MD算法的继任者,通过MD4算法演变而来。更安全,摘要信息更长。算法包括:SHA-1(160位)、SHA-256(256位)、SHA-512(512位)等。
         3、MAC算法:结合了MD、SHA算法的优势,加入了密钥的支持(需要通过密钥对数据斤进行摘要处理)。算法包括:HmacMD2、HmacMD5、HmacSHA1、HmacSHA256等。

 /* 实例化信息摘要对象 */
 MessageDigest md = MessageDigest.getInstance(type);
 /* 摘要处理 */
 byte[] bytes = md.digest(byteArr);
 /* 文件信息摘要 */
 DigestInputStream dis = new DigestInputStream(inputStream, md);
 /* 读取流,这里必须空读一遍 */
 byte[] buffer = new byte[1024]
 while (dis.read(buffer, 0, 1024) != -1) {}
 /* 获取信息摘要 */
 byte[] bytes = md.digest();

 

 对称加密:

     特点:加密和解密使用的密钥是相同的。

     经典算法:
         1、DES算法:典型对称加密算法,对称加密的基础算法,56位。由于计算机技术的发展,已不再那么安全。
         2、DESede算法:三重DES算法,由DES演变而来,使用的多次迭代DES的方式,安全性提高,但速度慢。
         3、AES算法:优秀的DES代替算法,支持128位、192位、256位,安全、速度快。
         4、IDEA算法:DES的代替算法之一,邮件加密的一种算法。
         5、PEB算法:基于口令的算法,特殊的对称加密算法,使用了口令和盐两部分同时进行加密、解密,比较灵活。

 /* 加密处理 */
 /* 构建密钥生成器 */
 KeyGenerator kg = KeyGenerator.getInstance(type);
 /* 获取密钥对象 */
 SecretKey sk = kg.generateKey();
 /* 获取密钥的字节数组,发送时可以通过Base64转换为字符串 */
 byte[] key= sk.getEncoded();
 /* 构造密文处理器 */
 Cipher cipher = Cipher.getInstance(type);
 /* 通过密钥初始化,ENCRYPT_MODE是加密模式 */
 cipher.init(Cipher.ENCRYPT_MODE, sk);
 /* 加密处理 */
 byte[] bytes = cipher.doFinal(byteArr);
 /* 解密处理 */
 /* 通过密钥的byte数组重构密钥 */
 SecretKey sk = new SecretKeySpec(key, type);
 /* 构造密文处理器 */
 Cipher cipher = Cipher.getInstance(type);
 /* 通过密钥初始化,DECRYPT_MODE是解密模式 */
 cipher.init(Cipher. DECRYPT_MODE, sk);
 /* 解密处理 */
 byte[] bytes = cipher.doFinal(byteArr);
 /* 文件加密 */
 /* 新建加密处理类对象 */
 Cipher cipher = Cipher.getInstance(type);
 /* 通过密钥初始化加密类 */
 cipher.init(Cipher.ENCRYPT_MODE, sk);
 /* 待加密文件流 */
 InputStream is = new FileInputStream(file);
 /* 输出文件流 */
 OutputStream os = new FileOutputStream(cryptFile);
 /* 获取加密后输入流 */
 CipherInputStream cis = new CipherInputStream(is, cipher);
 /* 写入文件 */
 byte[] buffer = new byte[1024];
 int count;
 while ((count = cis.read(buffer)) != -1) {
     os.write(buffer, 0, count);
 }
 /* 关闭流 */
 cis.close();
 is.close();
 os.close();
 /* 文件解密 */
 /* 新建加密处理类对象 */
 Cipher cipher = Cipher.getInstance(type);
 /* 通过密钥初始化加密类 */
 cipher.init(Cipher.DECRYPT_MODE, sk);
 /* 加密文件流 */
 InputStream is = new FileInputStream(file);
 /* 输出文件流 */
 OutputStream os = new FileOutputStream(cryptFile);
 /* 获取加密后输入流 */
 CipherOutputStream cos = new CipherOutputStream(os, cipher);
 /* 写入文件 */
 byte[] buffer = new byte[1024];
 int count;
 while ((count = is.read(buffer)) != -1) {
     cos.write(buffer, 0, count);
 }
 /* 关闭流 */
 cos.close();
 is.close();
 os.close();

 

 非对称加密:

     特点:加密及解密的密钥是不同的,分别为私钥和公钥,成对出现。

     经典算法:
         1、DH算法:密钥交行算法,思想过度的算法。
         2、RSA算法:典型非对称加密算法,特点是公钥短、私钥长,公钥、私钥都可以进行加密和解密(公钥加密需要私钥解密、私钥加密需要公钥解密),基于数学大数因子分解。
         3、ElGaml算法:常用非对称加密算法,基于数学离散对数。

 /* 密钥生成 */
 /* 实例化密钥生成对象 */
 KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(type);
 /* 生成密钥对 */
 KeyPair keyPair = keyPairGen.generateKeyPair();
 /* 获取公钥 */
 PublicKey publicKey = keyPair.getPublic();
 /* 获取私钥 */
 PrivateKey privateKey = keyPair.getPrivate();
 /* 获取公钥字节数组 */
 byte[] public_key = publicKey.getEncoded();
 /* 获取私钥字节数组 */
 byte[] private_key = privateKey.getEncoded();
 /* 实例化公私钥 */
 /* 私钥 */
 /* 实例化私钥处理对象 */
 PKCS8EncodedKeySpec pkcs8Encoded = new PKCS8EncodedKeySpec(private_key);
 /* 实例化密钥处理工厂对象 */
 KeyFactory keyFactory = KeyFactory.getInstance(type);
 /* 生成私钥 */
 PrivateKey key = keyFactory.generatePrivate(pkcs8Encoded);
 
 /* 公钥 */
 /* 实例化公钥处理对象*/
 X509EncodedKeySpec x509Encoded = new X509EncodedKeySpec(public_key);
 /* 实例化密钥处理工厂对象 */
 KeyFactory keyFactory = KeyFactory.getInstance(type);
 /* 生成公钥 */
 PublicKey key = keyFactory.generatePublic(x509Encoded);
 /* 加密处理 */
 /* 实例化加密处理对象 */
 Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
 /* 初始化加密处理对象,只有RSA算法支持公钥的加密,公钥加密对应私钥解密 */
 cipher.init(Cipher.ENCRYPT_MODE, key);
 /* 加密处理 */
 byte[] bytes = cipher.doFinal(byteArr);
/* 解密处理 */
/* 实例化加密处理对象 */
 Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
 /* 初始化加密处理对象,只有RSA算法支持私钥的解密,私钥解密对应公钥加密 */
 cipher.init(Cipher.DECRYPT_MODE, key);
 /* 解密处理 */
 byte[] bytes = cipher.doFinal(byteArr);

 

 数字签名:

     特点:带双钥的信息摘要算法,私钥签名、公钥校验。

     经典算法:
         1、RSA算法:经典数字签名算法,与非对称加密的RSA算法是同一算法。
         2、DSA算法:数字签名标准算法。
         3、ECDSA算法:椭圆曲线数字签名算法,强度高、速度快、签名短、构建相当麻烦。

 /* 私钥签名 */
 /* 实例化签名处理对象 */
 Signature sign = Signature.getInstance(type);
 /* 初始化签名处理对象 */
 sign.initSign(key);
 /* 填充签名信息 */
 sign.update(byteArr);
 /* 签名处理 */
 byte[] bytes = sign.sign();
/* 公钥校验 */
 /* 实例化签名处理对象 */
 Signature verify = Signature.getInstance(type);
 /* 初始化签名处理对象 */
 verify.initVerify(key);
 /* 填充签名信息 */
 verify.update(byteArr);
 /* 签名校验处理 */
 boolean succ = verify.verify(bytes);

 

转载于:https://my.oschina.net/loongzcx/blog/371658

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值