他の人のコードを使用して、xbox 360の保存ファイルの検証に使用するRSA署名を生成しています。コードはファイルから必要な値を読み取り、正しく署名を生成します。C#コードを使用してPythonで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)は必要としません。また、入力を長くする必要があります。 C#コードでは、値は長さが4バイトではなく128バイトと64バイトでした。
これは痛いほど明白に思えるかもしれませんが、私は何をする必要があるか分かりません。
私は、Python 2.7.3
編集で働いている:また、暗号化する「メッセージ」は、ファイルの0x118バイトのSHA1ハッシュで、メタデータとの他の部分のハッシュが含まれていますファイル。
編集:ありがとう、私はそれが働くことに近づいていると思う。それでもC#のシグネチャは一致しません。 C#では、署名形式がSHA1として設定されています。これは何をしているのですか?それはPythonで行うことができますか?
おかげでそう多くの場合、xmlキーをremに変換するJavaツールが見つかりました。Pythonで文字列に署名しています。しかし、まだC#の文字列と一致しません。 C#では、コードはSHA1にハッシュアルゴリズムも設定します - 私はオペレーションを更新します。 pycryptoでこれを行う方法はありますか? – mowwwalker
あなたはCrypto.Signature.PKCS1_v1_5を使用するべきです – SquareRootOfTwentyThree
@SquareRootOfTwentyThree、申し訳ありませんが、私は近づいていると感じていますが、それでもC#の署名と一致しません。私が記号()の戻り値を得ている文字列、それは何ですか? – mowwwalker