Тут нет никаких секретов.
Для проверки подлинности файлов в 3DO используют подсчет контрольной суммы при помощи алгоритма MD5, к этим полученным 16 байтам добавляют постоянный префикс из 48 байт, что в итоге даёт 64 байт или 512 бит. Из этих 64 байт шифрованием по алгоритму RSA (приватным ключом) получают другие 64 байт которые дописываются к конец подписываемого файла.
При проверке файла расшифровывают последние 64 байт публичным ключом, убеждаются что 48-ми байтный префикс такой, как и должен быть, а оставшие 16 байт точно какая же контрольная сумма MD5 всего файла (без подписи конечно). Если совпадений нет, то такой файл использоваться не будет, - тут ошибка или злой умысел.
Как же работает шифрование/дешифрование по алгоритму RSA? На удивление он достаточно прост и использует в обоих случаях одну единственную математическую операцию, - возведение в степень. Только при этом применяется не привычная всем арифметика из школы, а арифметика по модулю некоторого числа, когда в результате любых вычислений могут получиться только целые числа от нуля до модуля минус 1. Иначе говоря, все результаты можно расположить в пределах некоторого круга (кольца). Так сумма (900+120) mod 1000 равна 20, а не 1020, а разность (3-5) mod 47 равна не -2, а 45. Даже когда компьютер складывает два байта и в результате тоже получает байт, то он фактически складывает по модулю 256.
У этой арифметики много разных свойств, одно из которых позволяет при выборе модуля из произведения двух простых чисел (модуль N=p*q) получать по произвольно заданному числу (e - публичный ключ) другое такое число (d - приватный ключ), такое что какое бы мы не взяли число (m - сообщение) возведение его в степень d, а затем в степень е будет вновь давать исходное сообщение m. Т.е. после первого возведения в степень будет получаться зашифрованное сообщение (обычно обозначают - c), а второе возведение будет давать исходное число m. По первым буквам фамилий математиков предложивших использовать это свойство ( ((m ** d) mod N) ** e mod N) == m ) в качестве шифра с двумя разными ключами и был назван алгоритм RSA.
Вся его стойкость основывается на трудности по числу N найти простые числа p,q, что позволит атакующему найти приватный ключ d. А всего-то нужно число N разложить на множители, это просто когда оно небольшое (15=3*5), а вот для чисел, состоящих из сотен цифр, это проблема. Для её решения придумываются новые математические методы (можно я не буду тут об этом писать?), ну и быстродействие компьютеров растет, - в 90-х годах казалось, что 512 битного числа достаточно для устойчивости от взлома разложением N на тот момент, а сегодня на это потребуется один-два месяца работы одного компьютера.
Вот таким вот разложением мы тут и занимаемся... Хотя проект, к которому мы примкнули, работает не над взломом RSA ключей, а применяет разложение для решения других математических проблем, где также важно разложение больших чисел на множители.
Ну а по логам, если смотреть на файл msieve.LA+SQRT.log
то видно, что один из модулей (512-ти битное число или 154 десятичных знаков) был получен произведением двух чисел (77 и 78 значных):
92148915259187652735546324658820788400295573942653196481790449977806032404181
106877327934456063902508171996636457205791109741669452896794832726122641936429