最近、コンパイルされたコードでさまざまな暗号化アルゴリズムをリバース エンジニアリングしようとしており、このコードにたどり着きました。これは RSA アルゴリズムの一部です。キーのサイズが小さすぎて、想定されているデータ (この場合はint
) を暗号化/復号化できないため、コードはメッセージを 2 つの部分に分割し、それぞれを暗号化/復号化し、それらを合計します。メッセージを分割して結合するコードのセグメントを取り出し、それを試してみました。使用する数値はn
モジュラスに依存しているようです。では、このスキームとは正確には何であり、どのように機能するのでしょうか?
uint n = 32437;
uint origVal = 12345;
uint newVal = 0;
for (int i = 0; i < 2; ++i)
{
ulong num = (ulong)origVal * 43827549;
//uint num2 = ((origVal - (uint)(num >> 32)) / 2 + (uint)(num >> 32)) >> 14;
uint num2 = (origVal + (uint)(num >> 32)) / 32768;
origVal -= num2 * n;
// RSA encrypt/decrypt here
newVal *= n;
newVal += origVal;
origVal = num2;
}
// Put newVal into origVal, to reverse
origVal = newVal;
newVal = 0;
for (int i = 0; i < 2; ++i)
{
ulong num = (ulong)origVal * 43827549;
//uint num2 = ((origVal - (uint)(num >> 32)) / 2 + (uint)(num >> 32)) >> 14;
uint num2 = (origVal + (uint)(num >> 32)) / 32768;
origVal -= num2 * n;
// RSA encrypt/decrypt here
newVal *= n;
newVal += origVal;
origVal = num2;
}
注: 適用される操作は対称的なようです。