调库实现简单的AES,ECC,SHA-256,支持文本(txt)、图片(png)、音频(mp4)

一、设计要求

在设计和实现系统时,选择调用了以下密码库:

  1. Bouncy Castle (BC): 用于实现椭圆曲线密码学(ECC)算法,确保系统安全传输密钥的过程。
  2. Java Cryptography Architecture (JCA): 用于实现对称加密算法(如AES)和SHA-256哈希算法等,提供主流密码学算法的支持。

支持的数据类型

系统支持以下文件类型的加密和解密:

  1. 文本文件(.txt): 对文本内容进行加密和解密,保护敏感信息的安全。
  2. 图片文件(.png): 采用对称加密算法对图像数据进行加密,确保图像隐私不被泄露。
  3. 音频文件(.mp4): 对音频数据进行保护,通过密码学算法确保音频文件的机密性。

系统的概述

系统旨在提供一个灵活且安全的文件处理平台,支持多种数据类型的加密和解密。用户可以选择不同的文件类型,并根据其需求选择合适的加密算法。系统通过调用主流密码库中的算法来实现数据的高强度加密,同时保证了系统的可靠性和安全性。整体设计注重用户友好性和系统的可扩展性,使其适用于各种安全文件处理需求。

二、开发环境与工具

  1. 集成开发环境 (IDE):

IntelliJ IDEA 2023.2.3

  1. Java 开发工具包 (JDK):

JDK 17

  1. 密码库:
  1. Bouncy Castle (BC): 用于椭圆曲线密码学(ECC)算法的实现。
  2. Java Cryptography Architecture (JCA): 用于对称加密算法(如AES)和SHA-256哈希算法等的实现。
  1. 操作系统

Windows

  1. 处理器和内存:
  1. 处理器: 11th Gen Intel(R) Core(TM) i7-1165G7 @ 2.80GHz, 2.80 GHz
  2. 内存: 16.0 GB (15.8 GB 可用)

三、设计原理

  1. AES(高级加密标准)基本结构和原理
  1. 基本概述

AES是一种对称密钥加密算法,用于保护电子数据。它是目前广泛使用的加密算法之一,设计目标是在各种设备上实现高效的加密和解密操作。

  1. 密钥长度与加密轮数

AES支持三种密钥长度:128比特、192比特和256比特。根据密钥长度不同,加密轮数也有所不同,分别是10轮、12轮和14轮。

  1. 分组结构

AES采用固定的128比特(16字节)分组长度。加密和解密的基本单位是字节,状态矩阵由4x4字节构成。

  1. 加密过程
  1. 密钥扩展(Key Expansion): 将初始密钥扩展为轮密钥数组,用于后续的轮密钥加。
  2. 初始轮密钥加(Initial Round Key Addition): 将初始轮密钥与输入明文进行逐比特异或操作。
  3. 多轮加密(Rounds): 连续进行多轮加密操作,每轮包括四个步骤:
  4. 字节代换(SubBytes):使用S盒进行字节替代。
  5. 行位移(ShiftRows):对状态矩阵的行进行循环左移操作。
  6. 列混淆(MixColumns):对状态矩阵的列进行混淆。
  7. 轮密钥加(Round Key Addition):将轮密钥与状态矩阵进行逐比特异或操作。
  8. 最终轮加密(Final Round): 不包括列混淆步骤。
  9. 输出密文: 最终状态矩阵即为加密结果。

图1 AES加密过程

  1. 解密过程

AES解密过程与加密过程类似,但步骤的执行顺序相反,包括:

  1. 密钥扩展(Key Expansion): 生成解密所需的轮密钥数组。
  2. 初始轮密钥加(Initial Round Key Addition): 将初始轮密钥与输入密文进行逐比特异或操作。
  3. 多轮解密(Rounds): 连续进行多轮解密操作,每轮包括四个逆操作:
  4. 逆字节代换(InvSubBytes):使用逆S盒进行字节替代。
  5. 逆行位移(InvShiftRows):对状态矩阵的行进行循环右移操作。
  6. 逆列混淆(InvMixColumns):对状态矩阵的列进行逆混淆。
  7. 轮密钥加(Round Key Addition):将轮密钥与状态矩阵进行逐比特异或操作。
  8. 最终轮解密(Final Round): 不包括逆列混淆步骤。
  9. 输出明文: 最终状态矩阵即为解密结果。

