在C#中创建ASN1编码签名以发送到Java

我有私人/公共安全证书。 我的Java同行拥有公钥。 我需要获取一个字符串,对其进行签名,然后将其发送到Java,然后validation数据和签名。

微软和世界其他地方如何对数据进行编码/签名似乎存在一个众所周知的问题,即处理字节的方式。 众所周知,我无法找到解决方案。 如果他们拿走我的字符串和私钥,他们显然可以正确签名并validation它。 如果我拿走我的字符串,我可以在.Net中签名并validation它。 我已经看到了一系列从ASN1转换为Microsoft格式的方法(我认为是P1363),但没有从Microsoft,C#转换为ASN1 for Java。 我不知道如何进行逆向工程。

我已经探索过http://www.codeproject.com/Articles/25487/Cryptographic-Interoperability-Keys,但最终的结果并不是java方面所需要的。 我可以签一个字符串,然后我得到一个签名,但是Java家伙告诉我它需要从MC开始,第一个字节是指标。 我没有看到这个。

谢谢!

已经找到了一个解决方案,看起来像我一直看到的其他一些例子,但由于某些原因,这种方法效果更好:(以为我解决它的人命名的方法;)

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; }