java - java中2个(可能很大)文件的快速模块化加法

标签 java performance cryptography nio

我正在使用 One Time Pad 进行密码学实验。

我有两个文件 OTP 和 TEXT (1K-10K),其中包含字节。 OTP 很大(>1GB)。我想通过使用 OTP 偏移量执行 TEXT 与 OTP 的模加来创建第三个文件 CYPHERTEXT(与 TEXT 大小相同)。我使用 java.io 手动编写了这个代码,它可以工作,但不是很敏捷,即使使用缓冲 IO(流或编写器)也是如此。

我正在寻找一种使用 NIO 将一个底层字节缓冲区与另一个底层字节缓冲区添加在一起的方法,但找不到一种(内置)方法来做到这一点,或者使用来自 OTP 的数据过滤 TEXT 的内容除非用手。有没有什么办法可以做到这样的事情而不需要重新发明轮子?我想我可以使用选择器。理想情况下,我希望能够处理大于 2GB 的 OTP 和 TEXT 文件,这就是我考虑 NIO 的原因。

private static void createOTP() {
...
System.out.print("Generating " + filename + " ");
long startTime = System.nanoTime();
FileOutputStream fos = new FileOutputStream(f);
BufferedOutputStream bos = new BufferedOutputStream(fos, MB);
for(long currentSize =0; currentSize < OTPSize; currentSize += baSize){
   new SecureRandom().nextBytes(ba);
   bos.write(ba);
   if(currentSize % (MB * 20L * (long)sizeInGB)==0){
      System.out.print(".");
   }
}
long elapsedTime = System.nanoTime() - startTime;
System.out.println(" OTP generation elapsed Time is " + (elapsedTime / 1000000.0) + " msec");
fos.close();
bos.close();
...
}

private static void symetricEncryptionDecryption(boolean encrypt) { 
...
outtext=new File(intext.getParentFile(), direction + ".OTP");
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(outtext), MB);
byte[] plaindata = new byte[(int)intext.length()];
DataInputStream dataIs = new DataInputStream(new FileInputStream(intext));
dataIs.readFully(plaindata);
dataIs.close();
ByteBuffer bb = ByteBuffer.wrap(plaindata);
DataInputStream in = new DataInputStream(new BufferedInputStream(new FileInputStream(otpFile))); 
in.skip(offset);
while(bb.hasRemaining()){
    bos.write( bb.get() + (encrypt? in.readByte() : -in.readByte()) );
}
bos.close();
in.close();
System.out.println("Offset: " + offset);
}

那么有没有一种更巧妙的方法来做到这一点:

while(bb.hasRemaining()){
    bos.write( bb.get() + (encrypt? in.readByte() : -in.readByte()) );
}

或者为此生成 OTP。

最佳答案

目前尚不清楚您要做什么,但如果您内存映射 OTP 文件,为您提供随机访问,并且您一次读取/处理 8 个字节,即 long 值,您应该能够在 100 毫秒内编写一个加密的 10K 文本文件,其中大部分时间将花费在启动 JVM 上。

顺便说一句:如果您有权访问加密的文本和 OTP 文件,您可以在没有偏移的情况下解码文本,即您可以使用暴力破解。

关于java - java中2个(可能很大)文件的快速模块化加法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24395442/

相关文章:

java - 如何通过 Web 服务生成 'simple SSL'?

sql - 具有大量子句的 SQL 'LIKE' 语句的效率

performance - 如何压缩 CouchDB 的 HTTP 响应中的 JSON 内容?

java - maven 跳过编译错误的测试

java - 如何使用 javax.json 读取 JSON 数组

java - 滚动时 JScrollPane 不重新绘制 Canvas?

c# - EF 预编译 View 和自定义查询

cryptography - 在密码学中使用字节数组和十六进制值

c - libssh:在没有加密上下文的情况下调用 ssh_is_host_known

c# - 'Stream 不支持使用 CryptoStream 对象寻找'