图2 AES解密过程

  • 系统功能描述及软件模块划分
  1. 系统功能描述

  1. AES加密和解密功能

用户可以选择文件类型(文本、图片、视频)。

通过AES算法对选定类型的文件进行加密。

将加密后的数据保存到文件中。

对加密后的数据进行AES解密。

将解密后的数据保存到文件中。

  1. ECC加密和解密功能

用户可以选择文件类型(文本、图片、视频)。

通过椭圆曲线加密(ECC)算法对选定类型的文件进行加密。

将加密后的数据保存到文件中。

对加密后的数据进行椭圆曲线解密。

将解密后的数据保存到文件中。

  1. SHA-256哈希计算功能

用户可以选择文件类型(文本、图片、视频)。

计算选定类型文件的SHA-256哈希值。

打印并显示文件的SHA-256哈希值。

  1. 软件模块划分
  1. AES 模块

AES 类:封装AES算法的加密和解密功能。

generateAESKey 方法:生成AES密钥。

encryptAES 方法:使用AES加密数据。

decryptAES 方法:使用AES解密数据。

  1. ECC 模块

ECC 类:封装椭圆曲线加密(ECC)算法的加密和解密功能。

generateECKeyPair 方法:生成ECC密钥对。

encrypt 方法:使用ECC公钥加密数据。

decrypt 方法:使用ECC私钥解密数据。

  1. SHA-256 模块

SHA256 类:封装SHA-256哈希算法的计算功能。

calculateFileSHA256 方法:计算文件的SHA-256哈希值。

  1. 文件操作模块

getUserFileType 方法:获取用户选择的文件类型。

getFileExtension 方法:根据用户选择的文件类型返回文件扩展名。

getFilePath 方法:根据用户选择的文件类型返回文件路径。

readFileToByteArray 方法:将文件内容读取为字节数组。

writeByteArrayToFile 方法:将字节数组写入文件。

  • 设计步骤

1. AES 模块

1.1. 生成AES密钥

在AES模块中,首先实现了生成AES密钥的功能。密钥生成使用Java的KeyGenerator类,选择AES算法,并指定密钥长度为128位。生成的密钥作为系统的对称加密算法所需的关键参数。

核心代码:

private static SecretKey generateAESKey() throws Exception {
    KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
    keyGenerator.init(128); // 使用128位密钥
    return keyGenerator.generateKey();
}

1.2. AES加密

AES加密功能使用Java的Cipher类,选择AES算法,使用密钥对明文进行加密。在加密过程中,调用Cipher.ENCRYPT_MODE表示加密操作。

核心代码:

private static byte[] encryptAES(byte[] data, SecretKey secretKey) throws Exception {
    Cipher cipher = Cipher.getInstance("AES");
    cipher.init(Cipher.ENCRYPT_MODE, secretKey);
    return cipher.doFinal(data);
}

1.3. AES解密

AES解密功能同样使用Java的Cipher类,选择AES算法,使用密钥对密文进行解密。在解密过程中,调用Cipher.DECRYPT_MODE表示解密操作。

核心代码:

private static byte[] decryptAES(byte[] encryptedData, SecretKey secretKey) throws Exception {
    Cipher cipher = Cipher.getInstance("AES");
    cipher.init(Cipher.DECRYPT_MODE, secretKey);
    return cipher.doFinal(encryptedData);
}

图3 AES流程图

2. ECC 模块

2.1. 生成ECC密钥对

在ECC模块中,实现了生成ECC密钥对的功能。使用了Bouncy Castle库提供的椭圆曲线参数和密钥对生成方法。

核心代码:

