2012-04-26 14 views
1

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

答えて

2

ok、最初は:pythonの長さは4バイトではありません。 Pythonでは、longにはあらかじめ定義されたサイズがありません。したがって、longを使用して128バイトの数値を格納することは問題ありません。 は、あなたが使用することができます長いにバイト文字列を変換するには:

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つのパラメータはオプションです。u1/p % q (where p > q)と計算できます。 少なくとも私が試したものから、最初の3つのパラメータだけを指定しても動作します。

+0

おかげでそう多くの場合、xmlキーをremに変換するJavaツールが見つかりました。Pythonで文字列に署名しています。しかし、まだC#の文字列と一致しません。 C#では、コードはSHA1にハッシュアルゴリズムも設定します - 私はオペレーションを更新します。 pycryptoでこれを行う方法はありますか? – mowwwalker

+2

あなたはCrypto.Signature.PKCS1_v1_5を使用するべきです – SquareRootOfTwentyThree

+0

@SquareRootOfTwentyThree、申し訳ありませんが、私は近づいていると感じていますが、それでもC#の署名と一致しません。私が記号()の戻り値を得ている文字列、それは何ですか? – mowwwalker

0

私はpycryptoと別のライブラリを試してみましたが、私がM2Cryptoを使って作業したいと思っていたことが終わりました。

M2Cryptoは、Windowsにインストールするには、深刻な苦痛だったが、それはここでは、インストールファイルと本当に簡単だった:

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

ダウンロードリンクのWindowsインストーラにここにある:http://chandlerproject.org/pub/Projects/MeTooCrypto/M2Crypto-0.21.1.win32-py2.7.exe

関連する問題