Método java-A para cifrado y descifrado rápido mediante exclusivo o (xor)

Método java-A para cifrado y descifrado rápido mediante exclusivo o (xor)

1. Antecedentes

La primera vez que entré en contacto con el cifrado y descifrado XOR fue cuando la banda ancha no era popular. En ese momento, usaba un software de música en línea para ver MV. No era fácil descargar MV en línea y verlos sin conexión en el futuro.
Sin embargo, después de copiar el video a otros directorios en el directorio de caché, descubrí que no se puede reproducir sin usar sus reproductores.
Revisé los programas de transcodificación de varios videos en ese momento, probé cada uno de ellos y la transcodificación directa fue exitosa.
También sentí curiosidad en ese momento, así que verifiqué la información relevante. Se descubre que la lógica es bastante simple, es decir, se utiliza un valor fijo (tentativamente 37) para realizar una operación "O exclusiva" en cada byte del archivo continuo.
El valor después de aplicar XOR al texto sin formato con 37 por primera vez es el texto cifrado, y aplicar XOR al texto cifrado con 37 nuevamente puede convertirlo nuevamente en texto sin formato.
En ese momento, no entré en el motivo, ¡y se acabó si podía usarse! Recientemente, encontré una función que necesitaba realizar el cifrado y descifrado rápido de archivos grandes, y este algoritmo de repente apareció en mi mente.

2. Definición de XOR

  • Algoritmo
    • Si los valores de a y b son diferentes, el resultado XOR es 1. Si los dos valores de a y b son iguales, el resultado XOR es 0.
  • Regla más fácil de recordar (operación de media suma)
    • XOR también se denomina operación de media suma y su algoritmo es equivalente a la suma binaria sin acarreo:
    • En binario, 1 se usa para representar verdadero, 0 para representar falso, entonces el algoritmo XOR es: 0⊕0=0, 1⊕0=1, 0⊕1=1, 1⊕1=0 (igual que 0, diferente como 1), las reglas son las mismas que para la suma, solo que sin el acarreo.
    • Por lo tanto, XOR a menudo se considera una suma sin acarreo.

XOR no se usa comúnmente, lea las reglas varias veces en unos días y olvídelo en 2 semanas _ !!!.

3. Algoritmo XOR

  • Retorno a la ley cero: a^a=0
  • La ley de la identidad: a^0=a
  • Ley conmutativa: a^b = b^a
  • Asociatividad: a b c = a (b c) = (a b) c
  • Ley reflexiva: a b a = b

El operador XOR en java es ^

4. Principio de cifrado XOR

  • Ley reflexiva XOR: a b a = b

    Después de leer el algoritmo XOR, puede comprender que el cifrado y descifrado utilizan la ley reflexiva XOR, que es una propiedad mágica.
  • Por ejemplo: sin introducir una tercera variable, ¿intercambiar dos valores?
public static void main(String[] args) {
    int a = 88;
    int b = 99;
    System.out.println(MessageFormat.format("交换前\ta={0}\tb={1}",a,b));
    a = a^b;
    b = a^b;
    a = a^b;
    System.out.println(MessageFormat.format("交换后\ta={0}\tb={1}",a,b));
}
输出:
交换前	a=88	b=99
交换后	a=99	b=88
  • Cifrado de contenido

    En la ley de reflexividad XOR (a b a = b), si a se considera el valor de sal cifrado y b se considera el texto sin formato, utilice el valor de sal a para realizar dos operaciones "XOR" consecutivas en el texto sin formato b Obtenga el contenido original en texto sin formato b. A través de esta ley, podemos realizar un cifrado y descifrado sencillo de archivos binarios.
    Los archivos físicos del sistema se componen de muchos bytes, solo necesitamos leer y escribir los archivos físicos poco a poco para realizar el cifrado y descifrado.
    La longitud del valor de la sal determina la dificultad de descifrar el texto cifrado.
    Por ejemplo, puede realizar una operación XOR de 1 bit, o puede realizar una operación XOR de 4 bits, ¡y así sucesivamente!

5. Implementación del algoritmo de cifrado

  • Leer usando la clase InputStream
  • Escritura usando la clase RandomAccessFile

    RandomAccessFile es la clase de acceso al contenido de archivos más versátil en el sistema de flujo de entrada/salida de Java. Proporciona muchos métodos para acceder al contenido del archivo. No solo puede leer el contenido del archivo, sino también enviar datos al archivo. A diferencia de los flujos de entrada/salida normales, RandomAccessFile admite "acceso aleatorio" y el programa puede saltar directamente a cualquier lugar del archivo para leer y escribir datos.

Al principio, usé la clase OutputStream para escribir contenido y descubrí que después de llamar al método de escritura, el contenido del archivo se hizo más pequeño _ !!!

  • Código
    public static void main(String[] args) throws Exception {
        //你好世界!hello,world!
        String fileName = "E:\\downloads\\text.txt";
        byte salt = 10;
        int readLength = 128; //读取长度
        byte[] cipherBytes = new byte[readLength];
        //读流
        try(InputStream fr = new FileInputStream(fileName)){
            byte[] buffer = new byte[readLength];
            fr.read(buffer,0,buffer.length);
            //按位执行异或
            for(int i=0;i<buffer.length;i++){
                byte b = buffer[i];
                b ^= salt;
                //byte a = b ^ salt; 不能用这种方法,因为异或后的值是int类型
                cipherBytes[i]=b;
            }
        }
        File file = new File(fileName);
        System.out.println("执行前:file.len="+file.length());
        //写流
        try(RandomAccessFile src = new RandomAccessFile(file,"rws")) {
            src.write(cipherBytes,0,cipherBytes.length);
        }
        file = new File(fileName);
        System.out.println("执行后:file.len="+file.length());
    }
  • contenido de texto.txt
你好世界!hello,world!
你好世界!hello,world!
你好世界!hello,world!
你好世界!hello,world!
你好世界!hello,world!
你好世界!hello,world!
你好世界!hello,world!
你好世界!hello,world!
你好世界!hello,world!
你好世界!hello,world!

Resumir

En primer lugar, RandomAccessFile es una clase muy poderosa que puede leer y escribir archivos sin perder contenido. ¡No sé por qué OutputStream está diseñado para sobrescribir o agregar!
Además del cifrado de archivos, generalmente los archivos son de contenido binario (excepto algunos archivos de texto) como exe, xls, dll, etc. No es necesario cifrar todo el contenido, solo es necesario cifrar una parte del contenido, lo que equivale a cambiar parte del contenido. Dado que se destruye la estructura original, se puede considerar que se ha logrado el efecto de cifrado.
Y cuantos menos cambios realice, menor será el riesgo de que sus archivos se corrompan. Por ejemplo, si hay un archivo 1G y se corta la alimentación a mitad de la escritura, el archivo es casi inútil y no se puede descifrar.
Si solo se modifican los primeros 128 bits y la modificación se completa de una vez, el riesgo es ligeramente menor.

Supongo que te gusta

Origin blog.csdn.net/xxj_jing/article/details/131593766
Recomendado
Clasificación