private static KeyPair generateECKeyPair() throws Exception {
    ECParameterSpec ecSpec = ECNamedCurveTable.getParameterSpec("secp256r1");
    KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("EC", "BC");
    keyPairGenerator.initialize(ecSpec, new SecureRandom());
    return keyPairGenerator.generateKeyPair();
}

2.2. ECC加密

ECC加密功能使用Java的Cipher类,选择ECIES算法,使用公钥对明文进行加密。

核心代码:

private static byte[] encrypt(byte[] data, PublicKey publicKey) throws Exception {
    Cipher cipher = Cipher.getInstance("ECIES", "BC");
    cipher.init(Cipher.ENCRYPT_MODE, publicKey);
    return cipher.doFinal(data);
}

2.3. ECC解密

ECC解密功能同样使用Java的Cipher类,选择ECIES算法,使用私钥对密文进行解密。

核心代码:

private static byte[] decrypt(byte[] encryptedBytes, PrivateKey privateKey) throws Exception {
    Cipher cipher = Cipher.getInstance("ECIES", "BC");
    cipher.init(Cipher.DECRYPT_MODE, privateKey);
    return cipher.doFinal(encryptedBytes);
}

图4 ECC流程图

3. SHA-256 模块

3.1. 计算文件的SHA-256哈希值

SHA-256模块实现了计算文件的SHA-256哈希值的功能。使用Java的MessageDigest类,选择SHA-256算法,读取文件内容并进行哈希计算。

核心代码:

private static String calculateFileSHA256(String filePath) throws IOException, NoSuchAlgorithmException {
    MessageDigest digest = MessageDigest.getInstance("SHA-256");

    try (InputStream inputStream = new FileInputStream(filePath)) {
        byte[] buffer = new byte[8192];
        int bytesRead;

        while ((bytesRead = inputStream.read(buffer)) != -1) {
            digest.update(buffer, 0, bytesRead);
        }
    }

    byte[] hashBytes = digest.digest();

    // 转换为十六进制表示
    StringBuilder hexString = new StringBuilder();
    for (byte hashByte : hashBytes) {
        String hex = Integer.toHexString(0xff & hashByte);
        if (hex.length() == 1) hexString.append('0');
        hexString.append(hex);
    }

    return hexString.toString();
}

4. 文件操作模块

4.1. 获取用户选择的文件类型

文件操作模块中,包含了一个公用的方法用于获取用户选择的文件类型。

核心代码:

public static int getUserFileType() {
    System.out.println("请选择文件类型:");
    System.out.println("1. 文本模式 —— txt 格式");
    System.out.println("2. 图片模式 —— png 格式");
    System.out.println("3. 视频模式 —— mp4 格式");

    Scanner scanner = new Scanner(System.in);
    return scanner.nextInt();
}

4.2. 获取文件扩展名

同样,包含一个方法用于根据用户选择的文件类型返回文件扩展名。

核心代码:

public static String getFileExtension(int fileType) {
    switch (fileType) {
        case 1:
            return ".txt";
        case 2:
            return ".png";
        case 3:
            return ".mp4";
        default:
            return ".dat"; // 默认使用.dat扩展名
    }
}

4.3. 获取文件路径

文件操作模块中还包含一个方法,根据用户选择的文件类型返回文件路径。

核心代码:

public static String getFilePath(int fileType) {
    String fileName = "file";

    switch (fileType) {
        case 1:
            return fileName + ".txt";
        case 2:
            return fileName + ".png";
        case 3:
            return fileName + ".mp4";
        default:
            return fileName + ".dat"; // 默认使用.dat扩展名
    }
}
  • 关键问题及其解决方法

1. 如何生成并管理密钥?

问题: 对称加密(AES)和非对称加密(ECC)都需要生成和管理密钥。

解决方法:

  1. 对于 AES,使用 KeyGenerator 生成密钥。
  2. 对于 ECC,使用 KeyPairGenerator 生成密钥对。

2. 如何选择和处理不同文件类型?

问题:

不同文件类型可能需要不同的处理方式,例如文本文件、图像文件、视频文件等。

