java-Une méthode pour un cryptage et un décryptage rapides via exclusif ou (xor)

java-Une méthode pour un cryptage et un décryptage rapides via exclusif ou (xor)

1. Origines

La première fois que j'ai découvert le cryptage et le décryptage XOR, c'était lorsque le haut débit n'était pas populaire. À cette époque, j'utilisais un logiciel de musique en ligne pour regarder des MV. Ce n'était pas facile de télécharger des MV en ligne et de les regarder hors ligne à l'avenir.
Cependant, après avoir copié la vidéo dans d'autres répertoires du répertoire cache, j'ai constaté qu'elle ne pouvait pas être lue sans utiliser leurs lecteurs.
J'ai vérifié les programmes de transcodage de différentes vidéos à cette époque, j'ai essayé chacun d'eux et le transcodage direct a réussi.
J'étais aussi curieux à l'époque, alors j'ai vérifié les informations pertinentes. On constate que la logique est assez simple, c'est-à-dire qu'une valeur fixe (provisoirement 37) est utilisée pour effectuer une opération « OU exclusif » sur chaque octet du fichier de flux.
La valeur après avoir effectué un XOR sur le texte brut avec 37 pour la première fois est le texte chiffré, et un XORing à nouveau sur le texte chiffré avec 37 peut le transformer en texte brut.
A cette époque, je n'entrais pas dans la raison, et c'était fini si on pouvait l'utiliser ! Récemment, j'ai rencontré une fonction qui devait permettre le cryptage et le décryptage rapides de fichiers volumineux, et cet algorithme m'est soudainement apparu à l'esprit.

2. Définition XOR

  • Algorithme
    • Si les valeurs de a et b sont différentes, le résultat XOR est 1. Si les deux valeurs de a et b sont identiques, le résultat XOR est 0.
  • Règle plus facile à retenir (opération de demi-ajout)
    • XOR est également appelé opération de demi-ajout, et son algorithme est équivalent à une addition binaire sans retenue :
    • En binaire, 1 est utilisé pour représenter vrai, 0 pour représenter faux, alors l'algorithme XOR est : 0⊕0=0, 1⊕0=1, 0⊕1=1, 1⊕1=0 (identique à 0, différent comme 1 ), les règles sont les mêmes que pour l'addition, juste sans le report.
    • Ainsi, XOR est souvent considéré comme une addition sans report.

XOR n'est pas couramment utilisé, lisez les règles plusieurs fois en quelques jours, et oubliez-le en 2 semaines _ !!!.

3. Algorithme XOR

  • Retour à la loi zéro : a^a=0
  • La loi de l'identité : a^0=a
  • Loi commutative : a^b = b^a
  • Associativité : a b c = a (b c) = (a b) c
  • Loi réflexive : a b a = b

L'opérateur XOR en Java est ^

4. Principe de cryptage XOR

  • Loi réflexive XOR : a b a = b

    Après avoir lu l'algorithme XOR, vous comprendrez que le cryptage et le déchiffrement utilisent la loi réflexive XOR, qui est une propriété magique.
  • Par exemple : sans introduire de troisième variable, échanger deux valeurs ?
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
  • Cryptage du contenu

    Dans la loi de réflexivité XOR (a b a = b), si a est considéré comme la valeur de sel cryptée et b est considéré comme le texte en clair, utilisez la valeur de sel a pour effectuer deux opérations "XOR" consécutives sur le texte en clair b .Obtenir le contenu original en texte brut b. Grâce à cette loi, nous pouvons réaliser un cryptage et un décryptage simples des fichiers binaires.
    Les fichiers physiques du système sont composés de nombreux octets. Il suffit de lire et d'écrire les fichiers physiques petit à petit pour réaliser le cryptage et le déchiffrement.
    La longueur de la valeur salt détermine la difficulté de déchiffrer le texte chiffré.
    Par exemple, vous pouvez XOR de 1 bit, ou vous pouvez XOR de 4 bits, et ainsi de suite !

5. Mise en œuvre de l'algorithme de cryptage

  • Lire à l'aide de la classe InputStream
  • Écrivez à l'aide de la classe RandomAccessFile

    RandomAccessFile est la classe d'accès au contenu de fichier la plus polyvalente du système de flux d'entrée/sortie Java. Elle fournit de nombreuses méthodes pour accéder au contenu du fichier. Elle peut non seulement lire le contenu du fichier, mais également afficher des données dans le fichier. Différent des flux d'entrée/sortie ordinaires, RandomAccessFile prend en charge « l'accès aléatoire » et le programme peut accéder directement à n'importe quel endroit du fichier pour lire et écrire des données.

Au début, j'utilisais la classe OutputStream pour écrire du contenu et j'ai découvert qu'après avoir appelé la méthode write, le contenu du fichier devenait plus petit _ !!!

  • Code
    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());
    }
  • contenu du fichier text.txt
你好世界!hello,world!
你好世界!hello,world!
你好世界!hello,world!
你好世界!hello,world!
你好世界!hello,world!
你好世界!hello,world!
你好世界!hello,world!
你好世界!hello,world!
你好世界!hello,world!
你好世界!hello,world!

Résumer

Tout d’abord, RandomAccessFile est une classe très puissante, capable de lire et d’écrire des fichiers sans perdre de contenu. Je ne sais pas pourquoi OutputStream est conçu pour écraser ou ajouter !
Outre le cryptage des fichiers, les fichiers sont généralement du contenu binaire (à l'exception de certains fichiers texte) tel que exe, xls, dll, etc. Il n'est pas nécessaire de crypter tout le contenu, seule une partie du contenu doit être cryptée, et cela équivaut à Modification d'une partie du contenu. Puisque la structure originale est détruite, l'effet de cryptage peut être considéré comme atteint.
Et moins vous apportez de modifications, moins vos fichiers risquent d'être corrompus. Par exemple, s'il existe un fichier 1G et que l'alimentation est coupée à mi-chemin de l'écriture, le fichier est presque inutile et ne peut pas être déchiffré.
Si seuls les 128 premiers bits sont modifiés et que la modification est effectuée en une seule fois, le risque est légèrement moindre.

Je suppose que tu aimes

Origine blog.csdn.net/xxj_jing/article/details/131593766
conseillé
Classement