1

最近、コンパイルされたコードでさまざまな暗号化アルゴリズムをリバース エンジニアリングしようとしており、このコードにたどり着きました。これは 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;
}

注: 適用される操作は対称的なようです。

4

1 に答える 1

1

にさまざまな値を使用した後、ループの後の最初の 3 行は単なる除算であり、その直後の行はモジュロ演算であるorigValことがわかりました。for台詞

ulong num = (ulong)origVal * 43827549;
//uint num2 = ((origVal - (uint)(num >> 32)) / 2 + (uint)(num >> 32)) >> 14;
uint num2 = (origVal + (uint)(num >> 32)) / 32768;

に変換します

uint valDivN = origVal / n;

origVal -= num2 * n;

の中へ

origVal = origVal % n;


したがって、ループ内の最終的なコードはfor次のようになります。

uint valDivN = origVal / n;
origVal = origVal % n;
// RSA encrypt/decrypt here
newVal*= n;
newVal+= origVal;
origVal = valDivN;


分析

このコードは、元の値のモジュロを取得して変換し、それを で乗算してn、前の商の変換を結果に追加することにより、値を分割します。ラインuint valDivN = origVal / n;newVal*= n;フォームの逆操作。入力メッセージは 2 つの「ボックス」を持つと考えることができます。ループが実行された後、変換された値が反対側の「ボックス」に入れられます。メッセージが復号化されると、「ボックス」内の 2 つの値が逆変換され、「ボックス」内の元の場所に配置されます。RSAでn暗号n化できる最大値がn. コードは圧縮されたメッセージを処理し、復号化する前に復号化する必要がある部分を抽出するため、間違った値が復号化される可能性はありません。商が an のサイズを超える可能性がないためint(入力が an であるためint)、ループは 2 回だけ実行されます。

于 2013-07-18T15:25:24.010 に答える