JAVA加密算法- 密码学概述及使用一

密码学综述

密码学基本功能

机密性、鉴别、报文完整性、不可否认性

基本模型

sender-->加密算法 --> 密文 --> 解密算法 --> receiver

密钥源

密码学算法分类:

消息编码:Base64

消息摘要:MD类,SHA类,MAC

对称加密:DES,3DES,AES

非对称加密:RSA,DH密钥交换

数字签名:RSA signature,DSA signature

密码学五元组

明文、密文、加密算法、解密算法、密钥

加密解密算法都要使用公开算法(经过验证)

Java编程中的常用类

(1)消息编码

BASE64Encoder,BASE64Decoder

(2)消息摘要

MessageDigest

(3)对称密码

KeyGenerator、SecretKey、Cipher

(4)非对称密码

KeyPairGenerator、KeyFactory、KeyPair、PublicKey、PrivateKey、Cipher

(5)数字签名

Signature

JDK提供的Base64编码操作

import java.io.IOException;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

public class Base64Util {

  public static String encrypt(byte[] data) {
    return new BASE64Encoder().encode(data);
  }
  
  public static String decrypt(String data) throws IOException {
    return new String(new BASE64Decoder().decodeBuffer(data));
  }
  
  public static void main(String[] args) throws IOException {
    String data = "1234567890";
    
    String result = Base64Util.encrypt(data.getBytes());
    System.out.println(data +" 使用Base64编码的结果: "+result);
    
    String result2 = Base64Util.decrypt(result);
    System.out.println(result + "使用Base64解码的结果:" +result2);
    
  }
}

运行结果:

1234567890 使用Base64编码的结果: MTIzNDU2Nzg5MA==
MTIzNDU2Nzg5MA==使用Base64解码的结果:1234567890

PS1: 
Eclipse中找不到sun.misc.BASE64Encoder包的解决方法:
在工程的build path中先移除JRE System Library,再添加库JRE System Library,重新编译后就一切正常了。

PS2:
其他提供Base64操作的jar包,
Apache Commons Codec(简称CC),
Bouncy Castle(BC)

JAVA加密算法- 消息摘要算法(MD5、SHA、HMAC)

消息摘要的概念

对消息通过一个单向Hash算法进行计算,得到一个唯一的结果。每个消息对应一个唯一结果,所有结果的长度固定。

消息摘要的分类

(1)MD5(Message Digest)消息摘要算法
(2)SHA(Secure Hash Algorithm)安全散列算法
(3)MAC(Message Authentication Code)消息认证码算法,结合了MD5和SHA的优势,同时用密钥对摘要进行加密,是一种更为安全的消息摘要算法。

日常应用

校验数据的完整性,防止在传输途中被篡改

编程使用

import java.io.File;
import java.io.FileInputStream;
import java.security.DigestInputStream;
import java.security.MessageDigest;

import javax.crypto.KeyGenerator;
import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

public class MessageDigestUtil {

  /**
   * 计算MD5值
   */
  public static String encryptMD5(byte[] data) throws Exception {
    MessageDigest messageDigest = MessageDigest.getInstance("MD5");//MD5,MD2
    messageDigest.update(data);
    return BytesToHex.fromBytesToHex(messageDigest.digest());
  }

  /**
   * 计算文件的MD5值(指纹签名)
   */
  public static String getFileMD5(String path) throws Exception {
    FileInputStream fis = new FileInputStream(new File(path));
    DigestInputStream dis = new DigestInputStream(fis, MessageDigest.getInstance("MD5"));
    try {
      byte[] buffer = new byte[1024];
      int read = dis.read(buffer, 0, 1024);
      while (read != -1) {
        read = dis.read(buffer, 0, 1024);
      }
      MessageDigest md = dis.getMessageDigest();
      return BytesToHex.fromBytesToHex(md.digest());
    } finally {
      dis.close();
      fis.close();
    }

  }

  /**
   * 计算SHA值
   */
  public static String encryptSHA(byte[] data) throws Exception {
    MessageDigest messageDigest = MessageDigest.getInstance("SHA");//SHA,SHA1,SHA-1,SHA-256,SHA-384,SHA-512
    messageDigest.update(data);
    return BytesToHex.fromBytesToHex(messageDigest.digest());
  }

  /**
   * 初始化HMAC密钥
   */
  public static byte[] initHmacKey() throws Exception {
    KeyGenerator keyGenerator = KeyGenerator.getInstance("HmacSHA512");//HmacMD5,HmacSHA1,HmacSHA256,HmacSHA384,HmacSHA512
    return keyGenerator.generateKey().getEncoded();
  }

  /**
   * 使用Hmac生成的密钥对数据进行加密
   */
  public static String encryptHmac(byte[] data, byte[] key) throws Exception {
    SecretKey secretKey = new SecretKeySpec(key, "HmacSHA512");
    Mac mac = Mac.getInstance("HmacSHA512");
    mac.init(secretKey);
    return BytesToHex.fromBytesToHex(mac.doFinal(data));
  }

  public static void main(String[] args) throws Exception {
    String data = "123456";
    String path = "/Users/admin/Downloads/httpd-2.4.20.tar.gz";
    
    System.out.println(data + " 的MD5值: " + MessageDigestUtil.encryptMD5(data.getBytes()));
    System.out.println(path + " 的文件MD5签名: " + MessageDigestUtil.getFileMD5(path));
    System.out.println(data + " 的SHA值: " + MessageDigestUtil.encryptSHA(data.getBytes()));

    byte[] hmacKey = initHmacKey();
    System.out.println("初始化Hmac密钥:" + BytesToHex.fromBytesToHex(hmacKey));
    System.out.println(data + " 是的Hmac加密值为: " + MessageDigestUtil.encryptHmac(data.getBytes(), hmacKey));
  }

}
字节码数组转成16进制字符串工具类
public class BytesToHex {
    
    public static String fromBytesToHex(byte[] resultBytes) {
        StringBuilder builder = new StringBuilder();
        for (int i = 0; i < resultBytes.length; i++) {
            if (Integer.toHexString(0xFF & resultBytes[i]).length() == 1) {
                builder.append("0").append(
                        Integer.toHexString(0xFF & resultBytes[i]));
            } else {
                builder.append(Integer.toHexString(0xFF & resultBytes[i]));
            }
        }
        return builder.toString();
    }

}



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值