试图从工作的C#代码生成与Python RSA签名(Trying to generate RSA s

2019-09-16 18:11发布

我使用的是别人的代码来生成在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只需要六个参数,而不是指数一和二(DP和DQ)。 此外,输入需要是多头。 在C#代码,该值分别为128首64个字节长,而不是4字节长。

我知道这可能看起来非常明显的,但我不知道我需要做的。

我使用Python 2.7.3工作

编辑:另外,“消息”将被加密是量0x118个字节文件,其中包含的元数据和文件的其它部分的散列的SHA1哈希。

编辑:谢谢你这么多马塔,我觉得我更接近得到它的工作。 它仍然不匹配,C#签名。 在C#中,签名格式被设置为SHA1。 这是什么做的,并且可以将其在Python做呢?

Answer 1:

OK,第一:长蟒蛇不是4个字节。 在Python,长不具有预定义的大小,所以使用长存储一个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是可选的,特别u可被计算为1/p % q (where p > q) 。 从什么我已经试过至少,它的工作原理,即使你只指定了前三个参数。



Answer 2:

我试图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



文章来源: Trying to generate RSA signature with Python from working C# code