解决方法:

  1. 用户选择文件类型,根据类型确定加密/解密的方式和文件扩展名。
  2. 使用文件扩展名进行文件读取和写入。

3. 如何处理加密和解密的流程?

问题: 加密和解密需要按照特定的算法和流程执行。

解决方法:

  1. 设计模块化的函数,例如 encryptAES、decryptAES、encryptECC、decryptECC 等,分别处理不同的加密和解密逻辑。
  2. 采用异常处理机制处理可能的加密和解密异常。

4. 如何处理文件读写操作?

问题: 文件读写是加密和解密过程中的核心操作,需要高效而安全的处理。

解决方法:

  1. 使用 FileInputStream 和 FileOutputStream 以字节形式读写文件。
  2. 利用 Java NIO 提供的 Files 类简化文件读写操作。

5. 如何保证安全性?

问题: 加密系统需要保证密钥的安全,防止被恶意获取。

解决方法:

  1. 选择强固的加密算法(如AES、ECC)。
  2. 使用安全的密钥存储和管理机制。
  3. 避免硬编码密钥,考虑使用密钥管理服务。

6. 如何进行异常处理?

问题: 在文件读写、加密解密等过程中可能发生异常,需要合理处理以保证系统稳定性。

解决方法:

  1. 使用 try-catch 块捕获可能的异常。
  2. 提供详细的异常信息,方便排查问题。

7. 如何进行用户交互?

问题: 用户需要能够选择文件类型和了解操作进展。

解决方法:

  1. 使用 Scanner 类实现简单的命令行用户交互。
  2. 在关键步骤输出信息,让用户了解当前进程。
  • 设计结果

系统完成的功能

  1. AES 加密与解密: 实现了对文本、图片、音频等不同类型文件的加密和解密功能,采用了安全可靠的 AES 加密算法。
  1. 文本(.txt)加解密:
  • 用户选择文本类型(输入1):

图5 用户选择与运行结果

  • 加解密结果:

图6 待加密文本

图7 已加密文本

图8 解密后文本

2.图像(.png)加解密:(注:这里使用图像与上传资源不一样)

用户选择文本类型(输入2):

图9 用户选择与运行结果

  • 加解密结果:

图10 待加密图像

图11 已加密图像

图12 解密后图像

3.视频(.mp4)加解密:

  • 用户选择文本类型(输入3):

图13 用户选择与运行结果

  • 加解密结果:

图14 待加密视频

图15 已加密视频

图16 解密后视频

ECC 加密与解密: 实现了对不同类型文件的加密和解密功能,采用了椭圆曲线加密算法(ECC)。

  1. 文本(.txt)加解密:
  • 用户选择文本类型(输入1):

图17 用户选择与运行结果

  • 加解密结果:
  • 图18 已加密文本

  • 图19 解密后文本

图像(.png)加解密:

用户选择文本类型(输入2):

图20 用户选择与运行结果

加解密结果:

图21 已加密图像

图22 解密后图像

视频(.mp4)加解密:

用户选择文本类型(输入3):

图23 用户选择与运行结果

加解密结果:

图24 已加密视频

图25 解密后视频

SHA-256 哈希计算: 计算文件的 SHA-256 哈希值,用于验证文件的完整性。

文本(.txt)加解密:

用户选择文本类型(输入1),并产生哈希值:

图26 用户选择与哈希值

图像(.png)加解密:

用户选择文本类型(输入2),并产生哈希值:

图27 用户选择与运行结果

视频(.mp4)加解密:

