2016-02-24 1 views
0

Je veux décrypter la clé privée dans un keystore Java JCEKS, et je ne veux pas utiliser Java.Quel est l'algorithme pour le PBE JCEKS utilisé pour chiffrer la clé privée?

Je peux trouver une description du PBEWithMD5AndTripleDES, mais pas l'implémentation réelle.

Ce commentaire explique supposément la dérivation:

/** 
* This class implements a proprietary password-based encryption algorithm. 
* It is based on password-based encryption as defined by the PKCS #5 
* standard, except that is uses triple DES instead of DES. 
* 
* Here's how this algorithm works: 
* 
* 1. Create random salt and split it in two halves. If the two halves are 
* identical, invert one of them. 
* 2. Concatenate password with each of the halves. 
* 3. Digest each concatenation with c iterations, where c is the 
* iterationCount. Concatenate the output from each digest round with the 
* password, and use the result as the input to the next digest operation. 
* The digest algorithm is MD5. 
* 4. After c iterations, use the 2 resulting digests as follows: 
* The 16 bytes of the first digest and the 1st 8 bytes of the 2nd digest 
* form the triple DES key, and the last 8 bytes of the 2nd digest form the 
* IV. 
* 
* @author Jan Luehe 
* @see javax.crypto.Cipher 
*/ 

Mais, est que la première concaténation, password + half-of-salt, ou est-ce half-of-salt + password? Est l'entrée des tours suivants password + digest, ou est-ce digest + password. Entre les caractères de 8 bits, ou les caractères complets de 16 bits, et les combinaisons possibles de concaténation, vous penseriez que par essais et erreurs j'aurais dû le résoudre maintenant.

Je sais que le sel , et les itérations et le mot de passe , et même le texte en clair que le cryptogramme doit déchiffrer à (dire je les données décryptées).

Déduction d'une clé DES3 de 24 octets, qu'il s'agisse de la parité de fixation ou de la laisser seule, et d'une IV de 8 octets décryptant en mode DES3 CBC, je ne peux pas recréer mon texte en clair.

Quel est l'algorithme décrit par ce commentaire?

+0

Jetez un oeil à la réponse acceptée à [cette] (http://stackoverflow.com/questions/9432518/what-is-the-key-size-for-pbewithmd5andtripledes) question. Il parle de pourquoi ne pas utiliser PBEWithMD5AndTripleDES .. et aussi avoir un lien vers une implémentation. –

+0

@Ebbe M. Pedersen Merci. erikson 1 a fourni un lien vers la même source à partir de cette question: http://stackoverflow.com/questions/10597469/encryption-used-by-jceks-keystore-in-javatm-cryptography-extension. BTW, je n'utiliserais pas ce PBE, mais je dois le supporter. –

Répondre

1

Merci à erikson 1 qui a répondu à un commentaire on this answer à une autre question, et à Ebbe M. Pedersen. En fin de compte, je devrais avoir trébuché sur la réponse en essayant les différentes combinaisons, mais en quelque sorte manqué. Pour ceux qui sont intéressés, une fois que vous ouvrez le JKS et trouvez l'entrée, le PKCS # 8 crypté montre l'algorithme JCEKS 1.3.6.1.4.1.42.2.19.1 avec les paramètres de compte de sel et d'itération et avec ceux-ci et vos 8 -bit/char password vous pouvez déchiffrer le texte chiffré pour trouver le PKCS # 8 interne non crypté contenant votre clé privée.

def jce_pbkdf1(password, salt, iterations) 
    salts = [copy = salt.dup, copy.slice!((copy.length/2)..-1)] 
    octets = salts.map { |half| (iterations).times.inject(half) { |digest| OpenSSL::Digest.digest('md5', digest + password) } }.join 
    return octets[0..23], octets[24..-1] // key (parity not set) and IV 
end