他人のコードを使用して、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 で実行できますか?