java加密性能

标签 java security encryption cryptography

我正在尝试加密一个巨大的.txt文件,问题是解密非常慢,我尝试了不同模式的AES、DES、3DES、BlowFish算法,但解密仍然很慢

这是我的代码:

static
{
    try
    {
        //ciphers initialization 

        SecretKey secretKey = THE_KEY;

        //Decryption cipher
        Cipher dec = Cipher.getInstance("AES/CBC/PKCS5Padding");
        byte[] ivDec = new byte[dec.getBlockSize()];
        IvParameterSpec ivparDec = new IvParameterSpec(ivDec);
        dec.init(Cipher.DECRYPT_MODE, secretKey,ivparDec);

        //Encryption cipher
        Cipher enc = Cipher.getInstance("AES/CBC/PKCS5Padding");
        byte[] iv = new byte[enc.getBlockSize()];
        IvParameterSpec ivpar = new IvParameterSpec(iv);
        enc.init(Cipher.ENCRYPT_MODE, secretKey,ivpar);
    }
    catch (Exception e){e.printStackTrace();}
}

这是加密/解密方法:

public static String encrypt (String data)
{   
    String encData = null;
    byte [] arr = null;
    try
    {
        arr = enc.doFinal(data.getBytes("UTF-8"));
        //convert to base 64
        String base64 = Base64.encodeBase64String(arr);
        encData = base64;
    }
    catch(Exception e){e.printStackTrace();}
    return encData;
}
public static String decrypt (String data)
{   
    String decData = null;
    byte [] arr = null;
    try
    {
        //convert base64 to bytes[] 
        byte[] base64 = Base64.decodeBase64(data);
        arr = dec.doFinal(base64);
        decData = new String(arr,Charset.forName("UTF-8"));
    }
    catch(Exception e){e.printStackTrace();}
    return decData;
}

如何提高此代码的性能?

最佳答案

首先,您应该尝试流式传输您的数据,或者 - 更好 - 使用 java.nio 使用 Cipher.update 映射您的文件。然后您可以直接加密/解密二进制数据。如果数据不适合可用 RAM,则读取内存中的所有内容可能会导致磁盘损坏,甚至出现内存不足错误。

将明文转换为 String 会让事情变得更糟,特别是因为 Oracle 的 Java(9 之前)在内部使用 16 位字符作为 ASCII。如果您首先要将其存储为二进制文件,则不需要将其编码为 Base 64。 Base 64 会增加更多的内存开销。

您的运行时间会带来很大的不同。 Oracle 提供的最新运行时具有大量性能改进,因此请确保运行最新的服务器 VM,以便可以使用 AES-NI 内在函数等功能。

关于java加密性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39497369/

相关文章:

asp.net-web-api - Asp.Net Web API : Protecting with a token?

postgresql - 通过迁移在 PostgreSQL 数据库中安装扩展而无需 super 用户角色?

php - 在 iOS -> php -> mySQL 之间安全地传输数据

postgresql - Npgsql 不会处理 pgp_sym_decrypt 查询 - 从命令行工作

PHP MySQL - 在不存储 key 的情况下动态加密解密数据

java - 如何使用 Spring Boot 微服务外部 log4j.properties 文件并将其作为 Linux 服务运行?

java - 如何创建第二个 "ActionListener"

java - 根据 JVM 的内存粒度确定数组的最佳大小

Java 17 应用程序在 docker 中显示 RAM 使用率非常高

java - Java中使用模数和指数的RSA加密