问题标签 [ber]

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 回答
6356 浏览

asn.1 - ASN.1 SEQUENCE (OF) 真实标签值

我发现很多关于 SEQUENCE (OF) ASN.1 数据类型的标签值的相互矛盾的信息:

维基百科声称它是 0x10 和 0x30:

http://en.wikipedia.org/wiki/Abstract_Syntax_Notation_One -> 0x30

http://en.wikipedia.org/wiki/Basic_Encoding_Rules -> 0x10

根据微软的说法是 0x30:

http://msdn.microsoft.com/en-us/library/windows/desktop/bb540799%28v=VS.85%29.aspx

在 Bouncycastle 资源中可以找到:

所以它基本上是 0x10 和 0x30 之间的平局。你知道真正的价值是还是我错过了什么?

0 投票
2 回答
8007 浏览

encoding - 对 BER(基本编码规则)感到困惑

我正在尝试学习和理解 BER(基本编码规则)。

我一直在使用网站http://asn1-playground.oss.com/来试验不同的 ASN.1 对象并使用 BER 对它们进行编码。

然而,即使是最简单的编码似乎也让我感到困惑。

让我们看一个简单的 ASN.1 模式:

所以基本上这只是一个SEQUENCE带有单个 UTF8String 类型字段的称为name.

与此序列匹配的值的示例如下:

因此,使用http://asn1-playground.oss.com/,我生成以下数据的 BER 编码:

我希望这会产生一个序列对象,然后是一个字符串对象。

我得到的是:

现在,我了解了一些这种编码。第一个八位位组 ,30是告诉我们类型是第一个对象的标识符。是二进制SEQUENCE的,这意味着我们有一个of ,一个 PC(原始/构造)位(意思是构造)和一个标记号(十进制 16),这意味着3000110000class0110000SEQUENCE

到目前为止,一切都很好。下一个值是 的字节长度SEQUENCE,即05

好吧,到目前为止还是那么好。

但是然后......我完全被下一个 octet弄糊涂80了。这意味着什么???我本来期望值为 00001100(对于标签号 12,表示 UTF8String。)

后面的字节80非常简单:03表示长度为 3,而42 6F 62只是 UTF8String 值本身,"Bob"

0 投票
2 回答
495 浏览

encoding - ASN.1 SET 类型限制

我对 ASN.1SET类型的限制感到困惑。一般来说,我意识到 aSET类型与 a 基本相同SEQUENCE,除了组件的顺序无关紧要。

Olivier Dubuisson撰写的关于 ASN.1 的开创性著作ASN.1 — 异构系统之间的通信对 SET 有这样的说法:

如果 SEQUENCE 类型的组件顺序无关紧要,则使用关键字 SET 来建模这种无序结构:

在这种情况下,应用程序可以按最佳顺序向编码器提供组件。


我在这里立即注意到的是,在 Dubuisson 的示例中,其中SET两个IA5String 类型。这似乎与我在本教程中读到的内容相矛盾,其中明确指出:

SET 的类型和值表示法与 SEQUENCE 类似,只是每个组件的类型必须与所有其他组件不同,并且值可以按任何顺序排列。

SET那么一个法律上怎么可能有两种IA5String类型呢?我倾向于相信 Olivier Dubuisson 的书而不是一些随机的 Internet 教程,但是,一个SET类型可以有多个相同类型的组件没有任何意义。原因是,在 ASN.1 中,类型标识符没有被编码,(至少对于最常见的编码,如 BER),所以解码器无法知道IA5String适用于哪个组件 - 是它surname还是firstname?没有办法判断顺序是否无关紧要。

那么奥利维尔杜比松在这里犯了一个巨大的错误吗?(在他对类型的冗长描述中,他也没有提到任何关于 a不能有超过一种SET类型的事实。)SET

0 投票
1 回答
12764 浏览

decode - 解码 SNMP PDU - 从哪里开始?

您好,我在这里的第一个问题,需要一些指导。

我正在开发一个数据包嗅探器,主要用于解码 SNMP PDU,但是我不完全确定该去哪里。

简单地说,我的数据包嗅探器可以从数据包中提取信息,但是我对数据有效负载字段感兴趣。它是用 C++ 编写的,我使用的是winsock。

我应该怎么做?SNMP 字段是否在基本编码规则中编码,还是我必须深入研究 ASN.1?

我只是希望将数据有效负载字段中的那些 SNMP 字段解码为人类可读的形式。它们将被转储到文本文件中。所以我也会考虑解码 OID。我在使用 Wireshark 并使用 GETIF 查询我的 SNMP 节点时验证所有内容。

任何指导表示赞赏。

编辑:

感谢 user1793963 很好的解释。对所有将其标记为过于宽泛的人感到抱歉。

为了详细说明我最初的问题,任何人都可以解释 PDU 本身的初始部分。

示例:我的程序输出这些十六进制值 30 82 00 A3 02 01 00,即 SEQUENCE (30)、LENGTH (82) 和其他两个值。这是来自 GetRequest PDU。

GetResponse PDU 显示这些值 30 81 B7 02 01 00, SEQUENCE, 81 in LENGTH 和另一个值。

有人可以解释以粗体标记的值。如果它使用简单的 TLV 结构,代表什么值?我所知道的是序列的开始 (30) 和 PDU 总长度 (即 82 和 81),我知道 02 01 00 在 LENGTH 和 VERSION 0 中是 INTEGER 1 但是我不明白 00 A3 (GetRequest) 和 B7 (获取响应)。这些值代表什么?非常感谢。

我也在使用 Wireshark 来检查值,但是它们没有说明 PDU 序列的开始

0 投票
2 回答
1877 浏览

asn.1 - ASN.1 中未标记的 CHOICE

