您当前的位置:首页 > 电脑百科 > 程序开发 > 算法

常用加密算法及Java实现

时间:2023-02-28 11:03:50  来源:  作者:river106

加密在平时开发中也会经常用到,涉及登录、支付、接口设计等方面,可能都需要考虑到加密算法,加密算法分对称加密和非对称加密,对称加密使用的密钥只有一个,发送和接收双方都使用这个密钥对数据进行加密和解密,非对称加密算法,需要两个密钥,一个是公钥 (public key),另一个是私钥 (private key),如果使用公钥对数据 进行加密,只有用对应的私钥才能进行解密。如果使用私钥对数据 进行加密,只有用对应的公钥才能进行解密。

 

1、MD5

MD5一般用于对一段信息产生信息摘要即生成数字签名,以防止被篡改。无论是多长的输入,MD5 都会输出长度为128bits 的一个串 (通常用16进制表示为32个字符)。

JAVA代码如下:

import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
 
public class Md5Utils {
 
    private static final String UTF8 = "utf-8";
 
    /**
     * 加密
     *
     * @param plAInText 待加密字符串
     * @return
     */
    public final static String encoder(String plainText)
            throws NoSuchAlgorithmException, UnsupportedEncodingException {
        byte[] bytes = plainText.getBytes(UTF8);
        MessageDigest mdInst = MessageDigest.getInstance("MD5");
        mdInst.update(bytes);
        byte[] md = mdInst.digest();
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < md.length; i++) {
            int val = ((int) md[i]) & 0xff;
            if (val < 16) {
                sb.Append("0");
            }
            sb.append(Integer.toHexString(val));
        }
        return sb.toString();
    }
 
}

 

2、SHA1

SHA1 是和 MD5 一样流行的 消息摘要算法,然而 SHA1 比 MD5 的 安全性更强。对于长度小于 2^64 位的消息,SHA1 会产生一个 160 位的消息摘要。基于MD5、SHA1 的信息摘要一般而言不可逆 ,可以被应用在检查 文件完整性以及数字签名等场景。

java代码如下:

import java.security.MessageDigest;
 
public final class Sha1Utils {
    private static final char[] HEX_DIGITS = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
 
    private static String getFormattedText(byte[] bytes) {
        int len = bytes.length;
        StringBuilder buf = new StringBuilder(len * 2);
        // 把密文转换成十六进制的字符串形式
        for (int j = 0; j < len; j++) {
            buf.append(HEX_DIGITS[(bytes[j] >> 4) & 0x0f]);
            buf.append(HEX_DIGITS[bytes[j] & 0x0f]);
        }
        return buf.toString();
    }
 
