尝试使用Python从C#代码生成RSA签名

我正在使用别人的代码生成用于在xbox 360保存文件中进行validation的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只接受六个参数,但不是指数一和二(DP和DQ)。 此外,输入需要很长。 在C#代码中,值为128和64字节长,而不是4字节长。

我知道这看起来很痛苦,但我不知道我需要做什么。

我正在使用Python 2.7.3

编辑:另外,要加密的“消息”是文件的0x118字节的sha1散列,其中包含元数据和文件其他部分的散列。

编辑:非常感谢你,我觉得我更接近它的工作。 它仍然与C#签名不匹配。 在C#中,签名格式设置为SHA1。 这是做什么的,可以用Python完成吗?

好的,第一个:python中的long不是4个字节。 在python中,long没有预定义的大小,所以使用long来存储一个128byte的数字是没有问题的。 要将bytestring转换为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中的最后三个参数是可选的,特别是u可以计算为1/p % q (where p > q) 。 至少从我尝试过的,即使你只指定前三个参数,它也能工作。

我尝试了pycrypto和另一个库,但只是结束了我想要使用M2Crypto。

在Windows上安装M2Crypto是一件非常痛苦的事情,但这里的安装文件非常简单:

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

Windows安装程序的下载链接位于: http : //chandlerproject.org/pub/Projects/MeTooCrypto/M2Crypto-0.21.1.win32-py2.7.exe