我们正在使用JAC ASN.1 编译器,遇到了我们收到无法解析的 ASN.1 消息的情况。

我查看了解析器代码,发现这是库中的一个错误。由于切换到商业解决方案不是那么容易,我们被迫分叉库并修复它。

TL;博士

在 ASN.1 解码期间是否有任何情况下您读取标签号,而不是查看您的架构是否在您所在的结构级别上具有此标签号,而是查看是否有任何嵌套元素具有此标签?

这是一个重现库中错误的小示例。您可以使用这个在线游乐场来编译模式等,并查看正常运行的解析器没有问题。

架构

基本上,它是一个包含两个元素的结构:一个选项和一个字符串,这两个元素都是可选的。该示例的关键是choice 元素包含一个标签号等于可选字符串的标签号的元素。

示例消息

示例消息(编码,BER)

使用 JAC 解析器时,它将正确读取2消息中的标记号,然后遍历模式中的元素以找到与之关联的元素。但是,对于选择元素,它有一些额外的逻辑:

不是说“params 有标签 1,不是 2,所以这个值不对应”,而是说“params 有标签 1,不是 2,但它是一个选择元素,它包含一个带有标签的元素2,所以这必须是我正在寻找的元素”。

然后它接受这个类,继续解析并最终失败,因为它现在在这个类中Accident找不到标签。2

解析器逻辑中的注释说这是针对未标记选择元素的情况。但这让我感到困惑:根据我阅读的所有内容,未标记的选择元素没有默认标记,而是会被显式标记;此外,永远不能隐含地标记选择。

但是有了这些信息,我无法想象解析器中的这个逻辑有用的任何场景,我倾向于简单地删除它。但是,由于这个错误,我刚刚熟悉了 ASN.1,并且可能忽略了一些东西——是吗?

0 投票
1 回答
642 浏览

pdp - 在matlab中使用标准PDP的具有瑞利通道的OFDM收发器

我已经使用标准 PDP(如EPA、EVA 和 ETU )构建了一个带有瑞利通道的 OFDM 收发器。问题是即使对于 BPSK,我的 BER 也非常高,即 50-60% 或更高位的错误。散点图证实了这一点。我的 OFDM 收发器块包括:
---- Random Data -- Modulation(BPSK,QPSK,QAM) -- Serial2Parallel -- IFFT -- CyclicPrefix >>> Rayleigh Ch >>> Remove CP Data---FFT --- Par2Ser ---DeMod --- 接收数据。

我使用内置的 matlab 函数来创建将标准 PDP 作为参数传递的瑞利通道。

过滤 n-OFDM 符号并计算 CIR

同样在接收器,在 FFT 块之后,我只是尝试通过将接收到的符号除以 CFR 来使用这个 CFR

我得到的是非常高的 SNR 和分散的星座符号。其余的收发器模块都很简单,并且都被验证为无错误......请告诉我如何改进它。我怎样才能提高BER?需要均衡器吗?匹配过滤器会有所帮助吗?提前致谢。

注意:仅使用 RAYLEIGH 通道 AWGN 噪声根本不添加......

0 投票
1 回答
3973 浏览

public-key - 无法对 RSA 公钥进行 DER 编码和 BER 解码

我在使用 Crypto++ 保存 RSA 公钥时遇到问题(我获得了以 PKCS#8 格式加载私钥文件)。解码密钥时,我总是得到一个BERDecodeErr异常。

这是我正在使用的代码:

我也尝试了上面评论的说明,但没有成功。

你如何保存或打开公钥?

十六进制格式的公钥看起来像这样,是否有工具检查其格式/有效性(关于 crypto++ 支持什么)?

0 投票
2 回答
1347 浏览

encoding - 整数的 ASN 基本编码规则

我目前正在研究 Abstract Syntax Notation One 并阅读ITU-T Recommendation X.690

在第 15 页第 8.3.2 段中,写着:

如果整数值编码的内容八位位组包含多个八位位组,则第一个八位位组的位和第二个八位位组的位 8:

  1. 不都是一;和
  2. 不应全部为零。

注 — 这些规则确保整数值总是以尽可能少的八位组编码。

我知道,对于始终以尽可能少的八位字节编码的整数,第一个八位字节不应为零。

但是那些呢?如果我想使用基本编码规则对值 65408 (1111 1111 1000 0000) 进行编码,我应该怎么做?

0 投票
1 回答
2623 浏览

java - ASN.1 解码错误

我正在使用 Objective System Inc(http://www.obj-sys.com/products/asn1c/index.phpASN.1 Compiler和规范文件(cdr_spec.asn)生成的 Java 源代码。CDRS 基于格式 BER(基本编码规则)进行编码

生成 Java 源代码的命令:

源码生成:

当我解码第一个 CDR 文件时,它只解析 3 行,CDR 文件应该包含 100 多行,所以它被部分解码。

当我尝试解码另一个 CDR 文件时,它在解码 CDR 文件时失败并给了我这样的错误

当我使用工具检查其语法时,我的 ASN.1 规范文件没有任何语法错误。

任何了解 ASN.1 的人都可以帮我解决这个问题吗?

0 投票
1 回答
501 浏览

asn.1 - Encoding of first identifier of an OID in ASN.1 into BER

OID's it seems are a way to represent a tree like structure.

Eg 1.3.6.1 being iso(1).org(3).did(6).internet(1)

The encoding scheme used most commonly seems to be BER and I am confused about the encoding of the first two digits. Why are the first two digits encoded into a single byte and why is it like this:

Is it assumed that the first two bytes are always small numbers and hence can be 'stored' easily in one byte? If so I can understand that.

But why the use of the magic number 40? Why 40?

eg. the first byte in above 1.3.xxx case would be encoded as 43.