我正在使用其他人的代码生成用于在 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 中完成吗?