1

他人のコードを使用して、xbox 360 セーブ ファイルの検証に使用される RSA 署名を生成しています。コードはファイルから必要な値を読み取り、署名を正しく生成します。

コードは次のとおりです。

    byte[] xHash=null;
    RSAParameters xParams = new RSAParameters();
    br.BaseStream.Position = 0x1A8;
    xParams.D = br.ReadBytes(0x80);
    xParams.Exponent = br.ReadBytes(0x4);
    xParams.Modulus = br.ReadBytes(0x80);
    xParams.P = br.ReadBytes(0x40);
    xParams.Q = br.ReadBytes(0x40);
    xParams.DP = br.ReadBytes(0x40);
    xParams.DQ = br.ReadBytes(0x40);
    xParams.InverseQ = br.ReadBytes(0x40);
    br.close();

    br=new BinaryReader(File.OpenRead(f));
    br.BaseStream.Position=0x22c;
    xHash = new SHA1CryptoServiceProvider().ComputeHash(br.ReadBytes(0x118));
    byte[] xrsa=SignatureGenerate(xParams, xHash);

public static byte[] SignatureGenerate(RSAParameters xParam, byte[] xHash)
        {
            RSACryptoServiceProvider xRSACrypto = new RSACryptoServiceProvider();
            RSAPKCS1SignatureFormatter xRSASigFormat = new RSAPKCS1SignatureFormatter();
            xRSACrypto.ImportParameters(xParam);
            xRSASigFormat.SetHashAlgorithm("SHA1");
            xRSASigFormat.SetKey(xRSACrypto);
            return xRSASigFormat.CreateSignature(xHash);

        }

にあるもので終わろうとしていxrsaますが、Pythonを使用しています。私はpycryptoをインストールし、ドキュメントを見ていますが、まだ明らかなものがありません. まず、Crypto.PublicKey の RSA.construct は 6 つのパラメーターしか取りませんが、指数 1 と 2 (DP と DQ) は取りません。また、入力は long である必要があります。C# コードでは、値の長さは 4 バイトではなく、128 バイトと 64 バイトでした。

これは痛々しいほど明白に思えるかもしれませんが、何をする必要があるのか​​ わかりません。

私はPython 2.7.3で作業しています

編集: また、暗号化される「メッセージ」は、ファイルの 0x118 バイトの sha1 ハッシュであり、メタデータとファイルの他の部分のハッシュが含まれています。

編集: どうもありがとう、私はそれが機能することに近づいていると感じています。まだ C# の署名と一致しません。C# では、署名形式は SHA1 として設定されています。これは何をしているのですか? Python で実行できますか?

4

2 に答える 2

2

まず、Python の long は 4 バイトではありません。Python では、long には定義済みのサイズがないため、long を使用して 128 バイトの数値を格納しても問題ありません。バイト文字列を long に変換するには、次を使用できます。

long_value = long(string_value.decode('hex'), 16)
# maybe someone knows a better way?

ファイルが DER 形式である可能性はありませんか? その場合、次を使用してファイルを簡単に読み取ることができます。

from Crypto.PublicKey import RSA
with open("keyfile", "rb") as f:
    key = RSA.importKey(f.read())

そうでない場合は、PEM または DER に変換することをお勧めします。そのため、パラメーターを自分で読み込む必要はありません。とにかく、RSA.constructの最後の 3 つのパラメーターはオプションであり、特にuとして計算できます1/p % q (where p > q)。少なくとも私が試したことから、最初の 3 つのパラメーターのみを指定しても機能します。

于 2012-04-26T11:52:57.930 に答える
0

私はpycryptoと別のライブラリを試しましたが、M2Cryptoで作業したいものしか得られませんでした。

M2Crypto を Windows にインストールするのは非常に面倒でしたが、次のインストール ファイルを使用すると非常に簡単にインストールできました。

http://chandlerproject.org/bin/view/Projects/MeTooCrypto

Windows インストーラーへのダウンロード リンクは次のとおりです

于 2012-04-27T06:17:24.330 に答える