11.04.2007 23:41:45JCP и Outlook Ответов: 0
Иван
Подскажите как расшифровать сессионный ключ из сообщения сформированного Microsoft Outlook. На месте сессионного ключа имеется следущая структура:
SEQUENCE {
SEQUENCE {
OCTET STRING
A2 73 43 4A 2E 03 D3 18 C9 BF 8F 60 CA BD BD 08
01 68 E9 AD F4 53 EE A9 D7 BE 21 AB F7 41 58 A3
OCTET STRING 9C B0 4F 46
}
[0] {
OBJECT IDENTIFIER '1 2 643 2 2 31 1'
[0] {
SEQUENCE {
OBJECT IDENTIFIER '1 2 643 2 2 19'
SEQUENCE {
OBJECT IDENTIFIER '1 2 643 2 2 36 0'
OBJECT IDENTIFIER '1 2 643 2 2 30 1'
}
}
BIT STRING 1 unused bit, encapsulates {
OCTET STRING
80 63 0D E4 A4 5A 4C D1 48 AD C3 01 B7 62 1B 4E
95 B2 E9 6E 4A 79 2A 8C 23 C6 EE 5C 9C 02 DD FC
FC BA 08 88 2C 24 19 C8 BA C4 F7 C3 D7 BD 44 16
01 0A BB BF 6B 17 50 B3 36 C5 39 5F 36 F2 97 0E
}
}
OCTET STRING 34 75 31 6D 5A 7F 1E 31
}
}

Насколько я понимаю структура
SEQUENCE {
OCTET STRING
A2 73 43 4A 2E 03 D3 18 C9 BF 8F 60 CA BD BD 08
01 68 E9 AD F4 53 EE A9 D7 BE 21 AB F7 41 58 A3
OCTET STRING 9C B0 4F 46
}
и есть сессионный ключ, а структура
OCTET STRING 34 75 31 6D 5A 7F 1E 31
это вектор инициализации.

Расшифровать пытаюсь следующим кодом:
KeyAgreement keyAgree = KeyAgreement.getInstance("GOST3410DH");
keyAgree.init(privateKey, new IvParameterSpec(iv), null);
keyAgree.doPhase(publicKey, true);
SecretKey keyagree = keyAgree.generateSecret("GOST28147");
keyCipher = Cipher.getInstance("GOST28147");
keyCipher.init(Cipher.UNWRAP_MODE, keyagree);
sKey = keyCipher.unwrap(encryptedKey, null, Cipher.SECRET_KEY);

где iv вектор инициализации полученный из OCTET STRING 34 75 31 6D 5A 7F 1E 31,
открытый и закрытый ключи те что нужно, но в результате я получаю:
java.security.InvalidKeyException: Wrapped key is invalid
at ru.CryptoPro.JCP.Key.g.a(Unknown Source)
at ru.CryptoPro.Crypto.Cipher.GostCipher.engineUnwrap(Unknown Source)
at javax.crypto.Cipher.unwrap(DashoA12275)

Что я делаю не так? Есть подозрение, что данные из BIT STRING OCTET STRING 80 63 0D E4 A4.... тоже надо куда-то передавать, но не понял как.
Пытался делать так: keyCipher.init(Cipher.UNWRAP_MODE, key, new GostCipherSpec(iv2, oid)), но получаю IllegalArgumentException.
В общем очень надеюсь на вашу помощь :)