我有一个私人/公共安全证书。我的 Java 同行拥有公钥。我需要获取一个字符串,对其进行签名,然后将其发送到 Java,然后验证数据和签名。
微软和世界其他地方如何编码/签名数据似乎存在一个众所周知的问题,即有关字节处理方式的问题。这是众所周知的,我找不到解决方案。如果他们拿到我的字符串和私钥,他们显然可以正确签名并验证它。如果我拿走我的字符串,我可以在 .Net 中对其进行签名和验证。我见过很多从 ASN1 转换为 Microsoft 格式的方法(我认为是 P1363),但没有看到从 Microsoft、C# 转换为 Java 的 ASN1。我不太清楚发生了什么,无法理解如何进行逆向工程。
我探索过http://www.codeproject.com/Articles/25487/Cryptographic-Interoperability-Keys http://www.codeproject.com/Articles/25487/Cryptographic-Interoperability-Keys但最终的结果并不是java端所需要的。我可以对一个字符串进行签名,并且得到一个签名,但是 Java 人员告诉我它需要以 MC 开头,第一个字节是指示符。我没有看到这个。
Thanks!
已经找到了一个解决方案,看起来像我见过的其他一些例子,但由于某种原因,这种方法效果更好:(以为我解决该问题的人命名的方法;)
private static byte[] Rays(byte[] sigBytes)
{
bool highMsbR = (sigBytes[0] & 0x80) != 0;
bool highMsbS = (sigBytes[20] & 0x80) != 0;
MemoryStream stream = new MemoryStream();
using (BinaryWriter writer = new BinaryWriter(stream))
{
writer.Write((byte)0x30);
int len = 44 + (highMsbR ? 1 : 0) + (highMsbS ? 1 : 0);
writer.Write((byte)len);
// r
writer.Write((byte)0x02);
writer.Write((byte)(highMsbR ? 21 : 20));
if (highMsbR)
writer.Write((byte)0);
for (int i = 0; i < 20; i++)
writer.Write(sigBytes[i]);
// s
writer.Write((byte)0x02);
writer.Write((byte)(highMsbS ? 21 : 20));
if (highMsbS)
writer.Write((byte)0);
for (int i = 20; i < 40; i++)
writer.Write(sigBytes[i]);
}
byte[] bytes = stream.ToArray();
return bytes;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)