如何使用Java加密技术?

如何使用Java加密技术?

在Java中,加密技术可以通过Java提供的加密API来实现。常见的加密方式有对称加密、非对称加密和哈希加密。下面是使用Java加密技术的完整使用攻略:

1. 对称加密

对称加密是指加密和解密都使用同一个密钥的加密方式。Java中常见的对称加密算法有DES、3DES、AES等,其中AES被广泛应用。下面是使用AES对称加密的示例代码:

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

public class AESUtil {

    private static final String KEY_ALGORITHM = "AES";
    private static final String CIPHER_ALGORITHM = "AES/ECB/PKCS5Padding";

    public static String encrypt(String data, String key) throws Exception {
        // 1. 生成密钥
        KeyGenerator keyGenerator = KeyGenerator.getInstance(KEY_ALGORITHM);
        keyGenerator.init(128);
        SecretKey secretKey = new SecretKeySpec(key.getBytes("UTF-8"), KEY_ALGORITHM);
        // 2. 加密
        Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
        cipher.init(Cipher.ENCRYPT_MODE, secretKey);
        byte[] encryptedData = cipher.doFinal(data.getBytes());
        return Base64.getEncoder().encodeToString(encryptedData);
    }

    public static String decrypt(String data, String key) throws Exception {
        // 1. 生成密钥
        KeyGenerator keyGenerator = KeyGenerator.getInstance(KEY_ALGORITHM);
        keyGenerator.init(128);
        SecretKey secretKey = new SecretKeySpec(key.getBytes("UTF-8"), KEY_ALGORITHM);
        // 2. 解密
        Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
        cipher.init(Cipher.DECRYPT_MODE, secretKey);
        byte[] decryptedData = cipher.doFinal(Base64.getDecoder().decode(data));
        return new String(decryptedData);
    }
}

使用示例:

public static void main(String[] args) throws Exception {
    String data = "Hello world!";
    String key = "1234567890abcdef";
    String encryptedData = AESUtil.encrypt(data, key);
    System.out.println("加密后的数据:" + encryptedData);
    String decryptedData = AESUtil.decrypt(encryptedData, key);
    System.out.println("解密后的数据:" + decryptedData);
}

2. 非对称加密

非对称加密是指加密和解密使用不同的密钥的加密方式。在Java中,常用的非对称加密算法有RSA和DSA。下面是使用RSA非对称加密的示例代码:

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

public class RSAUtil {

    private static final String KEY_ALGORITHM = "RSA";
    private static final String CIPHER_ALGORITHM = "RSA/ECB/PKCS1Padding";

    public static String encrypt(String data, String publicKey) throws Exception {
        // 1. 生成密钥对
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(KEY_ALGORITHM);
        keyPairGenerator.initialize(1024);
        KeyPair keyPair = keyPairGenerator.generateKeyPair();
        PublicKey _publicKey = keyPair.getPublic();
        PrivateKey _privateKey = keyPair.getPrivate();
        // 2. 加密
        Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
        cipher.init(Cipher.ENCRYPT_MODE, _publicKey);
        byte[] encryptedData = cipher.doFinal(data.getBytes());
        return Base64.getEncoder().encodeToString(encryptedData);
    }

    public static String decrypt(String data, String privateKey) throws Exception {
        // 1. 获取私钥
        PrivateKey _privateKey = RSAUtil.string2PrivateKey(privateKey);
        // 2. 解密
        Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
        cipher.init(Cipher.DECRYPT_MODE, _privateKey);
        byte[] decryptedData = cipher.doFinal(Base64.getDecoder().decode(data));
        return new String(decryptedData);
    }

    public static PrivateKey string2PrivateKey(String privateKeyStr) throws Exception {
        byte[] keyBytes = Base64.getDecoder().decode(privateKeyStr.getBytes());
        return KeyFactory.getInstance(KEY_ALGORITHM).generatePrivate(new PKCS8EncodedKeySpec(keyBytes));
    }
}

使用示例:

