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

标签 c# java certificate asn.1

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

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

我探索了 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;
            }

关于c# - 在 C# 中创建 ASN1 编码签名以发送到 Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14490135/

相关文章:

Java - 将 JSON 转换为 XML 并保持属性

iphone - iOS分发证书过期会怎样?

macos - OSX 10.10 无需密码即可导入 .pfx?

c# - 具有数据绑定(bind) WPF 的默认按钮内容

c# - ExtractMethodCodeRefactoringProvider 遇到错误并已被禁用的原因?

java - 在 Immutables 中执行特定的 Map 实现

java - 如何以编程方式设置 JAX-WS 客户端的 SSLContext?

c# - SharePoint 人物编辑器不显示用户

javascript - Telerik过滤功能

java - 如何使用前面没有转义字符的字符分割java字符串