- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要对 BER 数据进行编码和解码。 .NET 有类 System.DirectoryServices.Protocols.BerConverter
静态方法要求我在第一个参数中输入一个字符串,如下所示
byte[] oid = { 0x30, 0xD, 0x6, 0x9, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0xD, 0x1, 0x1, 0x1, 0x5, 0x0 }; // Object ID for RSA
var result2 = System.DirectoryServices.Protocols.BerConverter.Decoding("?what goes here?", oid);
BER 编码用于 LDAP、证书,并且在许多其他格式中很常见。
如果有信息告诉我如何在此类上编码或解码,我会很高兴。 Stack Overflow 或 Google(或 Bing)的前几页没有关于此的内容。
问题
如何通过BER解码将上述字节数组转换为对应的OID?
如何解析(或尝试解析)DER 或 BER 格式的 SubjectPublicKeyInfo ASN.1 数据?
DER 编码\解码类似乎是 .NET 框架内部的。如果有,他们在哪里? (我想请求 connect.microsoft.com 公开这些成员)
最佳答案
How do I convert the byte array above to the corresponding OID using BER decoding?
提取 OID 字节数组后,可以使用 OidByteArrayToString()
将其转换为 OID 字符串。我已经包含了下面的代码,因为我在 .NET 库中找不到类似的函数。
How can I parse (or attempt to parse) SubjectPublicKeyInfo ASN.1 data in DER or BER format?
我也无法在 .NET SDK 中找到 TLV 解析器。下面是 BER TLV 解析器 BerTlv
的实现。由于 DER 是 BER 的子集,因此解析将以相同的方式进行。给定 BER-TLV byte[]
数组,它将返回支持子 TLV 访问的 BerTlv
对象列表。
It seems the DER encoding\decoding classes are internal to the .NET framework. If so, where are they? (I'd like to ask connect.microsoft.com to make these members public)
也许其他人可以回答这个问题。
总结
这是您如何使用下面提供的代码的示例。我使用了你之前提供的公钥数据 post .应该增强 BerTlv 以支持像 BerTlv.getValue(rootTlvs, '/30/30/06');
这样的查询。
public static void Main(string[] args)
{
string pubkey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDrEee0Ri4Juz+QfiWYui/E9UGSXau/2P8LjnTD8V4Unn+2FAZVGE3kL23bzeoULYv4PeleB3gfmJiDJOKU3Ns5L4KJAUUHjFwDebt0NP+sBK0VKeTATL2Yr/S3bT/xhy+1xtj4RkdV7fVxTn56Lb4udUnwuxK4V5b5PdOKj/+XcwIDAQAB";
byte[] pubkeyByteArray = Convert.FromBase64String(pubkey);
List<BerTlv> rootTlvs = BerTlv.parseTlv(pubkeyByteArray);
BerTlv firstTlv = rootTlvs.Where(tlv => tlv.Tag == 0x30).First();//first sequence (tag 30)
BerTlv secondTlv = firstTlv.SubTlv.Where(tlv => tlv.Tag == 0x30).First();//second sequence (tag 30)
BerTlv oid = secondTlv.SubTlv.Where(tlv => tlv.Tag == 0x06).First();//OID tag (tag 30)
string strOid = OidByteArrayToString(oid.Value);
Console.WriteLine(strOid);
}
输出:
1.2.840.113549.1.1.1
OID 编码/解码
public static byte[] OidStringToByteArray(string oid)
{
string[] split = oid.Split('.');
List<byte> retVal = new List<byte>();
//root arc
if (split.Length > 0)
retVal.Add((byte)(Convert.ToInt32(split[0])*40));
//first arc
if (split.Length > 1)
retVal[0] += Convert.ToByte(split[1]);
//subsequent arcs
for (int i = 2; i < split.Length; i++)
{
int arc_value = Convert.ToInt32(split[i]);
Stack<byte> bytes = new Stack<byte>();
while (arc_value != 0)
{
byte val = (byte) ((arc_value & 0x7F) | (bytes.Count == 0 ? 0x0:0x80));
arc_value >>= 7;
bytes.Push(val);
}
retVal.AddRange(bytes);
}
return retVal.ToArray();
}
public static string OidByteArrayToString(byte[] oid)
{
StringBuilder retVal = new StringBuilder();
//first byte
if (oid.Length > 0)
retVal.Append(String.Format("{0}.{1}", oid[0] / 40, oid[0] % 40));
// subsequent bytes
int current_arc = 0;
for (int i = 1; i < oid.Length; i++)
{
current_arc = (current_arc <<= 7) | oid[i] & 0x7F;
//check if last byte of arc value
if ((oid[i] & 0x80) == 0)
{
retVal.Append('.');
retVal.Append(Convert.ToString(current_arc));
current_arc = 0;
}
}
return retVal.ToString();
}
BER-TLV 解析器
class BerTlv
{
private int tag;
private int length;
private int valueOffset;
private byte[] rawData;
private List<BerTlv> subTlv;
private BerTlv(int tag, int length, int valueOffset, byte[] rawData)
{
this.tag = tag;
this.length = length;
this.valueOffset = valueOffset;
this.rawData = rawData;
this.subTlv = new List<BerTlv>();
}
public int Tag
{
get { return tag; }
}
public byte[] RawData
{
get { return rawData; }
}
public byte[] Value
{
get
{
byte[] result = new byte[length];
Array.Copy(rawData, valueOffset, result, 0, length);
return result;
}
}
public List<BerTlv> SubTlv
{
get { return subTlv; }
}
public static List<BerTlv> parseTlv(byte[] rawTlv)
{
List<BerTlv> result = new List<BerTlv>();
parseTlv(rawTlv, result);
return result;
}
private static void parseTlv(byte[] rawTlv, List<BerTlv> result)
{
for (int i = 0, start=0; i < rawTlv.Length; start=i)
{
//parse Tag
bool constructed_tlv = (rawTlv[i] & 0x20) != 0;
bool more_bytes = (rawTlv[i] & 0x1F) == 0x1F;
while (more_bytes && (rawTlv[++i] & 0x80) != 0) ;
i++;
int tag = Util.getInt(rawTlv, start, i-start);
//parse Length
bool multiByte_Length = (rawTlv[i] & 0x80) != 0;
int length = multiByte_Length ? Util.getInt(rawTlv, i+1, rawTlv[i] & 0x1F) : rawTlv[i];
i = multiByte_Length ? i + (rawTlv[i] & 0x1F) + 1: i + 1;
i += length;
byte[] rawData = new byte[i - start];
Array.Copy(rawTlv, start, rawData, 0, i - start);
BerTlv tlv = new BerTlv(tag, length, i - length, rawData);
result.Add(tlv);
if (constructed_tlv)
parseTlv(tlv.Value, tlv.subTlv);
}
}
}
这是一个实用程序类,其中包含上面类中使用的一些函数。包含它是为了清楚地说明它是如何工作的。
class Util
{
public static string getHexString(byte[] arr)
{
StringBuilder sb = new StringBuilder(arr.Length * 2);
foreach (byte b in arr)
{
sb.AppendFormat("{0:X2}", b);
}
return sb.ToString();
}
public static byte[] getBytes(String str)
{
byte[] result = new byte[str.Length >> 1];
for (int i = 0; i < result.Length; i++)
{
result[i] = (byte)Convert.ToInt32(str.Substring(i * 2, 2), 16);
}
return result;
}
public static int getInt(byte[] data, int offset, int length)
{
int result = 0;
for (int i = 0; i < length; i++)
{
result = (result << 8) | data[offset + i];
}
return result;
}
}
关于encoding - 如何使用 BER 编码对象 System.DirectoryServices.Protocols.BerConverter.Encode ("???", myData),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11269401/
我正在尝试学习和理解 BER(基本编码规则)。 我一直在使用网站http://asn1-playground.oss.com/试验不同的 ASN.1 对象并使用 BER 对其进行编码。 然而,即使是最
我正在尝试使用 Apache Harmony ASN.1/BER 类解析 LDAP 绑定(bind)请求(可以使用另一个库,我只是选择它,因为它具有 Apache 许可证)。 我的问题是关于 ASN.
我正在使用 Java 语言开发 SNMP 管理器。我目前正在开发一个由 Netty 的强大功能支持的自定义 ASN/BER 编解码器。我已经很好地了解并理解了底层的东西,但我以前从未使用过协议(pro
我在他们所指的文档中找到了 简单的 TLV 和 BER-TLV .我查看了大多数 EMV 和 GP 文档,但他们没有提到不同之处。 谁能帮我理解两者的区别? 最佳答案 ISO/IEC 7816-4 中
我有一个关于使用公钥加密消息的问题。 我想用包含在字符串中的公钥 RSA-4096 加密字符串(让我们说 "test" )。 让我们说: -----BEGIN PUBLIC KEY----- MIIC
我一直致力于使用 Crypto++ 的数字签名者和验证者。我遇到了以下问题:我的签名者和验证者在使用第一个示例(生成一个 RSA key 对并保存它)以编程方式生成的公钥和私钥上运行良好 wiki .
我遇到了与 asked here 类似的问题.我有一个我认为是 DER 编码的 RSA PKCS#1 公钥,我想用它来验证我拥有的其他一些数据/签名,但我什至无法进行解码。 我使用的是在该问题的解决方
要构建嵌套 TLV 元素(例如 6F1A840E315041592E5359532E4444463031A5088801025F2D02656E),我使用以下数据结构: typedef struct
我有一个 .BER 格式的编码文件,但无法解码。 经过搜索,我发现我需要使用 ASN1 库才能解码该文件并使其可读。 有人可以指导我如何在 python 上使用 ASN1 库解码 .BER 文件吗?
请原谅我的英语不好。我有一个十进制数:0.15625。 (这是示例)http://www.strozhevsky.com/free_docs/asn1_in_simple_words.pdf (第5页
我是 Java 的新手,所以我想使用标准解决方案来完成标准任务。标签和值的长度未知。 最佳答案 您可以使用这个 BER-TLV 解析器:source code on git。 示例: 如何解析 byt
有几种工具可以自动生成用于读写 BER 编码文件的 C++(或其他)代码。在我的 C++ 项目中,我需要库来读取和修改 BER 编码文件。我无法根据给定的数据结构生成 C++ 类,因为没有给定的数据结
我正在查看可以在 location 上看到的 SNMPBEECodec 特别是我正在查看函数 encodeLength() 我感兴趣的片段 int numBytes = 0;
我正在构建一个 Ionic 应用程序,并希望为 iOS 构建它。它没有用。我收到一个错误,指出找不到模块。过了一会儿,我通过使用 npm install MODULENAME -g 安装了几个模块来解
昨天我了解到使用 TLV 表示信息格式。 如果您要用 ANSI C 编写可移植 BER TLV 编码器/解码器,您会使用什么数据结构 (*)? 像下面这样的事情会做吗? struct TlvEleme
我一直在阅读 X.690“信息技术 – ASN.1 编码规则:基本编码规则 (BER)、规范编码规则 (CER) 和可分辨编码规则 (DER) 规范” 特别是,第 8.5.6.4 (d) 节关于具有可
我需要帮助绘制不同信噪比或 Eb/N0 的 BPSK 调制方案的比特误差曲线或符号误差曲线。该图应显示模拟与理论曲线,但我不知道如何缓解使用恒模算法作为均衡器时出现的问题,这些问题是: (1) Er
正在为 GNU Radio OOT 开发基于 Python 的 BER 置信度计算器。根据引用文献 1,置信度由以下公式计算 但是,引用文献2使用以下公式计算置信度: 第一个问题是关于两个公式的。他们
我一直在搜索这个主题一段时间,但没有找到任何相关答案。所以想把它放在“Stackoverflow”上...... 我们正在尝试对字符串进行编码以便通过 TCP/IP 连接传递它。由于 ASN.1 是最
我打算从智能卡响应中解析 BER-TLV 格式来解释数据。 它类似于JACCAL , 但在 Objective-C 或 C++ 中 任何人都可以引用任何开源项目或任何引用吗? 最佳答案 这是一个解码
我是一名优秀的程序员,十分优秀!