public static void main(String[] args) throws Exception {
    String data = "Hello world!";
    String publicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4eL56hTphG5sqZe9DXIx" +
            "vZmzdVXteoFXhuu6D1wOAHlq3OjO+lg23kQ7RFzj7cWzKXTcDCufzMBVf+JcdUEy" +
            "YQDLQZ7HlCEJHmK4RFc4A2X0BQAL6Fd1rKxXxcvJk5zJNzbh2rMN/aKf9u7CVy45" +
            "Vk6Sd82p1cK8muMrbLptBXAgjVQxI5pOQL0XrDQEZ52Rqd+LkJc1dpnA+PKLwsWI" +
            "wZgLzOMXTZbpF0mLxibcqsXT3Wdl9xat4vmhVzVy+dSkvfc3nhLR2ZC7euxxKtX9" +
            "VLX+5H86sTG8LVjVXEppKhR+JjL16JvCZkn+h2Z+Bq7ak4MbaBcwq5PxxKLOkzcX" +
            "YQIDAQAB";
    String privateKey = "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCWh+ra+ITvLSoE" +
            "8hRgUVpB6D9sqliL91dTdRgWFFvXy/JXFm4X7cE1yEz6K6rFLNQ/NhyF6vLkYwjf" +
            "ztzdIhZJA8t7QFjVzCpt/STbKzyrtCZWQC7vz0Adq7LgPlERQvD5szXHjH+4P+ud" +
            "9hSab2Ua5j8PT9cP33OqWZ3SIlh81ysB0PehdOQWBJz6Y9+Y4uIFDGzHQLqS4fEi" +
            "gEJkITHVAgWMbJ2mm6jLis8wKgd3VonC7C/i3eKnzXishZBaMlV+1vBUxbSQJzar" +
            "+ADiLWJ5dxg5pf8UZYCzS/KaAEwmXs2zjR5R5+tS3hovIZ7uB/DCnQMnS8r9f4C2" +
            "Y6hkabVrAgMBAAECggEASG4/x+hGi1S7r2W6tRVh43Zez2IJUbkk5xMWbJzDRX3j" +
            "AmxSzuKeFKFbGORgmt0a0v7sH7IB+LyFXdYktQwWe2/zDjS3oiCxNSqESXVZGgiO" +
            "5sB5xqhlVZMfGUrpoFADccBwWJ2FZC/gCo0wpXSvPEs7753eKjeDpx6ttviu/UZa" +
            "3KXzEVpvaPDouk9zjZyCjrZ6FbuIHmCdfDGuO6jtZyUOEMz+uPFg2idqZKt7ffYM" +
            "4+n8JY82vTca0WEqRCK4WOgIW2JJXvRm1QjAwHtlzJhuMBDTYCoLPse8FhqK2O+K" +
            "8M3cQH5DCG0D95ViphSGW3meTbXh80mYqluPfA7uwQKBgQD7VvHfMnjICflW/Dos" +
            "Odz5wTYnhAK0maUET9OM0EZP4zajdpyztPouhu8c7Ru2hEshm8i1eT2xrkiawbnV" +
            "7BUuxD8gA8X+5LpC6rX9Le7OHQ9YGUEp8TKqIpONRRe/wQoakrXgE+PuGvGHn0KJ" +
            "9AKmp7i3q3QoZAzzj8eRaTc4OQKBgQDCz9GaWTL+R8Yw2MeSfkWeKiW0L6+xMt+2" +
            "Vmgdh7f931mSThe5Owveqfon4Owkr8+e6gm9w3S6QlQm7VbbfS6quJKOcISQBrGG" +
            "a5f0zZh1wkXNZ2P0LIzR8xO8kJMuJr7t+uzrdbp4NVdZKPdRC7JV0J0AZUQEZx88" +
            "EBgyo2c36wKBgA9NBxK7Cm5kloT9eVnZxNBrP5Xt/HLF2vhyY3erfRmt+8pQj6K2" +
            "55Kv3TITouvlfPuIOAbp92k6cG/nKOFh/I1Pwo5q6HbSTXoyuOxWrk0XLZ6d01ZQ" +
            "K1RHKklXKwjYbp5kVpX2L6X/XtbkCfF/GIsVq2zzVXUHsA5CJmzjyC+1AoGBAN/q" +
            "sdqXeU3blb8Zf62Cov+mX8JosnXuk/q6WDCXnxzz5xrA6UBgt9BfOIgOs05lNHAc" +
            "RkYjkDpTa7NnNri1Mdwc3HvLPzfvgEgto7oAHRWgHx78zFK6ErM17PJoq8iGCN3f" +
            "u63R11kd9sLfesuygRb9UQ2w5qqAw0bO8ABGoS//AoGBAJy861WIpmtozA4fmAGw" +
            "BLa/1KtWqWYkT7r8DMHwYGhKuaL0O0hLz630rjTkPZuI4gWtK/V2iOdOolWvX9Jt" +
            "L+auk/TH1Ew4cHY5bWeZBKI3vFJxLAG+w8+la7r1y/Zlxrx+6Gwmo9OYb977V6sI" +
            "euU9/F3GKngW/urjLjhkkWm9";

    String encryptedData = RSAUtil.encrypt(data, publicKey);
    System.out.println("加密后的数据:" + encryptedData);
    String decryptedData = RSAUtil.decrypt(encryptedData, privateKey);
    System.out.println("解密后的数据:" + decryptedData);
}

3. 哈希加密

