2017-10-13 3 views
-1

Pour une classe Crypto, nous avons reçu un chiffrement DESede utilisant ECB sans bourrage => "6t8Z5bKl5ybJL + MiFerNBmiTDS7wlTEUdWNwJJApWmQ ==" qui est sous forme base64. On nous a donné des indices sur la clé et j'ai donc construit toutes les clés possibles (où toutes sont dans un format ASCII).Décryptage du chiffrement DESede avec NoPadding

  String strToDecrypt="6t8Z5bKl5ybJL+MiFerNBmiTDS7wlTEUdWNwJJApWmQ=="; 
      byte[] input = strToDecrypt.getBytes(); 

      //Decrypt 
      Cipher b = Cipher.getInstance("DESede/ECB/NoPadding"); 
      b.init(Cipher.DECRYPT_MODE, keySpec); 
      byte output[] = b.doFinal(input); 
      String out = new String(output); 
      System.out.println(new String(out)); 

Quand je lance ce code à l'aide de mes clés, je reçois un IllegalBlockSizeException que mon entrée n'est pas un multiple de 8 octets. Je suis confus quant aux «bases» à utiliser. Comme je l'ai dit plus haut, le texte chiffré est en base64 donc lors de l'exécution de Cipher.DECRYPT je devrais donner des clés dans une certaine "base" ou la chaîne que je veux déchiffrer dans une certaine base.

+3

'getBytes()' ne sait pas votre chaîne est censé être codé en base64. Vous devez [décoder la chaîne en Base64] (https://stackoverflow.com/questions/469695/decode-base64-data-in-java) au lieu de simplement appeler 'getBytes()'. – Blorgbeard

+2

Plus explicitement, 'byte [] input = Base64.getDecoder(). Décode (strToDecrypt);' – erickson

+0

@erickson merci pour cela. Cela m'a donné une erreur mais en utilisant getMimeDecoder(). Decode (strToDecrypt) a fonctionné à la place. Toutes mes sorties sont comme "9 f8 uK = # g9S33". avec aucun texte en clair dans n'importe quelle position. Toutes mes clés sont en ASCII sous la forme "Êþº¾ÿÿÿÿÊþº¾ÿÿÿÿÊþº¾ÿÿÿÿ". Des suggestions sur ce que je fais mal? –

Répondre

1

Ne pas rendre la génération de clé plus difficile que nécessaire. Vous voulez essayer chaque valeur possible pour le premier octet de la section variable. Mais que se passe-t-il si cette valeur est 0xFB? Les valeurs suivantes seront 0xFC, 0xFD, 0xFE et 0xFF. Mais qu'en est-il de la dernière valeur? Vous pouvez supposer qu'ils enveloppent, à 0x00.

Si tel est le cas, quelque chose comme cela devrait fonctionner pour trouver la bonne clé:

static byte[] search(byte[] ciphertext) throws GeneralSecurityException { 
    byte[] key = template(); /* Initialize the fixed bytes of "key" */ 
    Cipher nopadding = ... ; /* Create the correct cipher */ 
    for (long xy = 0; xy < 256; ++xy) { /* Iterate over possible values */ 
    for (long wz = 0; wz < 256; ++wz) { /* Is there another range? */ 
     for (int off = 0; off < 6; ++off) { 
     key[8 + off] = (byte) (xy + off); /* Set the first range */ 
     } 
     for (int off = 0; off < 6; ++off) { 
     key[16 + off] = (byte) (wz + off); /* Set the second range */ 
     } 
     nopadding.init(/* Initialize the cipher with your key */); 
     byte[] plaintext = nopadding.doFinal(ciphertext); 
     String str = new String(plaintext, StandardCharsets.US_ASCII); 
     /* Return the key if it produced valid text */ 
     if (str.indexOf('\uFFFD') < 0) return key; 
    } 
    } 
    throw new IllegalArgumentException(); /* No key found */ 
}