Java对字符串进行加密解密

Java 对字符串进行加密解密攻略

简介

Java 中提供了多种加密解密的方案,涉及对称加密、非对称加密、哈希算法等等。本文将主要讲解在 Java 中对字符串进行加密解密的方法。

对称加密

对称加密是指加密和解密使用同一个密钥的方式,常见的有 AES、DES 等算法。

AES 加密

在 Java 中使用 AES 进行加密解密的主要步骤如下:

  1. 生成一个 AES 密钥,使用 SecretKeySpec 构造器指定密钥长度和加密算法类型。
  2. 获取一个 Cipher 对象,并指定加密模式、填充方式以及密钥。
  3. 调用 Cipher 对象的 encrypt/decrypt 方法,传入要加密/解密的数据,即可得到加密/解密后的数据。

下面是一个简单的 AES 加密示例:

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;

public class AESEncryptor {

    private static final String TRANSFORMATION = "AES/ECB/PKCS5Padding";
    private static final String CHARSET_NAME = "UTF-8";

    private SecretKeySpec key;

    public AESEncryptor(String secretKey) {
        key = new SecretKeySpec(secretKey.getBytes(), "AES");
    }

    public String encrypt(String data) throws Exception {
        Cipher cipher = Cipher.getInstance(TRANSFORMATION);
        cipher.init(Cipher.ENCRYPT_MODE, key);
        byte[] encryptedData = cipher.doFinal(data.getBytes(CHARSET_NAME));
        return Base64.getEncoder().encodeToString(encryptedData);
    }

    public String decrypt(String encryptedData) throws Exception {
        Cipher cipher = Cipher.getInstance(TRANSFORMATION);
        cipher.init(Cipher.DECRYPT_MODE, key);
        byte[] decryptedData = cipher.doFinal(Base64.getDecoder().decode(encryptedData));
        return new String(decryptedData, CHARSET_NAME);
    }
}

DES 加密

在 Java 中使用 DES 进行加密解密的主要步骤如下:

  1. 生成一个 DES 密钥,使用 SecretKeySpec 构造器指定密钥长度和加密算法类型。
  2. 获取一个 Cipher 对象,并指定加密模式、填充方式以及密钥。
  3. 调用 Cipher 对象的 encrypt/decrypt 方法,传入要加密/解密的数据,即可得到加密/解密后的数据。

下面是一个简单的 DES 加密示例:

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;

public class DESEncryptor {

    private static final String TRANSFORMATION = "DES/ECB/PKCS5Padding";
    private static final String CHARSET_NAME = "UTF-8";

    private SecretKeySpec key;

    public DESEncryptor(String secretKey) {
        key = new SecretKeySpec(secretKey.getBytes(), "DES");
    }

    public String encrypt(String data) throws Exception {
        Cipher cipher = Cipher.getInstance(TRANSFORMATION);
        cipher.init(Cipher.ENCRYPT_MODE, key);
        byte[] encryptedData = cipher.doFinal(data.getBytes(CHARSET_NAME));
        return Base64.getEncoder().encodeToString(encryptedData);
    }

    public String decrypt(String encryptedData) throws Exception {
        Cipher cipher = Cipher.getInstance(TRANSFORMATION);
        cipher.init(Cipher.DECRYPT_MODE, key);
        byte[] decryptedData = cipher.doFinal(Base64.getDecoder().decode(encryptedData));
        return new String(decryptedData, CHARSET_NAME);
    }
}

非对称加密

非对称加密是指加密和解密使用不同密钥的方式,常见的有 RSA 等算法。

RSA 加密

在 Java 中使用 RSA 进行加密解密的主要步骤如下:

  1. 生成一个 RSA 密钥对。
  2. 获取一个 Cipher 对象,并指定加密模式、填充方式以及密钥对。
  3. 调用 Cipher 对象的 encrypt/decrypt 方法,传入要加密/解密的数据,即可得到加密/解密后的数据。

下面是一个简单的 RSA 加密示例:

import javax.crypto.Cipher;
import java.nio.charset.StandardCharsets;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.util.Base64;

public class RSAEncryptor {

    private static final String ALGORITHM = "RSA";
    private static final String TRANSFORMATION = "RSA/ECB/PKCS1Padding";
    private static final String CHARSET_NAME = "UTF-8";

    private KeyPair keyPair;

    public RSAEncryptor() throws Exception {
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(ALGORITHM);
        keyPairGenerator.initialize(1024);
        keyPair = keyPairGenerator.generateKeyPair();
    }

    public String encrypt(String data) throws Exception {
        Cipher cipher = Cipher.getInstance(TRANSFORMATION);
        cipher.init(Cipher.ENCRYPT_MODE, keyPair.getPublic());
        byte[] encryptedData = cipher.doFinal(data.getBytes(StandardCharsets.UTF_8));
        return Base64.getEncoder().encodeToString(encryptedData);
    }

    public String decrypt(String encryptedData) throws Exception {
        Cipher cipher = Cipher.getInstance(TRANSFORMATION);
        cipher.init(Cipher.DECRYPT_MODE, keyPair.getPrivate());
        byte[] decryptedData = cipher.doFinal(Base64.getDecoder().decode(encryptedData));
        return new String(decryptedData, StandardCharsets.UTF_8);
    }
}

哈希算法

哈希算法是指根据明文生成一个唯一的密文,一般来说不能通过密文反推出明文。常见的哈希算法有 MD5、SHA 等。

MD5 哈希

在 Java 中使用 MD5 进行哈希的方法如下:

