One time pad, encryption and decryption

后端 未结 6 1878
-上瘾入骨i
-上瘾入骨i 2021-01-17 23:34

I am trying to pick up cryptography and had been trying this exercise

Write a program (preferably Java) to generate a one-time pad, which is a relatively large file

6条回答
  •  猫巷女王i
    2021-01-17 23:59

    https://en.wikipedia.org/wiki/One-time_pad

    public static String crypt(String string, String keyString) {
        // convert secret text to byte array
        byte[] bytes = string != null ? string.getBytes() : new byte[0];
        int size = bytes != null ? bytes.length : 0;
        final byte[] encoded = new byte[size];
        final byte[] key = keyString != null ? keyString.getBytes() : new byte[0];
        // loop on input  bytes
        for (int i = 0; i < size; i++) {
            // shift key index 
            // (we assume key can be smaller or equal if larger then adjust)
            int keyi = i >= keySize ? size % (keySize-1) : i;
            // pad
            encoded[i] = (byte) (bytes[i] ^ key[keyi]);
        }
        return new String(encoded);
    }
    
    public static void test(String string, String keyString) {
        String encrypt = crypt(string, keyString);
        String decrypt = crypt(encrypt, keyString);
        assert(string.equals(decrypt));
    }
    
    • test("test","1234");
    • test("test","123");

    ps. you can refactor method by pull strings up and replace with bytes

    public static byte[] crypt(byte[] bytes, byte[] key) {
        int size = bytes != null ? bytes.length : 0;
        final byte[] encoded = new byte[size];
        int keySize = key != null ? key.length : 0;
        // loop on input bytes 
        for (int i = 0; i < size; i++) {
            // shift key index (assuming key <= bytes)
            int keyi = i >= keySize ? size % (keySize-1) : i;
            // pad 
            encoded[i] = (byte) (bytes[i] ^ key[keyi]);
        }
        return encoded;
    }
    

提交回复
热议问题