    public static String encode(String str) {
        if (str == null) {
            return null;
        }
        try {
            MessageDigest messageDigest = MessageDigest.getInstance("SHA1");
            messageDigest.update(str.getBytes());
            return getFormattedText(messageDigest.digest());
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
 
}

 

3、RSA

RSA 加密算法是目前比较优秀的公钥方案。RSA是第一个能同时用于加密和数字签名的算法,它能够抵抗到目前为止已知的 所有密码攻击,已被ISO推荐为公钥数据加密标准。RSA 加密算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但想要对其乘积进行 因式分解却极其困难,因此可以将乘积公开作为加密密钥。

java代码如下:

import javax.crypto.Cipher;
import java.security.*;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;
 
public class RsaUtils {
 
    private static final String UTF8 = "UTF-8";
 
    /**
     * 随机生成密钥对
     *
     * @throws NoSuchAlgorithmException
     */
    public static RsaKeyPair generateKeyPair() throws NoSuchAlgorithmException {
        // KeyPairGenerator类用于生成公钥和私钥对,基于RSA算法生成对象
        KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
        // 初始化密钥对生成器,密钥大小为96-1024位
        keyPairGen.initialize(1024, new SecureRandom());
        // 生成一个密钥对,保存在keyPair中
        KeyPair keyPair = keyPairGen.generateKeyPair();
        // 得到私钥
        RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
        // 得到公钥
        RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
        // 得到公钥字符串
        String publicKeyString = new String(Base64.getEncoder().encode(publicKey.getEncoded()));
        // 得到私钥字符串
        String privateKeyString = new String(Base64.getEncoder().encode((privateKey.getEncoded())));
        return new RsaKeyPair(publicKeyString, privateKeyString);
    }
 
    /**
     * RSA公钥加密
     *
     * @param plainText 加密字符串
     * @param publicKey 公钥
     * @return 密文
     * @throws Exception
     */
    public static String encrypt(String plainText, String publicKey) throws Exception {
        // base64编码的公钥
        byte[] decoded = Base64.getDecoder().decode(publicKey.getBytes(UTF8));
        RSAPublicKey pubKey = (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(decoded));
        // RSA加密
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.ENCRYPT_MODE, pubKey);
        byte[] encodeBytes = Base64.getEncoder().encode(cipher.doFinal(plainText.getBytes(UTF8)));
        return new String(encodeBytes, UTF8);
    }
 
    /**
     * RSA私钥解密
     *
     * @param encryptText 加密字符串
     * @param privateKey  私钥
     * @return 明文
     * @throws Exception
     */
    public static String decrypt(String encryptText, String privateKey) throws Exception {
        // 64位解码加密后的字符串
        byte[] inputByte = Base64.getDecoder().decode(encryptText.getBytes(UTF8));
        // base64编码的私钥
        byte[] decoded = Base64.getDecoder().decode(privateKey.getBytes(UTF8));
        RSAPrivateKey priKey = (RSAPrivateKey) KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(decoded));
        // RSA解密
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.DECRYPT_MODE, priKey);
        String outStr = new String(cipher.doFinal(inputByte));
        return outStr;
    }
 
 
    public static void main(String[] args) throws Exception {
        // 生成公钥和私钥
        RsaKeyPair rsaKeyPair = generateKeyPair();
        // 加密字符串
        String message = "river106";
        System.out.println("随机生成的公钥为:" + rsaKeyPair.getPublicKey());
        System.out.println("随机生成的私钥为:" + rsaKeyPair.getPrivateKey());
		System.out.println("原始内容: "+message);
        String encryptText = encrypt(message, rsaKeyPair.getPublicKey());
        System.out.println("加密后的字符串为:" + encryptText);
        String messageDe = decrypt(encryptText, rsaKeyPair.getPrivateKey());
        System.out.println("解密后的字符串为:" + messageDe);
    }
 
    private static class RsaKeyPair {
        private String publicKey;
        private String privateKey;
 
		public RsaKeyPair() {
		}
 
		public RsaKeyPair(String publicKey, String privateKey) {
            this.publicKey = publicKey;
            this.privateKey = privateKey;
        }
 
        public String getPublicKey() {
            return publicKey;
        }
 
        public void setPublicKey(String publicKey) {
            this.publicKey = publicKey;
        }
 
        public String getPrivateKey() {
            return privateKey;
        }
 
        public void setPrivateKey(String privateKey) {
            this.privateKey = privateKey;
        }
    }
 
}

 

4、DES

DES是对称的块加密算法,加解密的过程是可逆的。

DES 加密算法是一种分组密码,以 64 位为 分组对数据 加密,它的密钥长度是56位,加密解密用同一算法。

DES 加密算法是对密钥进行保密,而公开算法,包括加密和解密算法。这样,只有掌握了和发送方相同密钥的人才能解读由 DES加密算法加密的密文数据。因此,破译 DES 加密算法实际上就是搜索密钥的编码。对于56位长度的密钥来说,如果用穷举法来进行搜索的话,其运算次数为2^56次。

java代码如下:

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
 
 
public class DesUtils {
 
    private static final String UTF8 = "UTF-8";
    private static byte[] iv = {1, 2, 3, 4, 5, 6, 7, 8};
 
