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

在C#中创建ASN1编码签名以发送到Java,c#,java,certificate,asn.1,C#,Java,Certificate,Asn.1,我有一个私人/公共安全证书。我的Java对等方有公钥。我需要获取一个字符串,对其进行签名,并将其发送到Java,然后验证数据和签名 微软和世界其他地方如何对数据进行编码/签名似乎是一个众所周知的问题,这与字节的处理方式有关。众所周知,我找不到解决办法。如果他们拿走了我的字符串和私钥,他们显然可以正确地签名并验证它。如果我使用字符串,我可以在.Net中对其进行签名和验证。我见过很多从ASN1转换到微软格式的方法(我想是第1363页),但没有从微软C#转换到ASN1 for Java。我不知道发生了

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

微软和世界其他地方如何对数据进行编码/签名似乎是一个众所周知的问题,这与字节的处理方式有关。众所周知,我找不到解决办法。如果他们拿走了我的字符串和私钥,他们显然可以正确地签名并验证它。如果我使用字符串,我可以在.Net中对其进行签名和验证。我见过很多从ASN1转换到微软格式的方法(我想是第1363页),但没有从微软C#转换到ASN1 for Java。我不知道发生了什么,不知道如何进行逆向工程

我已经探索过了,但最终的结果并不是java方面所需要的。我可以给一个字符串签名,然后得到一个签名,但是Java的人告诉我它需要从MC开始,第一个字节是指示符。我没有看到这一点


谢谢

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

专用静态字节[]射线(字节[]sigBytes)
{
bool highMsbR=(sigBytes[0]&0x80)!=0;
bool highMsbS=(sigBytes[20]&0x80)!=0;
MemoryStream stream=新的MemoryStream();
使用(BinaryWriter=新的BinaryWriter(流))
{
writer.Write((字节)0x30);
int len=44+(高位高位高位寄存器1:0)+(高位高位高位寄存器1:0);
writer.Write((字节)len);
//r
writer.Write((字节)0x02);
Write.Write((字节)(highMsbR?21:20));
if(高msbr)
writer.Write((字节)0);
对于(int i=0;i<20;i++)
writer.Write(sigBytes[i]);
//
writer.Write((字节)0x02);
Write.Write((字节)(highMsbS?21:20));
if(高位MSB)
writer.Write((字节)0);
对于(int i=20;i<40;i++)
writer.Write(sigBytes[i]);
}
byte[]bytes=stream.ToArray();
返回字节;
}

使用弹跳城堡怎么样?它是可互操作的,works是net和java。
            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;
            }