Я работаю над «проработанными примерами» в документе ICAO Doc 9303, часть 3, том 2 (третье издание).
В проработанных примерах есть раздел, где собран apdu MUTAUAL_AUTHENTICATE. Он включает в себя вычисление MAC-адреса «72C29C2371CC9BDB65B779B8E8D37B29ECC154AA56A8799FAE2F498F76ED92F2»
с ключом «7962D9ECE03D1ACD4C76089DCE131543», который равен euqals "5F1448EEA8AD90A7".
Итак, с помощью BouncyCastle я собрал код, выполняющий вычисления, так, чтобы он был встроен в документ.
Но затем в разделе «Безопасный обмен сообщениями» MAC «887022120C06C2270CA4020C800000008709016375432908C044F68000000000» с ключом "F1CB1F1FB5ADF208806B89DC579DC1F8". Это должно быть равно «BF8B92D635FF24F8», но с тем же кодом, который работал в предыдущем примере, я получаю другой результат. (
Код: Выделить всё
"582AFC932A87F378"
Как такое возможно? Изменяют ли они способ создания MAC-адресов в MUTAUAL_AUTHENTICATE и в безопасном обмене сообщениями? Я не могу найти ничего об этом в документе.
Вот мой код, я использую Clojure, но вся работа выполняется в BouncyCastle (Java)< /p>
Код: Выделить всё
(defn gen-mac [key message]
(let [engine (org.bouncycastle.crypto.engines.DESEngine.)
mac (org.bouncycastle.crypto.macs.ISO9797Alg3Mac. engine (org.bouncycastle.crypto.paddings.ISO7816d4Padding.))
bytes (byte-array (.getMacSize mac))
key (->bytes key)
msg (->bytes message)]
(.init mac (org.bouncycastle.crypto.params.DESedeParameters. key))
(.update mac msg 0 (count msg))
(.doFinal mac bytes 0)))
Код: Выделить всё
mac = org.bouncycastle.crypto.macs.ISO9797Alg3Mac(org.bouncycastle.crypto.engines.DESEngine(), org.bouncycastle.crypto.paddings.ISO7816d4Padding());
mac.init(org.bouncycastle.crypto.params.DESedeParameters(key));
mac.update(msg, 0, msg.length);
mac.doFinal(bytes, 0)
В документе сказано:
f . Вычислить MAC M:
i. Увеличьте SSC на 1:
SSC = ‘887022120C06C227’
ii. Объедините SSC и M и добавьте дополнение:
N = ‘887022120C06C2270CA4020C800000008709016375432908C044F68000000000’
iii. Вычислите MAC по N с помощью KSMAC:
CC = 'BF8B92D635FF24F8'
Также они предоставляют диаграмму, которая не делает это тоже яснее.
Как правильно указано ниже. Ключевым моментом здесь является вычисление MAC
Код: Выделить всё
N' = ‘887022120C06C2270CA4020C800000008709016375432908C044F6
@sainaen: И в заключение, как тебе это удалось?
Подробнее здесь: https://stackoverflow.com/questions/308 ... es-in-java