美文网首页
常用的加解密算法

常用的加解密算法

作者: 扮鬼之梦 | 来源:发表于2021-03-29 14:57 被阅读0次

包含MD5、SHA1、SHA256、AES

工具类

import org.apache.commons.codec.binary.Base64;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.SecretKeySpec;
import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class CryptoUtil {

    private static final String UTF_8 = "UTF-8";

    /**
     * MD5
     * 默认得到32位的小写结果
     * 想要获取16位MD5可md5(content).substring(8, 24)
     * https://md5jiami.bmcx.com/
     */
    public static String md5(String content) {
        MessageDigest messageDigest = null;
        try {
            messageDigest = MessageDigest.getInstance("MD5");
            messageDigest.update(content.getBytes(UTF_8));
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException("算法不存在", e);
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException("编码失败", e);
        }
        return byte2Hex(messageDigest.digest());
    }

    /**
     * SHA1
     * http://www.ttmd5.com/hash.php?type=5
     */
    public static String sha1(String content) {
        MessageDigest messageDigest = null;
        try {
            messageDigest = MessageDigest.getInstance("SHA-1");
            messageDigest.update(content.getBytes(UTF_8));
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException("算法不存在", e);
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException("编码失败", e);
        }
        return byte2Hex(messageDigest.digest());
    }

    /**
     * SHA256
     * http://www.ttmd5.com/hash.php?type=9
     */
    public static String sha256(String content) {
        MessageDigest messageDigest = null;
        try {
            messageDigest = MessageDigest.getInstance("SHA-256");
            messageDigest.update(content.getBytes(UTF_8));
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException("算法不存在", e);
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException("编码失败", e);
        }
        return byte2Hex(messageDigest.digest());
    }

    /**
     * byte转String
     */
    private static String byte2Hex(byte[] bytes) {
        StringBuffer stringBuffer = new StringBuffer();
        String temp = null;
        for (int i = 0; i < bytes.length; i++) {
            temp = Integer.toHexString(bytes[i] & 0xFF);
            if (temp.length() == 1) {
                stringBuffer.append("0");
            }
            stringBuffer.append(temp);
        }
        return stringBuffer.toString();
    }

    /**
     * AES加密/解密
     * http://tool.chacuo.net/cryptaes
     */
    private static final String ALGORITHMSTR = "AES/ECB/PKCS5Padding"; // 算法名称/加密模式/数据填充方式
    private static final String AES = "AES";

    /**
     * AES加密
     */
    public static String aesEncrypt(String content, String encryptKey) {
        byte[] b = null;
        try {
            Cipher cipher = Cipher.getInstance(ALGORITHMSTR);
            SecretKeySpec secretKeySpec = new SecretKeySpec(encryptKey.getBytes(), AES);
            cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);
            b = cipher.doFinal(content.getBytes(UTF_8));
        } catch (NoSuchPaddingException | BadPaddingException e) {
            throw new RuntimeException("填充失败", e);
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException("算法不存在", e);
        } catch (InvalidKeyException e) {
            throw new RuntimeException("请输入16位的密码", e);
        } catch (UnsupportedEncodingException | IllegalBlockSizeException e) {
            throw new RuntimeException("编码失败", e);
        }
        return Base64.encodeBase64String(b);
    }

    /**
     * AES解密
     */
    public static String aesDecrypt(String content, String decryptKey) {
        byte[] decryptBytes = null;
        try {
            Cipher cipher = Cipher.getInstance(ALGORITHMSTR);
            SecretKeySpec secretKeySpec = new SecretKeySpec(decryptKey.getBytes(), AES);
            cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);
            byte[] encryptBytes = Base64.decodeBase64(content);
            decryptBytes = cipher.doFinal(encryptBytes);
        } catch (NoSuchPaddingException | BadPaddingException e) {
            throw new RuntimeException("填充失败", e);
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException("算法不存在", e);
        } catch (InvalidKeyException e) {
            throw new RuntimeException("请输入16位的密码", e);
        } catch (IllegalBlockSizeException e) {
            throw new RuntimeException("编码失败", e);
        }
        return new String(decryptBytes);
    }

    public static void main(String[] args) {
        System.out.println("----------------------------");
        String content = "123456";
        System.out.println("明文: " + content);

        String md5 = CryptoUtil.md5(content);

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

        System.out.println("sha1: " + CryptoUtil.sha1(content));

        System.out.println("sha256: " + CryptoUtil.sha256(content));

        System.out.println("----------------------------");
        System.out.println("明文: " + content);

        String key = md5.substring(8, 24);
        System.out.println("密码(123456的16位MD5): " + key);

        String s = CryptoUtil.aesEncrypt(content, key);
        System.out.println("密文: " + s);

        String s1 = CryptoUtil.aesDecrypt(s, key);
        System.out.println("解密的明文: " + s1);

        System.out.println("----------------------------");
    }

}

结果

image

相关文章

  • 区块链之加解密算法

    常用的加解密算法  常用的加解密算法有三类:对称加密算法、非对称加密算法以及hash加密算法。 在比特币中用到了非...

  • iOS常用加密算法介绍和代码实践

    iOS系统库中定义了软件开发中常用的加解密算法,接口为C语言形式。具体包括了以下几个大类: 其中第一类常用加解密算...

  • 1. 常用的加密算法

    常用的加解密算法分三大类:非对称密钥加密算法、对称密钥加密算法、Hash加密算法 非对称密钥加密算法常见算法:RS...

  • 常用的加解密算法

    包含MD5、SHA1、SHA256、AES 工具类 结果

  • iOS开发加解密算法-基础篇(1)<MD5,sha1,和大

    项目也快两年了,项目这么长时间下来经历了各种加解密算法,坑也踩过不少.现在把项目中使用过一些常用的加解密算法总结一...

  • 常用的加解密算法的优缺点、应用场景总结

    常用的加解密算法的优缺点、应用场景总结 一、加解密的基础知识 1、对称密钥加密 对称密钥加密(一个密钥),也叫做共...

  • DES-Python加解密案例

    在python中处理des加解密,常用的库是pyDes这个库,现在以具体例子来讲解加解密算法1、需求:对一段数字或...

  • Java常用加解密算法

    1、BASE64 BASE64严格地说,应该说是属于编码格式,而非加密算法。 加解密: 2、MD5和SHA MD5...

  • Java安全编程:RSA加密解密

    安全 RSA RSA是最常用非对称加密算法。常用于消息签名。它的加解密的密钥是成对出现的。使用私钥加密只能用对应的...

  • RSA公钥加密算法笔记

    RSA是目前最有影响力和常用的公钥加密算法 这篇笔记目的是梳理RSA算法加解密的证明思路RSA算法是一种非对称密码...

网友评论

      本文标题:常用的加解密算法

      本文链接:https://www.haomeiwen.com/subject/acsbhltx.html