import java.math.BigInteger;
import java.security.MessageDigest;

public class MD5Hash {

    public static String hash(String data) throws Exception {
        MessageDigest messageDigest = MessageDigest.getInstance("MD5");
        messageDigest.update(data.getBytes());
        byte[] hashedData = messageDigest.digest();
        return String.format("%032x", new BigInteger(1, hashedData));
    }
}

SHA 哈希

在 Java 中使用 SHA 进行哈希的方法如下:

import java.math.BigInteger;
import java.security.MessageDigest;

public class SHAHash {

    public static String hash(String data) throws Exception {
        MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");
        messageDigest.update(data.getBytes());
        byte[] hashedData = messageDigest.digest();
        return String.format("%064x", new BigInteger(1, hashedData));
    }
}

示例说明

示例一:使用 AES 加密解密字符串

try {
    String secretKey = "abcdefghijklmnop";
    String data = "hello, world";
    AESEncryptor encryptor = new AESEncryptor(secretKey);
    String encryptedData = encryptor.encrypt(data);
    System.out.println("Encrypted data: " + encryptedData);
    String decryptedData = encryptor.decrypt(encryptedData);
    System.out.println("Decrypted data: " + decryptedData);
} catch (Exception e) {
    e.printStackTrace();
}

输出结果:

Encrypted data: gvRue/ouZLbzCphZpdU4OQ==
Decrypted data: hello, world

示例二:使用 SHA 对字符串进行哈希

try {
    String data = "hello, world";
    String hashedData = SHAHash.hash(data);
    System.out.println("Hashed data: " + hashedData);
} catch (Exception e) {
    e.printStackTrace();
}

输出结果:

Hashed data: b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java对字符串进行加密解密 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • jquery动态改变form属性提交表单

    如果你想通过jQuery来动态地改变表单(form)的属性和值,这里提供一些可以参考的方法和示例。 改变表单属性 可以使用attr()函数来改变表单属性。 $("form").attr("action", "new_action_url"); 这个方法将表单的action属性更改为new_actio…

    Java 2023年6月15日
    00
  • SpringMVC互联网软件架构REST使用详解

    下面是关于SpringMVC互联网软件架构REST使用的完整攻略,包含两个示例说明。 SpringMVC互联网软件架构REST使用详解 REST(Representational State Transfer)是一种基于HTTP协议的Web服务架构风格,它可以帮助我们构建可扩展、灵活和易于维护的Web服务。在本文中,我们将介绍如何在SpringMVC中使用R…

    Java 2023年5月17日
    00
  • 用JAVA实现杨辉三角实例

    首先我们来详细讲解用JAVA实现杨辉三角的完整攻略,步骤如下: 1. 确定问题及解题思路 杨辉三角是一个数字三角形,它的每一行都是由前一行相邻两个元素相加而成。第一行只有一个数字1,接下来的每一行数字都是通过计算上一行相邻两个数字之和得到的。比如,第三行的数字是1 2 1,其中2=1+1。 我们可以通过二维数组来存储杨辉三角,并使用循环迭代计算每一行的数据。…

    Java 2023年5月19日
    00
  • Java练手项目(尚硅谷的),不涉及框架,数据库等。

    软件:idea我是先建立了一个空白的项目,自己创建的src包和其下面的包。问题一:建立包之后发现格式为src.com.tjp.bean 没办法建立其他与bean同级的service test utils view 等。只允许继续建立bean的子包。解决: 这是因为idea自动会折叠空白包。(不同版本的idea可能和我的位置不太一样,但是都在那个齿轮里,第一步…

    Java 2023年5月4日
    00
  • java实现选课系统

    Java实现选课系统攻略 系统需求 选课系统是一个常见的教育管理应用,主要用于实现学生、课程、教师的信息管理以及选课和退课功能的实现。 在实现选课系统时,需要满足以下系统需求: 学生信息管理 学生信息包括学生姓名、学号、所选课程等; 学生可以根据自己的需求进行选课和退课操作; 学生可以查询已选课程和剩余可选课程。 课程信息管理 课程信息包括课程名称、课程编号…

    Java 2023年5月30日
    00
  • 详解Java的回调机制

    详解Java的回调机制 什么是回调机制? 回调(Callback)指的是程序员在编写程序时,将一个函数作为参数传递到另一个函数中,并在另一个函数中调用这个函数的行为。具体来说,会有一个方法 A,在执行某个动作时,会调用另一个方法 B,方法 B 中的代码会在方法 A 完成时被调用,这样的方法调用方式被称为回调。 为什么需要回调机制? 在Java开发中,我们常常…

    Java 2023年5月26日
    00
  • Spring配置多数据源切换

    下面我将详细讲解Spring配置多数据源切换的完整攻略。处理多数据源切换的核心是通过动态切换数据源来实现。实现这一点的最简单、最常用的方法是使用AOP切面,这也是本文的重点。 1. 添加依赖 以下是maven引用多数据源相关依赖的代码: <dependency> <groupId>org.springframework.boot&lt…

    Java 2023年5月20日
    00
  • 详解使用Spring Data repository进行数据层的访问问题

    使用Spring Data Repository进行数据层的访问是一种非常高效、便捷的方式。在使用之前,我们需要先了解一些Spring Data Repository的基本概念和使用方法。 Spring Data Repository基本概念 Spring Data Repository本质上是一个通用的DAO(Data Access Object)接口,它…

    Java 2023年6月2日
    00
合作推广
合作推广
分享本页
返回顶部