AES CBC Pas de remplissage donne des caractères supplémentaires dans déchiffrer JAVa

Haya Raed

J'essaie de chiffrer et de déchiffrer en utilisant AES/CBC/NoPadding en JAVA. J'ai fait le cryptage à la fois en JAVA et en PHP en utilisant (mcrypt) et j'ai obtenu le même résultat, en utilisant la même clé et iv. Cependant, lorsque j'essaie de déchiffrer en JAVA, j'obtiens le mot correctement mais toujours avec des caractères supplémentaires. J'ai lu d'autres questions et j'ai constaté que je devais ajouter un rembourrage. J'ai donc ajouté Padding5 mais j'ai obtenu le même résultat. Quoi qu'il en soit, j'en ai besoin sans remplissage car c'est ainsi que cela fonctionne en PHP. Toute aide est appréciée. Mon code est ci-dessous et le résultat est ici : le résultat est dans l'image[![][1]] 2

public class RijndaelCrypt {


     //private String key = "2a4e2471c77344b3bf1de28ab9aa492a444abc1379c3824e3162664a2c2b811d";
    private static String iv = "beadfacebadc0fee";
    private static String hashedKey = "6a2dad9f75b87f5bdd365c9de0b9c842";
    private static Cipher cipher;


    public static String decrypt(String text) throws UnsupportedEncodingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException, NoSuchAlgorithmException, NoSuchPaddingException, NoSuchProviderException {

     SecretKeySpec keyspec = new SecretKeySpec(hashedKey.getBytes("UTF-8"), "AES");
     IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes("UTF-8"));
     Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
        cipher.init(Cipher.DECRYPT_MODE, keyspec, ivspec);

            byte[] decodedValue = Base64.decode(text.getBytes("UTF-8"));
            byte[] decryptedVal = cipher.doFinal(decodedValue);
            return new String(decryptedVal);              

    }

      public static String encryptNew(String data) throws Exception {

            cipher = Cipher.getInstance("AES/CBC/NoPadding");
            int blockSize = cipher.getBlockSize();

            byte[] dataBytes = data.getBytes("UTF-8");
            int plaintextLength = dataBytes.length;
            if (plaintextLength % blockSize != 0) {
                plaintextLength = plaintextLength + (blockSize - (plaintextLength % blockSize));
            }

            byte[] plaintext = new byte[plaintextLength];
            System.arraycopy(dataBytes, 0, plaintext, 0, dataBytes.length);

            SecretKeySpec keyspec = new SecretKeySpec(hashedKey.getBytes("UTF-8"), "AES");
            IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes("UTF-8"));

            cipher.init(Cipher.ENCRYPT_MODE, keyspec, ivspec);
            byte[] encrypted = cipher.doFinal(plaintext);

            return DatatypeConverter.printBase64Binary(encrypted);

         }

    public static void main (String [] args) throws Exception
    {
        Security.addProvider(new BouncyCastleProvider());
        String data = "Hello";


        System.out.println("New Decrypted: " + RijndaelCrypt.decrypt(RijndaelCrypt.encryptNew(data)));
        System.out.println("New Encryption: " + RijndaelCrypt.encryptNew(data));
         }

   }
Maarten Bodewes

The PHP mcrypt wrapper (or underlying mcrypt library) pads with zero bytes up to the block length (zero to 15 padding bytes, if 16 is the block size of the cipher). After that the blocks are encrypted by the cipher.

When decrypting in Java you need to manually remove any zero bytes from the right hand side of the plaintext after decryption using NoPadding. The zero valued padding bytes can of course be seen when hex-encoding the decrypted plaintext. However when outputting a string the zero bytes are either left out or converted to a replacement character (depending on the character set and terminal).

Notez que le remplissage par zéro de PHP a un gros inconvénient : si le texte en clair se termine par un ou plusieurs octets de valeur zéro, il peut être supprimé du texte en clair déchiffré par n'importe quelle routine de décompression. C'est pourquoi le remplissage PKCS#7 (qui remplit de 1 à 16 octets) doit être préféré.

Notez également que PHP doit rtrim("\0")en fait supprimer lui-même les zéros ; mcrypt les laisse simplement là, mais ils ne seront généralement pas imprimés.


Notez que les bibliothèques cryptographiques Bouncy Castle ont également ZeroPaddingen option. Cependant, il s'agit d'un remplissage nul de 1 à 16 octets (c'est-à-dire qu'il remplit/décompresse toujours), il est donc incompatible avec le remplissage défini utilisé par PHP mcrypt et peut échouer si la taille du texte en clair peut être divisée par la taille du bloc du chiffrement .

Cet article est collecté sur Internet, veuillez indiquer la source lors de la réimpression.

En cas d'infraction, veuillez [email protected] Supprimer.