哈希加密是将任意长度的消息压缩成固定长度的摘要的加密方式。在Java中,常用的哈希算法有MD5和SHA系列算法。下面是使用MD5哈希加密的示例代码:

import java.security.MessageDigest;

public class MD5Util {

    public static String encrypt(String data) throws Exception {
        MessageDigest md5 = MessageDigest.getInstance("MD5");
        byte[] digest = md5.digest(data.getBytes());
        StringBuilder sb = new StringBuilder();
        for (byte b : digest) {
            sb.append(String.format("%02x", b & 0xff));
        }
        return sb.toString();
    }
}

使用示例:

public static void main(String[] args) throws Exception {
    String data = "Hello world!";
    String encryptedData = MD5Util.encrypt(data);
    System.out.println("加密后的数据:" + encryptedData);
}

以上是使用Java加密技术的完整使用攻略,其中包含了对称加密、非对称加密和哈希加密三种加密方式。通过这些示例代码,可以方便地在Java中实现数据加密和解密的功能。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:如何使用Java加密技术? - Python技术站

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

相关文章

  • Java Apache Commons报错“ConversionException”的原因与解决方法

    当使用Java的Apache Commons类库时,可能会遇到“ConfigurationException”错误。这个错误通常由以下原因之一起: 配置文件错误:如果配置文件错误,则可能会出现此错误。在这种情况下,需要检查配置文件以解决此问题。 配置项缺失:如果配置项缺失,则可能会出现此错误。在这种情况下,需要检查配置项以解决此问题。 以下是两个实例: 例1…

    Java 2023年5月5日
    00
  • JAVA多线程CountDownLatch使用详解

    JAVA多线程CountDownLatch使用详解 什么是CountDownLatch CountDownLatch是一种同步工具类,它可以让一个或多个线程等待其他线程完成操作后再执行。其主要方法是: public class CountDownLatch { public CountDownLatch(int count); public void awa…

    Java 2023年5月18日
    00
  • 别在Java代码里乱打日志了,这才是正确的打日志姿势

    这里是关于正确打印日志的攻略: 1. 什么是好的日志? 一个好的日志应该包含以下几个方面: 表现良好 日志输出应有较好的可读性; 日志输出要具有一定层次性; 日志输出要有一定格式化,比如在同一业务中输出的日志应当保持一致性。 提供足够的信息 日志应当详细描述应用发生了什么,以及发生原因; 一些需要排查的问题,还可以在日志中给出一些额外的信息或态度。 不只是输…

    Java 2023年5月25日
    00
  • Java for循环标签跳转到指定位置

    大家是否见过这种for循环,在for循环前加了个标记的: outerLoop: for (; ; ) { for (; ; ) { break outerLoop; } } 我之前有一次在公司业务代码中见过有这种写法的,没在意,今天在看JDK线程池的代码时,又看到ThreadPoolExecutor的addWorker方法中有这种写法。于是就查了相关资料,也…

    Java 2023年5月11日
    00
  • Java 14 发布了,你还会使用Lombok?

    Java 14 发布了,你还会使用Lombok? 1. Lombok 是什么? Lombok是一种Java库,可以自动插入编辑器和生成代码,减少Java开发中的冗余代码,使Java代码更加简洁。 2. Java 14 新特性 Java 14 主要带来了以下新特性: Records: 一种新的引用类型,旨在简化Java中的数据类设计。 Text Blocks:…

    Java 2023年5月26日
    00
  • 使用Sharding-JDBC对数据进行分片处理详解

    那么让我们来详细讲解如何使用Sharding-JDBC对数据进行分片处理。 什么是Sharding-JDBC Sharding-JDBC是一种基于JDBC的轻量级Java框架,用于将数据库水平分片。Sharding-JDBC通过拦截JDBC API调用来实现透明的数据分片,所以你可以使用任何基于JDBC的ORM框架(如Hibernate、MyBatis、JP…

    Java 2023年6月16日
    00
  • 用Java生成二维码并附带文字信息

    生成二维码并附带文字信息可以通过Java中的ZXing库来实现。下面是具体的步骤: 1. 引入ZXing库 首先需要引入ZXing库,在Maven项目中可以通过添加以下依赖来引入: <dependency> <groupId>com.google.zxing</groupId> <artifactId>core…

    Java 2023年5月20日
    00
  • 利用Maven添加工程版本信息及时间戳

    我很乐意为您提供“利用Maven添加工程版本信息及时间戳”的完整攻略。 1. 添加Maven插件到POM文件中 在POM文件中添加Maven插件来管理版本信息。首先,您需要打开POM文件,然后再<build>标签中添加以下代码片段: <plugins> <plugin> <groupId>org.apache.…

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