    /**
     * DES加密
     * @param plainText   待加密内容
     * @param encryptKey  加密key
     * @return
     * @throws Exception
     */
    public static String encrypt(String plainText, String encryptKey) throws Exception {
        IvParameterSpec zeroIv = new IvParameterSpec(iv);
        SecretKeySpec key = new SecretKeySpec(encryptKey.getBytes(), "DES");
        Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, key, zeroIv);
        byte[] encryptedData = cipher.doFinal(plainText.getBytes(UTF8));
        return new String(Base64.getEncoder().encode(encryptedData), UTF8);
    }
 
    /**
     * DES解密
     * @param encryptedText  已加密内容
     * @param decryptKey     解密key
     * @return
     * @throws Exception
     */
    public static String decrypt(String encryptedText, String decryptKey) throws Exception {
        IvParameterSpec zeroIv = new IvParameterSpec(iv);
        SecretKeySpec key = new SecretKeySpec(decryptKey.getBytes(UTF8), "DES");
        Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
        cipher.init(Cipher.DECRYPT_MODE, key, zeroIv);
        byte decryptedData[] = cipher.doFinal(Base64.getDecoder().decode(encryptedText.getBytes(UTF8)));
        return new String(decryptedData, UTF8);
    }
 
}

 

5、AES

AES是对称的块加密算法,加解密的过程是可逆的。

AES 加密算法是密码学中的高级加密标准,该加密算法采用对称分组密码体制,密钥长度的最少支持为128位、 192位、256位,分组长度128位,算法应易于各种硬件和软件实现。这种加密算法是美国联邦政府采用的区块加密标准。

AES 本身就是为了取代 DES 的,AES具有更好的安全性、效率和灵活性。

java代码如下:

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.security.SecureRandom;
 
public class AesUtils {
 
 
    /**
     * 加密
     *
     * @param content  需要加密的内容
     * @param password 加密密码
     * @return
     */
    public static String encrypt(String content, String password) throws Exception {
        StringBuilder sb = new StringBuilder();
        KeyGenerator kgen = KeyGenerator.getInstance("AES");
        SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
        secureRandom.setSeed(password.getBytes());
        kgen.init(128, secureRandom);
        SecretKey secretKey = kgen.generateKey();
        byte[] enCodeFormat = secretKey.getEncoded();
        SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
        // 创建密码器
        Cipher cipher = Cipher.getInstance("AES");
        byte[] byteContent = content.getBytes("utf-8");
        // 初始化
        cipher.init(Cipher.ENCRYPT_MODE, key);
        byte[] result = cipher.doFinal(byteContent);
        // 将10进制字节数组转化为16进制字符串
        for (int i = 0; i < result.length; i++) {
            String hex = Integer.toHexString(result[i] & 0xFF);
            if (hex.length() == 1) {
                hex = '0' + hex;
            }
            sb.append(hex.toUpperCase());
        }
        return sb.toString();
    }
 
    /**
     * 解密
     *
     * @param content  待解密内容
     * @param password 解密密钥
     * @return
     */
    public static String decrypt(String content, String password) throws Exception {
        // 将16进制字符创转为10进制字节数组
        byte[] result = new byte[content.length() / 2];
        for (int i = 0; i < content.length() / 2; i++) {
            int high = Integer.parseInt(content.substring(i * 2, i * 2 + 1), 16);
            int low = Integer.parseInt(content.substring(i * 2 + 1, i * 2 + 2), 16);
            result[i] = (byte) (high * 16 + low);
        }
        KeyGenerator kgen = KeyGenerator.getInstance("AES");
        SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
        secureRandom.setSeed(password.getBytes());
        kgen.init(128, secureRandom);
        SecretKey secretKey = kgen.generateKey();
        byte[] enCodeFormat = secretKey.getEncoded();
        SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
        // 创建密码器
        Cipher cipher = Cipher.getInstance("AES");
        // 初始化
        cipher.init(Cipher.DECRYPT_MODE, key);
        byte[] data = cipher.doFinal(result);
        return new String(data);
    }
 
}

 



