java中2个(可能较大)文件的快速模块化添加

java中2个(可能较大)文件的快速模块化添加,java,performance,cryptography,nio,Java,Performance,Cryptography,Nio,我正在做一个一次性密码实验 我有两个文件OTP和文本(1K-10K),其中包含字节。OTP很大(>1GB)。我想创建第三个文件CYPHERTEXT(与文本大小相同),方法是使用OTP对文本进行模块化添加,并在OTP中使用偏移量。我使用java.io手工编写了这个代码,它可以工作,但不是很快,即使使用缓冲io(流或写入程序) 我一直在寻找一种方法,使用NIO将一个底层字节缓冲区与另一个一起添加,但找不到一种(内置)方法来做到这一点,也找不到使用OTP数据过滤文本内容的方法,除非是手工操作。有没有办

我正在做一个一次性密码实验

我有两个文件OTP和文本(1K-10K),其中包含字节。OTP很大(>1GB)。我想创建第三个文件CYPHERTEXT(与文本大小相同),方法是使用OTP对文本进行模块化添加,并在OTP中使用偏移量。我使用java.io手工编写了这个代码,它可以工作,但不是很快,即使使用缓冲io(流或写入程序)

我一直在寻找一种方法,使用NIO将一个底层字节缓冲区与另一个一起添加,但找不到一种(内置)方法来做到这一点,也找不到使用OTP数据过滤文本内容的方法,除非是手工操作。有没有办法在不重新发明轮子的情况下做这样的事情?我想我可以用一个选择器。理想情况下,我希望能够为OTP和文本处理大于2GB的文件,这就是为什么我要研究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);
}

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


顺便说一句:如果你有权访问加密文本和OTP文件,你可能会在没有偏移量的情况下解码文本,也就是说,你可以使用暴力解决问题。

我建议你澄清你的意思。1GB文件很大,因此处理和读/写都需要时间。您还没有说您有哪个磁盘驱动器,这可能对您的速度至关重要,您在Java中所做的可能很重要。流可以是任意长度,所以您可以使用普通IO和NIO。现在还不清楚你在做什么,但是如果你一次读取/处理8个字节,例如一个字节,你可能已经足够快了。我添加了示例代码。1 GB是用于这些目的的小型OTP。因此,如果我加密的数据是任意大小的,包括超过2GB的整数限制,那就太好了。这一切都将是一个普通的7200rpm IDE硬盘,或者可能是一个USB 3.0驱动器。
int
限制适用于哪里?顺便说一句,没有任何东西可以阻止您以渐进的方式读取文本文件,就像您以渐进的方式读取OTP文件一样。您应该能够在不到0.1秒的时间内读取/写入1 MB文件。顺便说一句,如果您使用
^
按位异或,您可以将其应用于编码和解码,并且可以一次应用N个字节,例如,一次应用8个字节,而不是一次一个字节。生成OTP的成本会很高。您可以生成更小的文件。i、 只需要你需要的大小,并使用一个较便宜的随机发生器。该方案依赖于OTP永远不会被重用和密钥的安全托管。然后问题就变成了一个仅仅是密钥分配的问题。“如果密钥是真正随机的,至少与明文一样长,并且从不全部或部分重复使用,并且完全保密,那么产生的密文将无法解密或破解。[1][2]。”@GGB667这就是我所想的。通过不断地发送噪音,只有已经拥有OTP的接收数据的人才能知道是否有消息被发送。如果噪声量足够大,且噪声对信号的比率足够高,则攻击者必须存储所有传输的数据,如果他们随后拥有一个密钥来查找已发送的消息。我只在实际发送邮件时才使用OTP。如果噪声在传输前被随机延迟,以阻碍定时分析,则只能捕获OTP并记录所有数据。@GGB667您是否试图使某些东西不可能被破坏,更不可能被破坏?破坏并非不可能。攻击者只需获得一次性pad。然后他们可以阅读任何发送的内容。除非他们无法存储您(以及使用此加密方案的20亿其他东西)已经发送的所有内容。它将让政府瞄准特定的罪犯或恐怖分子以及他们所联系的人,而不是整个世界
while(bb.hasRemaining()){
    bos.write( bb.get() + (encrypt? in.readByte() : -in.readByte()) );
}