1

我正在使用其他人的代码生成用于在 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 哈希,其中包含元数据和文件其他部分的哈希。

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

4

2 回答 2

2

好的,首先:python 中的 long 不是 4 字节。在 python 中,long 没有预定义的大小,所以使用 long 存储一个 128 字节的数字是没有问题的。要将字节串转换为 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). 至少从我的尝试来看,即使您只指定前三个参数,它也可以工作。

于 2012-04-26T11:52:57.930 回答
0

我尝试了 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

于 2012-04-27T06:17:24.330 回答