modifier le
0

laisse moi dire quelques mots

0commentaires
connexionAprès avoir participé à la revue

Articles connexes

pourquoi le décryptage AES java renvoie des caractères supplémentaires?

Pourquoi mon débogueur affiche-t-il des caractères supplémentaires dans le tableau de caractères?

Caractères nuls supplémentaires lors du décryptage d'AES-CBC-PKCS7 avec BouncyCastle

Pas de remplissage pour le chiffrement AES dans Java Card

La copie de chaîne C++ () me donne des caractères supplémentaires à la fin, pourquoi?

Lecture de fichier binaire, ajouter des caractères supplémentaires dans c?

Résultat de regroupement de regex Perl ajoutant des caractères supplémentaires même si vous n'êtes pas dans le bon groupe

Existe-t-il un moyen de chiffrer en java / kotlin et de déchiffrer en nodejs avec AES / CBC?

Format de date Java - y compris des caractères supplémentaires

Analyse JSON à l'aide de Pandas - problème avec des caractères \ d'échappement supplémentaires

Jmeter ajoute des caractères supplémentaires ï »¿lors de la lecture à partir d'un csv

Supprimer les caractères de chaîne supplémentaires dans le formatage décimal

Décryptage AES dans l'erreur de remplissage Java

responseText contient des caractères d'espaces supplémentaires (nouvelles lignes, sauts de ligne), comment les empêcher et les supprimer dans jsp?

bcp ajout de caractères supplémentaires dans CSV out

La chaîne chiffrée RSA à l'aide de Java contient des caractères chiffrés supplémentaires lorsqu'elle est déchiffrée à l'aide de Python

Le déchiffrement d'un std::string a des octets de remplissage supplémentaires ?

(Sed) La recherche / remplacement impliquant un nombre négatif donne des caractères supplémentaires

Le rendu des résultats de la base de données dans Jinja semble ajouter {} caractères supplémentaires

L'écriture de caractères spéciaux dans un fichier json génère des barres obliques inverses supplémentaires

Comment puis-je encoder des caractères unicode supplémentaires à partir d'un tableau d'octets en Java?

Construire une extension PHP à l'aide de rijndael d'origine, chiffrer/déchiffrer correctement mais avec des octets supplémentaires

Besoin d'un script pour supprimer les caractères de saut de ligne supplémentaires des fichiers texte

16 premiers caractères manquants - Cryptage Java AES CBC et décryptage Golang

utiliser la couleur pour richtextbox mais erreur dans le contrôle de la souris lorsque des caractères de caractère supplémentaires

ObjectOutputStream écrit des caractères supplémentaires

Python striping des caractères supplémentaires

XMLHttpRequest renvoyant des caractères supplémentaires

Regex autorise des caractères supplémentaires

TOP liste

  1. 1

    Microsoft.WebApplication.targets

  2. 2

    Spring @RequestParam DateTime format comme ISO 8601 Date Heure facultative

  3. 3

    comment supprimer "compte de connexion google" à des fins de développement - actions sur google

  4. 4

    Comment ajouter une entrée à une table de base de données pour une combinaison de deux tables

  5. 5

    Passer la taille d'un tableau 2D à une fonction ?

  6. 6

    Exporter la table de l'arborescence vers CSV avec mise en forme

  7. 7

    Impossible d'accéder à la vue personnalisée pendant le test de l'interface utilisateur dans XCode

  8. 8

    Créer un système Buzzer à l'aide de python

  9. 9

    Comment changer le navigateur par défaut en Microsoft Edge pour Jupyter Notebook sous Windows 10 ?

  10. 10

    impossible d'obtenir l'image d'arrière-plan en plein écran dans reactjs

  11. 11

    Algorithme: diviser de manière optimale une chaîne en 3 sous-chaînes

  12. 12

    CSS: before ne fonctionne pas sur certains éléments,: after fonctionne très bien

  13. 13

    Conversion double en BigDecimal en Java

  14. 14

    Comment obtenir l'intégration contextuelle d'une phrase dans une phrase à l'aide de BERT ?

  15. 15

    Comment choisir le nombre de fragments et de répliques Elasticsearch

  16. 16

    Comment vérifier si un utilisateur spécifique a un rôle? Discord js

  17. 17

    Comment créer un bot à compte à rebours dans Discord en utilisant Python

  18. 18

    Existe-t-il un moyen de voir si mon bot est hors ligne ?

  19. 19

    comment afficher un bouton au-dessus d'un autre élément ?

  20. 20

    Comment activer le message Pylint "too-many-locals" dans VS Code?

  21. 21

    Je continue à obtenir l'objet 'WSGIRequest' n'a pas d'attribut 'Get' sur django

chaudétiquette

Archive