2010-02-08 8 views
2

J'écris une implémentation Java d'une application écrite à l'origine en C. Je ne peux pas modifier la version C, et la version Java doit partager des données cryptées avec la version C.Quel est l'équivalent Java JCE pour cette fonction de chiffrement C OpenSSL?

est ici la partie pertinente du code de cryptage C:

makekeys(password,&key1,&key2); /* turns password into two 8 byte arrays */ 
fill_iv(iv); /* bytes 8 bytes of randomness into iv */ 
des_key_sched(&key1,ks1); 
des_key_sched(&key2,ks2); 
des_ede2_ofb64_encrypt(hashed,ctext,hashedlen,ks1,ks2, 
         &iv,&num); 

Je vois que l'équivalent JCE est quelque chose comme:

SecretKey key = new SecretKeySpec(keyBytes, "DESede"); 
IvParameterSpec iv = new IvParameterSpec(new byte[8]); 
Cipher cipher = Cipher.getInstance("DESede/?????/?????"); // transformation spec? 
cipher.init(Cipher.ENCRYPT_MODE, key, iv); 
byte[] cipherTextBytes = cipher.doFinal(plaintext); 

Questions:

  • Le code C prend deux clés, JCE en prend un. Comment puis-je concilier cela? Juste ajouter les deux dans un tableau? Dans quel ordre?
  • Quelle transformation spec (le cas échéant!) Est équivalente à la des_ede2_ofb64_encrypt de OpenSSL? Comment pourrais-je savoir, sauf en demandant à des étrangers sur Internet? ;)

Répondre

2

En réponse à votre dernière question, vous découvrirez en lisant la documentation sur les algorithmes spécifiques eux-mêmes. Les docs de Sun supposent généralement que vous êtes déjà familier avec le sujet. Dans ce cas, vous devez savoir que: triple DES est l'application de trois instances DES ECB à clé indépendante en séquence; que la manière la plus commune de ceci est quelque chose appelé DES ede, ce qui signifie que les 1ère et 3ème instances DES sont exécutées dans la direction de cryptage mais que la 2ème instance DES est exécutée dans la direction de décryptage; que ede3 trois signifie que chaque instance DES est codée indépendamment et que ede2 signifie que les première et troisième instances utilisent la même clé; que OFB64 signifie un mode de retour de sortie 64 bits.

Vous devriez obtenir le même résultat avec getInstance ("DESede/OFB64/NoPadding"), et en faisant la clé1 les 8 premiers octets de la clé DESede, key2 le 2ème et key1 le 3ème.

+0

Merci beaucoup. Les documents Sun que je travaillais ne mentionnaient pas un mode "OFB64" - seulement "OFB". Mais l'exécution semble heureuse avec OFB64. Je posterai quand il parlera à la version C. – slim

+0

Fonctionne parfaitement. Merci encore. – slim