问题标签 [asn1]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
861 浏览

c# - C# 无法从 OpenSSL 控制台行命令验证 ECDSA(384 位)base 64 数字签名

[版主,我在将这个问题压缩到字数限制时遇到了问题,请见谅。]

用例是在 Linux 服务器上使用 OpenSSL 使用 384 位椭圆曲线数字服务器算法 (ECDSA) 对许可证(纯文本)文件进行签名,数字签名的验证在客户的 Windows 桌面操作系统(Windows ) .NET 框架。

许可证文件和 Base 64 编码数字签名通过电子邮件发送给客户(不在共享公司网络上)。客户正在运行 C# 编写的 .NET Framework(Windows 版)应用程序并验证许可证和数字签名以解锁付费功能。

现在,我说的是 Linux,但下面给出的示例服务器端代码还不是 Linux 脚本语言。我正在使用在 Windows 8 上运行的 VBA 进行原型设计,最终我将转换为 Linux 脚本语言,但暂时请耐心等待。

关键是我使用的是 OpenSSL 控制台命令,而不是针对任何 OpenSSL 软件开发工具包(C++ 头文件等)进行编译。

一个棘手的部分(也许是开始代码审查的最佳位置)是从 DER 文件中挖掘出构成公钥的 X 和 Y 坐标。DER 密钥文件是使用抽象语法符号 (ASN1) 的二进制编码文件,那里有免费的 GUI 程序,例如Code Project ASN1。易于检查的编辑器,这里是公钥文件的屏幕截图

在此处输入图像描述

幸运的是,OpenSSL 有自己的内置 ASN1 解析器,因此将相同的详细信息写入控制台,如下所示

因此,在偏移量 20 处有 98 个字节包含 X 和 Y 坐标,在字节 20 处是一个标记(0x03),指示后面有一个字符串,在字节 21 处是长度,98(任何低于 127 的长度只需要一个字节)。所以实际上真正的 98 字节数据从 byte 22 开始,所以我总共读取了 100 个字节(98+2)。在字节 22 处是 0x00,这就是BIT STRINGS 的开始方式(参见第 5 点)。在字节 23 处是0x04,表示 X 和 Y 都遵循这称为未压缩形式(可以给出 X 值并计算 Y,在这种情况下使用 0x02 或 0x03)。在 0x04 之后是 X 和 Y 坐标,每个 48 个字节,因为一个字节中有 8 位,8*48=384。

因此,人们挖掘出两个(X 和 Y)非常长的十六进制数字作为字符串。下一个难题是创建适合 C# 代码的 Xml 文件。关键类是 C# 的 ECDsaCng,导入方法是 FromXmlString,它期望文件实现标准 Rfc4050。C# 的 ECDsaCng 导入的 Xml 文件要求 X 和 Y 是十进制而不是十六进制,所以我们必须编写另一个函数来转换,我从另一个Stack Overflow 问题中提取的另一种语言翻译。

这是 VBA 代码(有很多),您需要更改它将写入其工作文件的位置。要运行的两个代码块是EntryPoint1_RunECDSAKeyGenerationBatch_RunOnceEntryPoint2_RunHashAndSignBatch

应视为已安装 OpenSSL,我的版本在 C:\OpenSSL-Win64\

完整的VBA 代码在这里,因为 SO 有 30000 个字符的限制。给出了可能的罪魁祸首代码

这是 VBA 即时窗口的输出,它说明了控制台命令和运行响应EntryPoint1_RunECDSAKeyGenerationBatch_RunOnce

这是用于运行的 VBA 即时窗口输出EntryPoint2_RunHashAndSignBatch...

接下来,我们创建一个 C# 经典控制台应用程序并粘贴以下代码以验证数字签名,记住客户将收到 base64 版本的数字签名。

我已经三次检查了这段代码。我已将许可证文件设为非常短的“Hello”并检查了字节和编码。我也检查了哈希值。我不知道下一步该做什么。请协助。提前致谢

0 投票
1 回答
851 浏览

python-2.7 - PySNMP SNMPV3 陷阱未发送

我正在为 snmpv3 实现 pysnmp 代码,试图将陷阱发送到我网络中的机器。我可以看到在 Wireshark 中可以看到陷阱,但它没有出现在我的任何陷阱接收器中。代码如下:

如果我删除 authKey、privKey、authProtocol 和 privProtocol,我可以看到陷阱接收器中收到了陷阱,但是当我将它们全部放入时,我看不到陷阱。

我的问题是:

  1. ubuntu 是否必须打开它的 161 和 162 端口才能让 windows 机器接收它?
  2. 即使使用硬编码的引擎 ID,我也可以发送没有身份验证的陷阱,但在完全身份验证的情况下是否需要正确的引擎 ID?这就是陷阱没有出现的原因吗?如果是这样,有人可以指导我找到接收系统的引擎 ID 吗?
  3. 我们可以肯定地说,既然 Wireshark 清楚地看到了陷阱,那么它只是陷阱接收器上的配置问题来显示陷阱吗?

请帮我解决一下这个。

谢谢你。

0 投票
1 回答
490 浏览

java - 阅读 DER Application Specific (asn1-java-bouncycastle)

