【问题标题】:Encode UTF8String to ASN1 with CryptoAPI使用 CryptoAPI 将 UTF8String 编码为 ASN1
【发布时间】:2016-12-09 15:54:09
【问题描述】:

我使用此代码在 ASN1 中编码 UTF8String:

const char *charExtensionValue = "test value тест тест with some cyrillic symbols";

CERT_NAME_VALUE myNameValue;
myNameValue.dwValueType = CERT_RDN_UTF8_STRING;
myNameValue.Value.cbData = (DWORD)(strlen(charExtensionValue)+1)*2;
myNameValue.Value.pbData = (LPBYTE)charExtensionValue;

CERT_BLOB encodedBlob;

bool checkASN1Encoding = CryptEncodeObjectEx(X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, X509_ANY_STRING, &myNameValue, CRYPT_ENCODE_ALLOC_FLAG, NULL, &encodedBlob.pbData, &encodedBlob.cbData);

CryptEncodeObjectEx 运行良好,没有任何错误,但结果不是预期的:

OCTET STRING, encapsulates {
   UTF8String "ø§³û¦© Ґѐô´ 

我做错了什么?

【问题讨论】:

  • 我以前从未使用过这个函数,所以我不是专家,但文档说 CERT_RDN_UTF8_STRING 意味着值成员必须是“一个 16 位 Unicode 字符数组 UTF8 在线上编码为一个序列一个、两个或三个八位字符。”但 charExtensionValue 指向一个 8 位字符的数组。此外,您正在计算字符串,就好像它不是 UTF-16 字符串一样。
  • @Stuart,非常感谢,您的建议和 cmets 帮助了我!

标签: c cryptoapi


【解决方案1】:

文档说 CERT_RDN_UTF8_STRING 意味着值成员必须是“一个 16 位 Unicode 字符的数组 UTF8 在线上编码为一个、两个或三个八位字符的序列。”但 charExtensionValue 指向一个 8 位字符的数组。此外,您正在计算字符串,就好像它不是 UTF-16 字符串一样。 – 斯图尔特

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-27
    • 1970-01-01
    相关资源
    最近更新 更多