一次性填充,加密和解密

use*_*962 7 java encryption cryptography one-time-pad

我正在尝试接受密码学并且一直在尝试这个练习

编写程序(最好是Java)来生成一次性填充,这是所有随机数据(比如1 MB)的相对较大的文件.该程序还应该能够基于生成的一次性填充来加密/解密文件.

提示:使用以下测试向量检查您的程序是否正确加密.

明文(ASCII):每个云都有一线希望
OTP(HEX):
密文(HEX):28b14ab7ecc33ea157b539ea426c5e9def0d81627eed498809c17ef9404cc5

我曾尝试使用随机数生成器生成一次性打击垫,因为我需要将它们转换为HEX格式.而且我很确定我很困惑或者没有以正确的方式解决它

public static void oneTimePad()
{
    Random ran = new Random();
    String s = "0123456789ABCDEF";
    for(int i = 0; i < 100; i++)
    {   
        System.out.print(s.charAt(ran.nextInt(s.length())));
    }
}
Run Code Online (Sandbox Code Playgroud)

以上将是我的一次性填充,我想知道如何使用一次性密码并解密它来实现加密.

Mac*_*arz 8

这里有一个完整的工作示例:

    // convert secret text to byte array
    final byte[] secret = "secret".getBytes()

    final byte[] encoded = new byte[secret.length];
    final byte[] decoded = new byte[secret.length];

    // Generate random key (has to be exchanged)
    final byte[] key = new byte[secret.length];
    new SecureRandom().nextBytes(key);

    // Encrypt
    for (int i = 0; i < secret.length; i++) {
        encoded[i] = (byte) (secret[i] ^ key[i]);
    }

    // Decrypt
    for (int i = 0; i < encoded.length; i++) {
        decoded[i] = (byte) (encoded[i] ^ key[i]);
    }

    assertTrue(Arrays.equals(secret, decoded));
Run Code Online (Sandbox Code Playgroud)


Maa*_*wes 3

对于一次性填充,您需要一个字节数组,而不是十六进制。十六进制仅在显示数据时才需要(我们在读取位时往往会遇到麻烦)。您可以使用 Apache Commons 库(编解码器包)从字节数组创建十六进制,或者如果您想将测试向量从十六进制解码为字节,则可以使用 Apache Commons 库(编解码器包)创建十六进制。

您应该使用安全随机数生成器,而不是Random. 所以改用new SecureRandom()吧。要生成随机数据,首先创建一个字节数组,然后调用nextBytes()随机数生成器。不需要生成整数。