Cryptage Java AES: besoin de fichiers à décrypter correctement dans les outils de décryptage disponibles gratuitement


J'utilise le cryptage Java AES pour crypter les données qui seront envoyées à un destinataire. Chaque destinataire aura sa propre clé, qu'eux et moi connaissons.

L'idée est qu'ils peuvent décrypter les données en utilisant des outils de décryptage AES disponibles gratuitement.

Voici mon code:

public class AESencrypt {

    private static final String ALGO = "AES/CBC/PKCS5Padding";
    private static final byte[] keyValue = new byte[]{'T', 'h', 'e', 'B', 'e', 's', 't', 'S', 'e', 'c', 'r', 'e', 't', 'K', 'e', 'y'};
    private static byte[] iv = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };

    public void String encryptToFile(String filename, String data) throws Exception {
        Key key = new SecretKeySpec(keyValue, "AES");
        Cipher c = Cipher.getInstance(ALGO);
        IvParameterSpec ivspec = new IvParameterSpec(iv);
        c.init(Cipher.ENCRYPT_MODE, key, ivspec);
        byte[] encVal = c.doFinal(data.getBytes());
        FileOutputStream fileOutputStream = new FileOutputStream(filename);
        fileOutputStream.write(encVal);
        fileOutputStream.close();
    }

    public static void main(String[] args) throws Exception {
        encryptToFile("foo.aes", "hellothere");
    }
}

}

Pour vérifier cela, j'ai utilisé un Outil de cryptage / décryptage AES en ligne pour décrypter certains exemples de données (qui ont bien fonctionné!).

Maintenant, je voudrais utiliser un AES gratuit outil de décryptage afin que les destinataires puissent déchiffrer les données sur leur PC sans utiliser un outil en ligne - et voici où commence la frustration.

J'ai commencé à installer et à tester différents outils de décryptage AES: j'entre soigneusement la clé, choisis l'algorithme CBC, sélectionne mon fichier et clique sur "décrypter", et pourtant aucun des outils ne peut décoder mon exemple de fichier foo.aes - ils échouent tous avec des erreurs et dans un cas donné un fichier vide de zéro octet.

J'ai essayé cela avec au moins 4 différents outils de cryptage/décrypteur AES, et aucun d'entre eux n'a fonctionné pour décrypter mon fichier, ce qui m'amène à croire qu'il pourrait y avoir un problème avec mon code.

  • CriptAES
  • Crypte AES
  • Chiffrement AES avancé
  • Cr!ptAES

Si quelqu'un peut regarder mon code, ce serait grandement apprécié.

Alternativement, il peut y avoir un outil AES decryptor qui fonctionnera avec le code ci-dessus.

Author: Peter O., 2013-10-22

4 answers

Le problème auquel vous êtes confronté est que si AES est un standard, c'est juste une primitive cryptographique , et vous avez besoin d'un protocole complet .

Le protocole que vous avez mis au point fonctionne essentiellement comme suit:

  • Pré-partager la clé secrète en quelque sorte. La clé est définie comme 16 caractères dans le jeu de caractères ASCII; une fonction de dérivation de clé ne doit pas lui être appliquée (détails prédéfinis).
  • Crypter le texte en clair avec AES, en mode CBC, avec un remplissage PKCS #5 (pré-défini les détails). Utiliser un IV prédéfini.

Comme vous le voyez, il y a plusieurs détails prédéfinis que les deux parties doivent connaître pour une communication réussie, et AES n'est qu'un d'entre eux. Les outils que vous avez essayés ne sont apparemment pas d'accord sur tous ces détails.

La solution est bien sûr d'utiliser un protocole standard.

Choisir un protocole approprié, vous devez d'abord déterminer pourquoi vous avez besoin de chiffrement, car le chiffrement soi n'est pas souhaitable objectif. Contre quoi essayez-vous de vous protéger?

En substance, le cryptage substitue la confidentialité d'une grande quantité de données à celle d'une petite quantité de données (la clé). Que se passe - t-il si l'utilisateur fuit la clé par erreur? Si vous pouvez envoyer la clé en toute sécurité à un utilisateur, pourquoi ne pouvez-vous pas envoyer le reste des données via ce canal? (Un article sur le sujet: http://blogs.msdn.com/b/ericlippert/archive/2011/09/27/keep-it-secret-keep-it-safe.aspx)

C'est aussi important de réaliser que la confidentialité n'est qu'une des nombreuses propriétés de sécurité. Votre protocole ne fournit pas d'authenticité (garantit que vous avez créé le message et qu'il n'a pas été modifié), car CBC est assez malléable et peut divulguer des informations sur le texte en clair, car vous avez utilisé un IV statique.

Comme vous pouvez le voir, la conception d'un protocole sécurisé est loin d'être facile. Vous devez être conscient des détails les plus infimes de vos décisions. Même les experts ne reçoivent pas toujours ce droit.

Pour éviter tous les tracas, votre meilleure option est d'utiliser une norme établie. Utilisez TLS pour transférer des données sur une connexion réseau, et PGP pour chiffrer les données sur le disque. Les deux protocoles sont configurables pour presque tous les cas d'utilisation.

 2
Author: ntoskrnl, 2013-10-22 20:07:17

Vous avez 100 programmeurs => 100 idées différentes. Ce que j'essaie de dire ici, c'est que peut-être votre code et disons que [CriptAES] donnent la même sortie, mais ils [les programmeurs de CriptAES par exemple] ont ajouté un check/encryption/something supplémentaire afin que vous ne puissiez pas le décrypter avec n'importe quel autre outil. Peut-être qu'ils forcent les utilisateurs[les personnes qui utilisent leur outil] à utiliser uniquement cette application [CriptAES] pour le cryptage et le décryptage. Son juste idée, rien de plus. Bonne chance.

 0
Author: jNick, 2013-10-22 13:33:31

Le chiffrement symétrique (même avec le même algorithme de chiffrement) peut être utilisé de plusieurs façons et le produit est ensuite enveloppé dans une autre myriade de méthodes. Les chances que deux développeurs qui ne suivent pas une spécification particulière produisent la même sortie sont proches de zéro.

Je parie que les applications que vous avez mentionnées ne gèrent pas la sortie de l'autre, c'est-à-dire qu'elles ne sont pas mutuellement compatibles. S'ils le sont, cela signifie qu'ils suivent une norme ou une autre document et ensuite vous devez implémenter la même norme.

 0
Author: Eugene Mayevski 'Allied Bits, 2013-10-22 13:42:30

Eh bien à la fin, je pense avoir trouvé une bonne solution.

Il y a du code source Java à AES Crypt et un programme utilitaire léger correspondant que vous pouvez partager avec les utilisateurs qui ont besoin de décoder les fichiers AES que vous générez.

Cela semble être une bonne approche pour moi, sauf si quelqu'un peut dire le contraire?

 0
Author: vikingsteve, 2013-11-04 13:21:09