用户选择文本类型(输入3),并产生哈希值:

  • 图28 用户选择与运行结果

  • 软件使用说明
  • 1. 运行环境要求:

    请确保您的计算机上已安装 Java 运行时环境(JRE)。

    2. 下载并解压源代码:

    将提供的源代码文件保存到您的计算机上,并解压缩文件(如果是压缩文件)。

    3. 编译源代码:

    打开命令行终端,进入源代码所在的目录。

    使用以下命令编译 Java 源代码文件:

    javac AES.java ECC.java SHA256.java

    4. 运行程序:

    在同一目录下运行程序。例如,对于 AES 程序,使用命令:java AES

    同样,对于 ECC 和 SHA256,使用 java ECC 和 java SHA256 运行程序。

    5. 操作步骤:

    按照程序提示,选择文件类型(文本-1、图片-2或视频-3)。

    程序将使用默认的文件路径,例如,对于文本文件选择,程序将处理名为 file.txt 的文件。

    程序将进行加密(对于 AES 和 ECC)或计算文件的 SHA-256 哈希值(对于 SHA256)。

    结果将存储在相应的文件中,例如,加密后的文件可能称为 encrypted_file.txt。

    解密(对于 AES 和 ECC)或计算 SHA-256 哈希值(对于 SHA256)并将结果存储在新文件中。

    6. 查看结果:

    执行完成后,您可以在同一目录下查看生成的文件,如 encrypted_file.txt 或 decrypted_file.txt,以及查看再屏幕上打印出来的 SHA-256 哈希值。

  • 设计体会
  • 设计思路上,我采取了模块化设计,将系统划分为AES加密、ECC加密和SHA-256哈希计算三个关键模块。用户可以首先选择文件类型,然后系统根据文件类型调用相应的模块进行处理。整体流程简单明了,用户可以轻松完成文件的加密和哈希计算。

    在具体实现中,我们遇到了一些挑战,如密钥的安全性和不同文件类型的处理。为确保密钥的安全性,选择了使用Bouncy Castle提供的加密算法库。处理不同文件类型时,通过用户选择的文件类型来确定文件格式,然后进行相应的加密或哈希计算。这样的设计使得系统更具通用性和灵活性。

    系统的核心功能已经完全实现,包括AES模块的文件加密解密、ECC模块的加密解密以及SHA-256模块的哈希计算。用户可以通过简单的交互选择文件类型,并在完成加密或哈希计算后得到相应的结果。整体设计经过测试,稳定可靠。

    在报告中,我通过流程图展示了关键函数的执行流程。展示了各模块之间的独立性。这保证了系统的可维护性和扩展性。最终的设计结果实现了系统预期的功能,用户能够轻松完成文件的安全处理。

    这个系统的设计和实现过程让我们更深入地理解了加密和哈希算法的原理,同时也提高了对模块化设计和异常处理的实际应用能力。对我未来的学习生涯有很大的帮助。

  • 注:文字大多参考了chatgpt,文档的格式在上传时发生了许多改变,抄袭时小心别被逮到。

    源代码:https://download.csdn.net/download/m0_63554401/88765411

  • 41
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Java提供了javax.crypto包,可以用来实现AES加密算法。以下是一个简单AES加密和解密示例代码: ```java import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; import java.util.Base64; public class AESUtil { public static String encrypt(String key, String plainText) throws Exception { byte[] raw = key.getBytes(); SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES"); Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); cipher.init(Cipher.ENCRYPT_MODE, skeySpec); byte[] encrypted = cipher.doFinal(plainText.getBytes()); return Base64.getEncoder().encodeToString(encrypted); } public static String decrypt(String key, String encryptedText) throws Exception { byte[] raw = key.getBytes(); SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES"); Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); cipher.init(Cipher.DECRYPT_MODE, skeySpec); byte[] encrypted = Base64.getDecoder().decode(encryptedText); byte[] original = cipher.doFinal(encrypted); return new String(original); } public static void main(String[] args) throws Exception { String key = "mysecretaeskey"; // AES密钥,长度为16或32字节 String plainText = "Hello, world!"; // 待加密的明文 String encryptedText = encrypt(key, plainText); System.out.println("Encrypted Text: " + encryptedText); String decryptedText = decrypt(key, encryptedText); System.out.println("Decrypted Text: " + decryptedText); } } ``` 以上代码使用AES算法和Base64编码实现了对明文的加密和解密。需要注意的是,AES密钥的长度必须为16或32字节,否则会抛出异常。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白鹿依海

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值