当前位置: 首页 > article >正文

java-加密算法

在这里插入图片描述

Java的加密算法

对称加密算法:AES(Advanced Encryption Standard)

定义
AES是一种广泛使用的对称加密算法,采用分组密码体制,每个分组数据的长度为128位(16个字节),密钥长度可以是128位、192位或256位。AES支持多种加密模式,常用的有ECB、CBC等模式。

特点

  • 对称加密,即加密和解密使用相同的密钥。
  • 速度快,适合大量数据的加密。
  • 安全性高,是目前最常用的对称加密算法之一。

Java实现示例

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

public class AESUtil {
    private static final String AES = "AES";

    public static byte[] encrypt(byte[] data, byte[] key) throws Exception {
        SecretKeySpec skeySpec = new SecretKeySpec(key, AES);
        Cipher cipher = Cipher.getInstance(AES);
        cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
        return cipher.doFinal(data);
    }

    public static byte[] decrypt(byte[] data, byte[] key) throws Exception {
        SecretKeySpec skeySpec = new SecretKeySpec(key, AES);
        Cipher cipher = Cipher.getInstance(AES);
        cipher.init(Cipher.DECRYPT_MODE, skeySpec);
        return cipher.doFinal(data);
    }

    public static void main(String[] args) throws Exception {
        KeyGenerator keyGen = KeyGenerator.getInstance(AES);
        keyGen.init(128); // 初始化密钥长度为128位
        SecretKey secretKey = keyGen.generateKey(); // 生成密钥
        byte[] key = secretKey.getEncoded(); // 获取密钥的字节数组
        String originalString = "Hello, World!"; // 原始字符串
        byte[] originalBytes = originalString.getBytes(); // 将字符串转换为字节数组
        byte[] encryptedBytes = encrypt(originalBytes, key); // 加密
        byte[] decryptedBytes = decrypt(encryptedBytes, key); // 解密
        System.out.println("原始字符串: " + originalString);
        System.out.println("加密后: " + new String(encryptedBytes));
        System.out.println("解密后: " + new String(decryptedBytes));
    }
}
非对称加密算法:RSA(Rivest–Shamir–Adleman)

定义
RSA是一种非对称加密算法,它依赖于大整数因数分解的难度。在RSA算法中,每个用户都有一对密钥:一个公钥用于加密数据,一个私钥用于解密数据。

特点

  • 加密和解密使用不同的密钥。
  • 安全性较高,但速度慢于对称加密算法。
  • 常用于加密小块数据,如密钥交换。

Java实现示例

import java.security.KeyPairGenerator;
import java.security.KeyPair;
import java.security.PrivateKey;
import java.security.PublicKey;
import javax.crypto.Cipher;

public class RSAUtil {
    private static final String ALGO = "RSA";

    public static void main(String[] args) {
        try {
            KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(ALGO);
            keyPairGen.initialize(1024, new SecureRandom());
            KeyPair keyPair = keyPairGen.generateKeyPair();
            PublicKey publicKey = keyPair.getPublic();
            PrivateKey privateKey = keyPair.getPrivate();

            String originalData = "Hello, World!";
            Cipher cipher = Cipher.getInstance(ALGO);
            cipher.init(Cipher.ENCRYPT_MODE, publicKey);
            byte[] encryptedData = cipher.doFinal(originalData.getBytes());
            cipher.init(Cipher.DECRYPT_MODE, privateKey);
            byte[] decryptedData = cipher.doFinal(encryptedData);

            System.out.println("Original: " + originalData);
            System.out.println("Encrypted: " + new String(encryptedData));
            System.out.println("Decrypted: " + new String(decryptedData));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
哈希算法:SHA(Secure Hash Algorithm)

定义
SHA是一系列密码散列函数,可以将任意长度的输入数据转换为固定长度的输出。SHA-1产生160位(20字节)的散列值,而SHA-2(包括SHA-224、SHA-256、SHA-384和SHA-512)提供更高的安全性。

特点

  • 单向性,不能从输出反推出输入数据。
  • 用于数据完整性校验和数字签名。

Java实现示例

import java.security.MessageDigest;

public class SHAUtil {
    public static String encode(String str) {
        try {
            MessageDigest md = MessageDigest.getInstance("SHA-256");
            md.update(str.getBytes("utf-8"));
            byte[] digest = md.digest();
            return byteToHexString(digest);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    public static String byteToHexString(byte[] bytes) {
        StringBuilder sb = new StringBuilder();
        for (byte b : bytes) {
            sb.append(String.format("%02x", b));
        }
        return sb.toString();
    }

    public static void main(String[] args) {
        String content = "Hello, World!";
        System.out.println(SHAUtil.encode(content));
    }
}

http://www.kler.cn/a/409640.html

相关文章:

  • JavaScript中的this指向绑定规则(超全)
  • [ubuntu]编译共享内存读取出现read.c:(.text+0x1a): undefined reference to `shm_open‘问题解决方案
  • c++视频图像处理
  • 文小言1:
  • CentOS7(Linux)详细安装教程(图文详解)
  • C语言蓝桥杯组题目
  • 掌握 Vue key:剖析其原理及与无 key 的区别
  • 【Hive是什么?】Hadoop和Hive是什么关系?Hive在Hadoop上是怎么运行的?用大白话理解Hive和Hadoop的关系。
  • 亚马逊IP关联是什么?我们该怎么解决呢?
  • 【Leetcode Top 100】240. 搜索二维矩阵 II
  • 电脑无故提示提示“MSVCP140.dIl”文件丢失的原因以及六大解决方法!
  • Python入门(13)--并发编程
  • 银行卡OCR 识别 API 接口的影响因素分析
  • C++ —— 以真我之名 如飞花般绚丽 - 智能指针
  • python继承和反射
  • 今天你学C++了吗?——C++中的类与对象(第二集)
  • w~视觉~3D~合集3
  • 1、数据结构概述及顺序表(附:可以直接打印显示的源码)
  • 网络协议之UDP
  • 【Andriod ADB基本命令总结】
  • 【AI系统】谷歌 TPU v1-脉动阵列
  • npm命令报错
  • 【Java 学习】构造器、static静态变量、static静态方法、static构造器、
  • R语言处理JSON文件
  • 解决登录Google账号遇到手机上Google账号无法验证的问题
  • 一个高度可扩展的 Golang ORM 库【GORM】