Tags:加密算法   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
浅谈加密算法
Part 01 什么是加密算法 加密算法是一种密码学算法,就是指将信息变成密文的加密技术,加密算法可以实现对数据所属方的隐私保护,并在保护隐私的前提下,实现数据的匿踪共享。通过...【详细内容】
2023-10-17  Search: 加密算法  点击:(246)  评论:(0)  加入收藏
RSA加密算法原理及JS实现
发展史1976年以前,加密世界主要采用对称加密算法(Symmetric-key algorithm)。对称加密存在让人头疼的问题:甲乙双方通信,甲方必须把加密规则告诉乙方,否则无法解密。保存和传递密...【详细内容】
2023-04-07  Search: 加密算法  点击:(312)  评论:(0)  加入收藏
如何选择 SSL证书的加密算法:RSA、ECC、SM2
沃通CA可以提供这三种加密算法的SSL证书。 RSA、ECC、SM2。这也是目前 SSL证书涉及到的 3 种加密算法。按照目前的使用普遍度:RSA > ECC > SM2SSL证书在提交申请的时候,就会需...【详细内容】
2023-04-06  Search: 加密算法  点击:(268)  评论:(0)  加入收藏
常用加密算法及Java实现
加密在平时开发中也会经常用到,涉及登录、支付、接口设计等方面,可能都需要考虑到加密算法,加密算法分对称加密和非对称加密,对称加密使用的密钥只有一个,发送和接收双方都使用这...【详细内容】
2023-02-28  Search: 加密算法  点击:(118)  评论:(0)  加入收藏
SM1~SM7 国密加密算法介绍
密码技术的安全可靠关系着我国网络安全,目前广泛应用的国际通用密码算法如RSA、SHA-1、MD5、DES、3DES、AES以及以这些算法为基础实现的数字签名/验签、数据加密/解密、密钥...【详细内容】
2022-06-21  Search: 加密算法  点击:(858)  评论:(0)  加入收藏
关于加密算法你了解多少
说起区块链,似乎大家都懂一点,再往细里一问,似乎又都不懂了。比如,你问一个人:为什么要挖矿,挖的到底是啥。怕是没几个明白人。本文就是要给你讲明白!前言人们一说起区块链,就常常说...【详细内容】
2021-07-13  Search: 加密算法  点击:(457)  评论:(0)  加入收藏
破了这几种爬虫加密算法后,我的路更近了「JS逆向3」
来源:麦叔编程作者:kevin。JS逆向是爬虫的难点,是爬虫路上的拦路虎。所谓逆向就是破解网站使用的JS加密算法,拆解相关的参数。然后就可以登堂入室了。 本文总结了JS中最常用的加...【详细内容】
2021-03-04  Search: 加密算法  点击:(512)  评论:(0)  加入收藏
比RSA加密更快更安全的加密算法ECC
前几天我发表一片关于RSA的加密算法,很多人留言让我讲解一下ECC 椭圆加密算法。首先我在这里声明一下 椭圆加密算法不像RSA 用中学的数学知识就可以解决。本文中也是参考了网...【详细内容】
2020-12-30  Search: 加密算法  点击:(930)  评论:(0)  加入收藏
DES/3DES/AES 三种对称加密算法实现
1. 简单介绍3DES(或称为Triple DES)是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称。它相当于是对每个数据块应用三次DES加密算法。由于计算机运算能力...【详细内容】
2020-09-25  Search: 加密算法  点击:(278)  评论:(0)  加入收藏
作为程序员的你必须了解的常用加密算法
加密算法我们整体可以分为:可逆加密和不可逆加密,可逆加密又可以分为:对称加密和非对称加密。一、不可逆加密常见的不可逆加密算法有MD5,HMAC,SHA1、SHA-224、SHA-256、SHA-384,和...【详细内容】
2020-08-02  Search: 加密算法  点击:(356)  评论:(0)  加入收藏
▌简易百科推荐
小红书、视频号、抖音流量算法解析,干货满满,值得一看!
咱们中国现在可不是一般的牛!网上的网友已经破了十个亿啦!到了这个互联网的新时代,谁有更多的人流量,谁就能赢得更多的掌声哦~抖音、小红书、、视频号,是很多品牌必争的流量洼地...【详细内容】
2024-02-23  二手车小胖说    Tags:流量算法   点击:(13)  评论:(0)  加入收藏
雪花算法详解与Java实现:分布式唯一ID生成原理
SnowFlake 算法,是 Twitter 开源的分布式 ID 生成算法。其核心思想就是:使用一个 64 bit 的 long 型的数字作为全局唯一 ID。在分布式系统中的应用十分广泛,且 ID 引入了时间戳...【详细内容】
2024-02-03   一安未来  微信公众号  Tags:雪花算法   点击:(50)  评论:(0)  加入收藏
程序开发中常用的十种算法,你用过几种?
当编写程序时,了解和使用不同的算法对解决问题至关重要。以下是C#中常用的10种算法,每个算法都伴随着示例代码和详细说明。1. 冒泡排序 (Bubble Sort):冒泡排序是一种简单的比...【详细内容】
2024-01-17  架构师老卢  今日头条  Tags:算法   点击:(44)  评论:(0)  加入收藏
百度推荐排序技术的思考与实践
本文将分享百度在推荐排序方面的思考与实践。在整个工业界的推广搜场景上,特征设计通常都是采用离散化的设计,需要保证两方面的效果,一方面是记忆,另一方面是泛化。特征都是通过...【详细内容】
2024-01-09  DataFunTalk  微信公众号  Tags:百度推荐   点击:(77)  评论:(0)  加入收藏
什么是布隆过滤器?如何实现布隆过滤器?
以下我们介绍了什么是布隆过滤器?它的使用场景和执行流程,以及在 Redis 中它的使用,那么问题来了,在日常开发中,也就是在 Java 开发中,我们又将如何操作布隆过滤器呢?布隆过滤器(Blo...【详细内容】
2024-01-05  Java中文社群  微信公众号  Tags:布隆过滤器   点击:(87)  评论:(0)  加入收藏
面向推荐系统的深度强化学习算法研究与应用
随着互联网的快速发展,推荐系统在各个领域中扮演着重要的角色。传统的推荐算法在面对大规模、复杂的数据时存在一定的局限性。为了解决这一问题,深度强化学习算法应运而生。本...【详细内容】
2024-01-04  数码小风向    Tags:算法   点击:(96)  评论:(0)  加入收藏
非负矩阵分解算法:从非负数据中提取主题、特征等信息
非负矩阵分解算法(Non-negativeMatrixFactorization,简称NMF)是一种常用的数据分析和特征提取方法,主要用于从非负数据中提取主题、特征等有意义的信息。本文将介绍非负矩阵分解...【详细内容】
2024-01-02  毛晓峰    Tags:算法   点击:(63)  评论:(0)  加入收藏
再谈前端算法,你这回明白了吗?
楔子 -- 青蛙跳台阶一只青蛙一次可以跳上一级台阶,也可以跳上二级台阶,求该青蛙跳上一个n级的台阶总共需要多少种跳法。分析: 当n=1的时候,①只需要跳一次即可;只有一种跳法,即f(...【详细内容】
2023-12-28  前端爱好者  微信公众号  Tags:前端算法   点击:(108)  评论:(0)  加入收藏
三分钟学习二分查找
二分查找是一种在有序数组中查找元素的算法,通过不断将搜索区域分成两半来实现。你可能在日常生活中已经不知不觉地使用了大脑里的二分查找。最常见的例子是在字典中查找一个...【详细内容】
2023-12-22  小技术君  微信公众号  Tags:二分查找   点击:(78)  评论:(0)  加入收藏
强化学习算法在资源调度与优化中的应用
随着云计算和大数据技术的快速发展,资源调度与优化成为了现代计算系统中的重要问题。传统的资源调度算法往往基于静态规则或启发式方法,无法适应动态变化的环境和复杂的任务需...【详细内容】
2023-12-14  职场小达人欢晓    Tags:算法   点击:(165)  评论:(0)  加入收藏
站内最新
站内热门
站内头条