Cipher简介说明

欣喜 Java经验 发布时间:2025-03-21 16:17:38 阅读数:2872 1
下文笔者讲述"Cipher简介"说明,如下所示

Cipher简介

`Cipher`是Java中加密架构(Java Cryptography Architecture, JCA)中一个核心类,
     其功能:用于加密和解密数据 
`Cipher`类
    提供多种加密算法和模式支持,
使得开发者可以方便地实现数据的安全传输和存储

`Cipher`类详细介绍

`Cipher`类位于`javax.crypto` 包中
 可提供以下功能:
	-加密:将明文数据转换为密文数据。
	-解密:将密文数据转换为明文数据。
	-多种算法:支持多种加密算法
	    如 AES、DES、RSA 等。
	-多种模式:支持多种加密模式
	    如 ECB、CBC、GCM 等。
	-填充方式:支持多种填充方式
	    如 PKCS5Padding、PKCS7Padding 等。

`Cipher`类中主要方法

 
-`getInstance(String transformation)`:
  - 获取 `Cipher` 实例,指定加密算法、模式和填充方式。
  - 例如:`Cipher.getInstance("AES/CBC/PKCS5Padding")`。

-`init(int opmode, Key key)`:
  - 初始化 `Cipher` 实例,指定操作模式(加密或解密)和密钥。
  - 例如:`cipher.init(Cipher.ENCRYPT_MODE, secretKey)`。

-`init(int opmode, Key key, AlgorithmParameterSpec params)`:
  - 初始化 `Cipher` 实例,指定操作模式、密钥和算法参数。
  - 例如:`cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivSpec)`。

-`update(byte[] input)`:
  - 对输入数据进行部分加密或解密操作。
  - 适用于大数据量的加密和解密。

-`doFinal(byte[] input)`:
  - 对输入数据进行最终的加密或解密操作。
  - 适用于小数据量的加密和解密。

-`doFinal(byte[] input, int inputOffset, int inputLen)`:
  - 对输入数据的一部分进行最终的加密或解密操作。

Cipher加密模式

`Cipher` 类支持多种加密模式,常见的模式包括:

-ECB (Electronic Codebook):
  - 每个数据块独立加密。
  - 不需要初始化向量(IV)。
  - 不适合加密大数据量,容易被攻击。

-CBC (Cipher Block Chaining):
  - 每个数据块与前一个数据块的加密结果进行异或后再加密。
  - 需要初始化向量(IV)。
  - 更安全,适合加密大数据量。

- GCM (Galois/Counter Mode):
  - 结合了 CBC 和 CTR 模式的优点。
  - 提供了认证加密功能。
  - 需要初始化向量(IV)和认证标签(Authentication Tag)。

填充方式

填充方式用于确保数据块的长度符合加密算法的要求。常见的填充方式包括:

-NoPadding:
  - 不进行填充。
  - 数据长度必须是加密算法块大小的整数倍。

-PKCS5Padding:
  - 使用 PKCS#5 标准进行填充。
  - 填充字节的值等于填充字节数。

-PKCS7Padding:
  - 使用 PKCS#7 标准进行填充。
  - 类似于 PKCS5Padding,但支持更大的块大小。
使用`Cipher`类
进行 AES 加密和解密

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

public class CipherExample {

    private static final String ALGORITHM = "AES";
    private static final String TRANSFORMATION = "AES/CBC/PKCS5Padding";

    public static void main(String[] args) {
        try {
            // 生成密钥
            SecretKey secretKey = generateKey(128);

            // 生成初始化向量 (IV)
            byte[] iv = new byte[16]; // AES 块大小为 16 字节
            IvParameterSpec ivSpec = new IvParameterSpec(iv);

            // 明文数据
            String plainText = "Hello, World!";
            System.out.println("Original Text: " + plainText);

            // 加密
            String encryptedText = encrypt(plainText, secretKey, ivSpec);
            System.out.println("Encrypted Text: " + encryptedText);

            // 解密
            String decryptedText = decrypt(encryptedText, secretKey, ivSpec);
            System.out.println("Decrypted Text: " + decryptedText);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // 生成密钥
    public static SecretKey generateKey(int n) throws Exception {
        KeyGenerator keyGenerator = KeyGenerator.getInstance(ALGORITHM);
        keyGenerator.init(n);
        return keyGenerator.generateKey();
    }

    // 加密
    public static String encrypt(String plainText, SecretKey secretKey, IvParameterSpec ivSpec) throws Exception {
        Cipher cipher = Cipher.getInstance(TRANSFORMATION);
        cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivSpec);
        byte[] encryptedBytes = cipher.doFinal(plainText.getBytes());
        return Base64.getEncoder().encodeToString(encryptedBytes);
    }

    // 解密
    public static String decrypt(String encryptedText, SecretKey secretKey, IvParameterSpec ivSpec) throws Exception {
        Cipher cipher = Cipher.getInstance(TRANSFORMATION);
        cipher.init(Cipher.DECRYPT_MODE, secretKey, ivSpec);
        byte[] decodedBytes = Base64.getDecoder().decode(encryptedText);
        byte[] decryptedBytes = cipher.doFinal(decodedBytes);
        return new String(decryptedBytes);
    }
}

代码说明

1.生成密钥
public static SecretKey generateKey(int n) throws Exception {
	KeyGenerator keyGenerator = KeyGenerator.getInstance(ALGORITHM);
	keyGenerator.init(n);
	return keyGenerator.generateKey();
}
- KeyGenerator:用于生成密钥。
-init(n):
  初始化密钥生成器,
   指定密钥长度(128、192、256 位)

2.生成初始化向量 (IV)
byte[] iv = new byte[16]; // AES 块大小为 16 字节
IvParameterSpec ivSpec = new IvParameterSpec(iv);
-IV:
  初始化向量,用于 CBC 模式。
-IvParameterSpec:
   用于指定 IV。

3.加密
public static String encrypt(String plainText, SecretKey secretKey, IvParameterSpec ivSpec) throws Exception {
	Cipher cipher = Cipher.getInstance(TRANSFORMATION);
	cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivSpec);
	byte[] encryptedBytes = cipher.doFinal(plainText.getBytes());
	return Base64.getEncoder().encodeToString(encryptedBytes);
}
-Cipher.getInstance(TRANSFORMATION):
   获取 `Cipher` 实例,指定加密算法、模式和填充方式。
-cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivSpec):
  初始化 `Cipher` 实例为加密模式。
-cipher.doFinal(plainText.getBytes()):
  执行加密操作。
-Base64 编码:
   将加密后的字节数组编码为字符串,便于存储和传输。

4.解密
public static String decrypt(String encryptedText, SecretKey secretKey, IvParameterSpec ivSpec) throws Exception {
	Cipher cipher = Cipher.getInstance(TRANSFORMATION);
	cipher.init(Cipher.DECRYPT_MODE, secretKey, ivSpec);
	byte[] decodedBytes = Base64.getDecoder().decode(encryptedText);
	byte[] decryptedBytes = cipher.doFinal(decodedBytes);
	return new String(decryptedBytes);
}
-Cipher.getInstance(TRANSFORMATION):获取 `Cipher` 实例,指定加密算法、模式和填充方式。
-cipher.init(Cipher.DECRYPT_MODE, secretKey, ivSpec):初始化 `Cipher` 实例为解密模式。
-Base64 解码:将编码后的字符串解码为字节数组。
-cipher.doFinal(decodedBytes):执行解密操作。
运行以上代码,将输出以下信息
Original Text: Hello, World!
Encrypted Text: **********
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaJingYan/202503/17425450898390.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者