我正在尝试使用 Bouncy castle asn1 库翻译 DER ApplicationSpecific 类型的对象(或者它可能是一个数组?),但我无法导航该结构。使用以下简单代码( arr 是我的字节数组)

我得到这个打印:

我可以猜到这是一个由 21 个元素组成的数组,但我不能更深入 谁能帮助我?非常感谢。

0 投票
1 回答
295 浏览

der - 您如何对 1994 年后的 ASN.1 EXTERNAL 类型进行编码?

背景:

在 1994 年之前,EXTERNAL是这样定义的(带有自动和显式标记):

但从那以后,它被定义为:

Dubuisson 的ASN.1说(第 412 页):

特定于上下文的标签,特别是出现在encoding组件(类型CHOICE)的替代品之前必须被编码,而不是那些在 1994 版本中计算的标签。

在第 413 页,他描述了如何对 进行编码INSTANCE OF,他指出其编码方式与 相同EXTERNAL。这些identification节目仅由一个数字为 6 ( OBJECT IDENTIFIER) 的通用标签编码。节目的encoding形式

这意味着他正在编码一个INTEGER, 5, 作为他的选择single-ASN-type

我的问题

如果 1994 年后的版本EXTERNAL向后兼容,则data-value必须转换为 1994 年前的替代版本之一encoding哪一个?

换句话说,如果我对 1994 年后的内容进行编码(EXTERNAL仅出于示例的目的而使用),它是否会被编码为presentation-context-ididentification

或者

提前致谢!

0 投票
0 回答
147 浏览

c - OpenSSL ASN.1 模板引擎中的应用程序标签?

我正在尝试使用 OpenSSL ASN.1 模板 API(来自 asn1t.h)来解析我的应用程序中的 ASN.1 对象。问题是我必须使用应用程序标签而不是默认标签:

并且宏(如 ASN1_SEQUENCE)似乎没有提供应用标签参数。

0 投票
1 回答
440 浏览

php - phpseclib asn1 编码结构

我正在尝试使用 phpseclib ASN1.php,我有一张如下图;

我有一个 json 并为这张地图使用 json_decode(IdentityObject,true) ,如下所示;

json:

而这个 jsons 输出数组:

这个数组应该是什么结构我可以成功编译。

给出此错误的最终代码

最终代码:

0 投票
1 回答
108 浏览

php - 如何在 phpseclib 上设置 Application 7 标记和无标记 ASN1

我有一个用于编码 ASN1 的地图,就像我使用 phpseclip 进行编码一样:

当我用我的数组编码时,这个网站上的输出就像这样:https ://lapo.it/asn1js/

但是我想将 Application 7 标签添加到我的 ASN1 中,并且我想要这样的输出。

我想知道是否可以使用 phpseclip 给 Application X 标签。我的 php 版本 5.5。就像没有任何标签的那样,只需 [0][1] 标签将我的数组编码为 ASN1。

首先有可能然后怎么办?肿瘤坏死因子。寻求答案。

0 投票
1 回答
446 浏览

go - ASN.1 使用 go 结构解组wireshark 十六进制代码

我正在尝试从 tcp 转储中解码以下十六进制代码。18001c3080a080800106830200e20000a28080010181010d00008301650000

我尝试解码的 ASN.1 定义采用以下格式:

据我了解,来自 tcp 转储的 ConnectionEstablishedReply 的标签或类型是 24,而序列的标签是 16。这些标签中的不匹配是导致错误的原因:

解组时出错:asn1:结构错误:标签不匹配(16 vs {class:0 tag:24 length:0 isCompound:false}){optional:false explicit:false application:false defaultValue: tag: stringType:0 timeType :0 set:false omitEmpty:false} ConnectionEstablishedReply @2

与这些元素对应的 go 结构是:

对于其他元素也是如此。

解组代码:

在上一个问题(ASN.1 Unmarshalling using go structs give tags don't match error)中遇到类似问题,有人告诉我应该对这些结构使用隐式 asn.1 标签。但是,这些标签不适用于这些特定于应用程序的元素。

仅供参考,当仅将上述十六进制流的 3080a080800106830200e20000a28080010181010d00008301650000(消息部分)输入http://asn1-playground.oss.com/时,解码成功。然而,在 go 代码中使用相同的流时给出:

找到不定长度(不是 DER)

在这些 go 结构中应该使用哪些 asn.1 标签才能成功解组?

0 投票
1 回答
487 浏览

python - 信任链在哪里?[python] asn1crypto 和 pkcs11 阿拉丁 USB eToken

我有这个代码工作正常。我正在使用 USB eToken 签名。但是,在https://lapo.it/asn1js/中复制并粘贴此代码的 PEM 输出后,未显示信任链。此 eToken 由 CA 提供,因此它具有签名的信任链。怎么了?

0 投票
1 回答
1103 浏览

asn1 - asn1tools 编码 asn.1 失败

asn.1文件(test.asn)如下,我想用python对文件进行编码得到asn.1的位串,但是当我用python按照not ber编码时,出现错误。我不知道异常的含义是什么。请帮忙检查一下。

python代码如下:

但错误还是发生了: