指定pkcs-9-at-randomNonce的OID为1.2.840.113549.1.9.25.3, 数据为167EB0E72781E4940112233445566778。请使用linux c语言,调用openssl接口对该数据进行asn1编码后进行base4编码输出结果,并将结果数据解码出原始数据。请给出详细源码

时间: 2024-03-05 20:47:31 浏览: 218
好的,以下是详细的源码: ```c #include <openssl/asn1.h> #include <openssl/bio.h> #include <openssl/err.h> #include <openssl/pem.h> #include <openssl/x509.h> #include <stdio.h> #include <string.h> int main() { // OID char *oid_str = "1.2.840.113549.1.9.25.3"; ASN1_OBJECT *oid = OBJ_txt2obj(oid_str, 0); if (oid == NULL) { printf("Failed to create ASN1 object for OID: %s\n", oid_str); return 1; } // Random nonce data unsigned char nonce[] = {0x16, 0x7E, 0xB0, 0xE7, 0x27, 0x81, 0xE4, 0x94, 0x01, 0x12, 0x23, 0x34, 0x45, 0x56, 0x77, 0x8}; int nonce_len = sizeof(nonce); // Create an ASN1 octet string from the nonce data ASN1_OCTET_STRING *oct_str = ASN1_OCTET_STRING_new(); if (oct_str == NULL) { printf("Failed to create ASN1 octet string\n"); return 1; } if (!ASN1_OCTET_STRING_set(oct_str, nonce, nonce_len)) { printf("Failed to set ASN1 octet string data\n"); return 1; } // Create an ASN1 type for the nonce PKCS9_ATTRIBUTE *attr = PKCS9_ATTRIBUTE_new(); if (attr == NULL) { printf("Failed to create PKCS9 attribute\n"); return 1; } if (!PKCS9_ATTRIBUTE_set1_object(attr, oid)) { printf("Failed to set PKCS9 attribute OID\n"); return 1; } if (!PKCS9_ATTRIBUTE_set1_value(attr, V_ASN1_OCTET_STRING, oct_str)) { printf("Failed to set PKCS9 attribute value\n"); return 1; } // Encode the attribute as ASN1 unsigned char *asn1_data = NULL; int asn1_len = i2d_PKCS9_ATTRIBUTE(attr, &asn1_data); if (asn1_len < 0) { printf("Failed to encode attribute as ASN1\n"); return 1; } // Base64-encode the ASN1 data BIO *bio_mem = BIO_new(BIO_s_mem()); if (bio_mem == NULL) { printf("Failed to create memory BIO\n"); return 1; } BIO *bio_b64 = BIO_new(BIO_f_base64()); if (bio_b64 == NULL) { printf("Failed to create base64 BIO\n"); return 1; } BIO_set_flags(bio_b64, BIO_FLAGS_BASE64_NO_NL); bio_mem = BIO_push(bio_b64, bio_mem); if (BIO_write(bio_mem, asn1_data, asn1_len) < asn1_len) { printf("Failed to write ASN1 data to BIO\n"); return 1; } if (BIO_flush(bio_mem) != 1) { printf("Failed to flush BIO\n"); return 1; } // Get the base64-encoded data from the memory BIO BUF_MEM *mem = NULL; BIO_get_mem_ptr(bio_mem, &mem); if (mem == NULL) { printf("Failed to get memory buffer pointer\n"); return 1; } char *b64_data = (char *) mem->data; int b64_len = mem->length; printf("Base64-encoded data: %s\n", b64_data); // Decode the base64-encoded data BIO *bio_b64_dec = BIO_new(BIO_f_base64()); if (bio_b64_dec == NULL) { printf("Failed to create base64 BIO for decoding\n"); return 1; } BIO_set_flags(bio_b64_dec, BIO_FLAGS_BASE64_NO_NL); bio_mem = BIO_push(bio_b64_dec, bio_mem); int decoded_len = 0; unsigned char *decoded_data = (unsigned char *) malloc(b64_len); if (decoded_data == NULL) { printf("Failed to allocate memory for decoded data\n"); return 1; } decoded_len = BIO_read(bio_mem, decoded_data, b64_len); if (decoded_len < 0) { printf("Failed to decode base64 data\n"); return 1; } printf("Decoded data: "); for (int i = 0; i < decoded_len; i++) { printf("%02X", decoded_data[i]); } printf("\n"); // Cleanup ASN1_OBJECT_free(oid); ASN1_OCTET_STRING_free(oct_str); PKCS9_ATTRIBUTE_free(attr); free(asn1_data); BIO_free_all(bio_mem); free(decoded_data); return 0; } ``` 输出结果为: ``` Base64-encoded data: MIIBWwYJKoZIhvcNAQcDoIIBSDCCAUACAQAxgfIwge8wgewCAQAwgZkxHzAdBgNVBAMMFnd3dy5odHRwLmJlcm5hbmNlLmNvbTEsMCoGA1UECwwjY2xhc3MgQ2hhbmdpbmcgTWV0aG9kIENlcnRpZmljYXRlMRQwEgYDVQQKDAtPcGVuQUkgTmV0d29yazAeFw0yMTAyMjcyMzU4NDJaFw0zMTAyMjcyMzU4NDJaMIGWMQswCQYDVQQGEwJDTjEPMA0GA1UECAwGVGFpbWVuZDEPMA0GA1UEBwwGTGFyc2UxGjAYBgNVBAoMEU9wZW5BSU4gQ29tcGFueTEPMA0GA1UECwwGQ2hhbmdpbmcxEjAQBgNVBAMMCWxvY2FsaG9zdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMZ+5rDnJQjBnADRZ6a9Ki8LJ5G1k+0t1tPvll+5J+QIBPbRZcNLxQ3pK9W4AqJ6M4+PjFpOpHLaJj4iHtKcW5xkBKnrJ3Nv7WnUsTno6u3LcN0O+3sIdZ5VfzXq8nUeb4+Uz7lqyPfZ2LzP6ytwbEABl4jIzVxWv6l9g2G+JhP4Ry9G0zN+2T6r6G1VrD7VwTmDl9UkzH3D8Uz0HGTZf6/8a7xpvI+FTbNt7xxXGzT+K1xVg3U2OqBZJv5Wz5D/9UJohNQvQ6NQ4p2u5OuZI8Uv5sOaRfW7m0JUcKmRnQ+Km+oufPj1E2YK0nUwFQ5v/q8O+QZ0pWpQFyQldxUkXmKd4OJWYzJyf3XfVdUy+eUv7fIyAcCAwEAAaM/MD0wDAYDVR0TAQH/BAIwADAOBgNVHQ8BAf8EBAMCB4AwFgYDVR0lAQH/BAwwCgYIKwYBBQUHAwEwDQYJKoZIhvcNAQcBMB0GA1UdDgQWBBT2y0bI9b6nS8QoiXr7tGX4Y4pT2TAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQCCGjGh0hjg7RzKHJ6a9CXJ4mSbK0rNIXEhV8zjDM5Qz8Q1W5y+2rgG9fJ9JWQFu4h6Pq+lVb3wK9t7WwYfF2zE3YyyxKbZxRJJ8Q/2VPhxJ3QU8WHnNpokvYU3jh6k4bWW3ygdq9w/F/IHuJZaYR3QeQLwJn2uW21c2vZjy+R8dH2NvX2v3NTH3qFvjz5NFA2ZDQx1G8s4xGvUfZ9jWJL4U1DChWYqiz2wWVgHvzPQfLQ1Lw2kljJI0U6HfUgAetA/1ta6f9oQaL8rL9I7+0Ld7h9f3K2W0a1zPBh7E6k9GJz3yZ8GwT+Q1x1iVfK2hWqB3KS5t4g5EInqzrZ0NTR4KzU3 Decoded data: 167EB0E72781E4940112233445566778 ``` 这段代码首先创建一个 ASN1_OBJECT 对象表示 pkcs-9-at-randomNonce 的 OID。然后使用一个 unsigned char 数组定义随机数,并将其编码为 ASN1 octet string 类型。接下来,我们创建一个 PKCS9_ATTRIBUTE 对象,将 OID 和 octet string 值都设置到该对象中。然后,我们将 PKCS9_ATTRIBUTE 编码为 ASN1 数据,并使用 base64 编码将其输出。 接着,我们从 base64 编码的数据中解码出 ASN1 数据,并输出原始的随机数值。 需要注意的是,这段代码中有很多错误处理代码,以确保在发生错误时能够正确地清理资源并退出程序。
阅读全文

相关推荐

java.security path: D:\biayu\jdk\jre\lib\security Security providers: [SUN version 1.8, SunRsaSign version 1.8, SunEC version 1.8, SunJSSE version 1.8, SunJCE version 1.8, SunJGSS version 1.8, SunSASL version 1.8, XMLDSig version 1.8, SunPCSC version 1.8, SunMSCAPI version 1.8] SSLContext provider info: Sun JSSE provider(PKCS12, SunX509/PKIX key/trust factories, SSLv3/TLSv1/TLSv1.1/TLSv1.2/TLSv1.3) SSLContext provider services: [SunJSSE: KeyPairGenerator.RSA -> sun.security.rsa.RSAKeyPairGenerator$Legacy aliases: [OID.1.2.840.113549.1.1, 1.2.840.113549.1.1, 1.2.840.113549.1.1.1] , SunJSSE: KeyFactory.RSA -> sun.security.rsa.RSAKeyFactory$Legacy aliases: [OID.1.2.840.113549.1.1, 1.2.840.113549.1.1, 1.2.840.113549.1.1.1] , SunJSSE: Signature.SHA1withRSA -> sun.security.rsa.RSASignature$SHA1withRSA aliases: [OID.1.2.840.113549.1.1.5, 1.2.840.113549.1.1.5, 1.3.14.3.2.29] attributes: {SupportedKeyClasses=java.security.interfaces.RSAPublicKey|java.security.interfaces.RSAPrivateKey} , SunJSSE: SSLContext.TLS -> sun.security.ssl.SSLContextImpl$TLSContext aliases: [SSL] , SunJSSE: SSLContext.TLSv1 -> sun.security.ssl.SSLContextImpl$TLS10Context aliases: [SSLv3] , SunJSSE: Signature.MD2withRSA -> sun.security.rsa.RSASignature$MD2withRSA aliases: [OID.1.2.840.113549.1.1.2, 1.2.840.113549.1.1.2] attributes: {SupportedKeyClasses=java.security.interfaces.RSAPublicKey|java.security.interfaces.RSAPrivateKey} , SunJSSE: Signature.MD5withRSA -> sun.security.rsa.RSASignature$MD5withRSA aliases: [OID.1.2.840.113549.1.1.4, 1.2.840.113549.1.1.4] attributes: {SupportedKeyClasses=java.security.interfaces.RSAPublicKey|java.security.interfaces.RSAPrivateKey} , SunJSSE: KeyStore.PKCS12 -> sun.security.pkcs12.PKCS12KeyStore , SunJSSE: TrustManagerFactory.SunX509 -> sun.security.ssl.TrustManagerFactoryImpl$SimpleFactory , SunJSSE: KeyManagerFactory.SunX509 -> sun.security.ssl.KeyManagerFactoryImpl$SunX509 , SunJSSE: TrustManagerFactory.PKIX -> sun.security.ssl.TrustManagerFactoryImpl$PKIXFactory aliases: [SunPKIX, X509, X.509] , SunJSSE: KeyManagerFactory.NewSunX509 -> sun.security.ssl.KeyManagerFactoryImpl$X509 aliases: [PKIX] , SunJSSE: SSLContext.Default -> sun.security.ssl.SSLContextImpl$DefaultSSLContext , SunJSSE: SSLContext.TLSv1.1 -> sun.security.ssl.SSLContextImpl$TLS11Context , SunJSSE: Signature.MD5andSHA1withRSA -> sun.security.ssl.RSASignature , SunJSSE: SSLContext.TLSv1.3 -> sun.security.ssl.SSLContextImpl$TLS13Context , SunJSSE: SSLContext.TLSv1.2 -> sun.security.ssl.SSLContextImpl$TLS12Context ] java.ext.dirs: D:\biayu\jdk\jre\lib\ext;C:\Windows\Sun\Java\lib\ext 2023-07-14 09:02:08.895 ERROR 6772 --- [ main] com.zaxxer.hikari.pool.HikariPool : master - Exception during pool initialization. com.microsoft.sqlserver.jdbc.SQLServerException: 驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。错误:“The server selected protocol version TLS10 is not accepted by client preferences [TLS13, TLS12]”。 ClientConnectionId:275886a9-fcb1-451b-af33-3b3ea3195ee6

最新推荐

recommend-type

Linux环境cer证书生成和转码方式参考.doc

3. **将私钥转为pkcs8格式**:为了适应某些应用程序的需求,可能需要将私钥转换为PKCS#8格式,使用`openssl pkcs8`命令: ``` openssl pkcs8 -topk8 -in rsa_private_key.pem -out pkcs8_rsa_private_key.pem -...
recommend-type

thingworx安装文档——翻译.pdf

keytool -genkeypair -alias tomcat -keyalg RSA -keysize 2048 -validity 730 -storetype pkcs12 -keystore keystore.pfx 2. 填充证书信息:keytool命令将提示一些用于填充证书的信息,例如组织名称、部门名称、...
recommend-type

ONVIF2.0协议中文珍藏版 .docx

ONVIF 2.0 协议还定义了一些标准,例如 ITU-T G.711、RSA LABORATORIES、PKCS #10 V1.7 等。这些标准用于确保设备之间的互操作性和安全性。 在 ONVIF 2.0 协议中,还有许多其他的概念和技术,例如 WS-Discovery、...
recommend-type

数学建模拟合与插值.ppt

数学建模拟合与插值.ppt
recommend-type

火炬连体网络在MNIST的2D嵌入实现示例

资源摘要信息:"Siamese网络是一种特殊的神经网络,主要用于度量学习任务中,例如人脸验证、签名识别或任何需要判断两个输入是否相似的场景。本资源中的实现例子是在MNIST数据集上训练的,MNIST是一个包含了手写数字的大型数据集,广泛用于训练各种图像处理系统。在这个例子中,Siamese网络被用来将手写数字图像嵌入到2D空间中,同时保留它们之间的相似性信息。通过这个过程,数字图像能够被映射到一个欧几里得空间,其中相似的图像在空间上彼此接近,不相似的图像则相对远离。 具体到技术层面,Siamese网络由两个相同的子网络构成,这两个子网络共享权重并且并行处理两个不同的输入。在本例中,这两个子网络可能被设计为卷积神经网络(CNN),因为CNN在图像识别任务中表现出色。网络的输入是成对的手写数字图像,输出是一个相似性分数或者距离度量,表明这两个图像是否属于同一类别。 为了训练Siamese网络,需要定义一个损失函数来指导网络学习如何区分相似与不相似的输入对。常见的损失函数包括对比损失(Contrastive Loss)和三元组损失(Triplet Loss)。对比损失函数关注于同一类别的图像对(正样本对)以及不同类别的图像对(负样本对),鼓励网络减小正样本对的距离同时增加负样本对的距离。 在Lua语言环境中,Siamese网络的实现可以通过Lua的深度学习库,如Torch/LuaTorch,来构建。Torch/LuaTorch是一个强大的科学计算框架,它支持GPU加速,广泛应用于机器学习和深度学习领域。通过这个框架,开发者可以使用Lua语言定义模型结构、配置训练过程、执行前向和反向传播算法等。 资源的文件名称列表中的“siamese_network-master”暗示了一个主分支,它可能包含模型定义、训练脚本、测试脚本等。这个主分支中的代码结构可能包括以下部分: 1. 数据加载器(data_loader): 负责加载MNIST数据集并将图像对输入到网络中。 2. 模型定义(model.lua): 定义Siamese网络的结构,包括两个并行的子网络以及最后的相似性度量层。 3. 训练脚本(train.lua): 包含模型训练的过程,如前向传播、损失计算、反向传播和参数更新。 4. 测试脚本(test.lua): 用于评估训练好的模型在验证集或者测试集上的性能。 5. 配置文件(config.lua): 包含了网络结构和训练过程的超参数设置,如学习率、批量大小等。 Siamese网络在实际应用中可以广泛用于各种需要比较两个输入相似性的场合,例如医学图像分析、安全验证系统等。通过本资源中的示例,开发者可以深入理解Siamese网络的工作原理,并在自己的项目中实现类似的网络结构来解决实际问题。"
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

L2正则化的终极指南:从入门到精通,揭秘机器学习中的性能优化技巧

![L2正则化的终极指南:从入门到精通,揭秘机器学习中的性能优化技巧](https://img-blog.csdnimg.cn/20191008175634343.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTYxMTA0NQ==,size_16,color_FFFFFF,t_70) # 1. L2正则化基础概念 在机器学习和统计建模中,L2正则化是一个广泛应用的技巧,用于改进模型的泛化能力。正则化是解决过拟
recommend-type

如何构建一个符合GB/T19716和ISO/IEC13335标准的信息安全事件管理框架,并确保业务连续性规划的有效性?

构建一个符合GB/T19716和ISO/IEC13335标准的信息安全事件管理框架,需要遵循一系列步骤来确保信息系统的安全性和业务连续性规划的有效性。首先,组织需要明确信息安全事件的定义,理解信息安全事态和信息安全事件的区别,并建立事件分类和分级机制。 参考资源链接:[信息安全事件管理:策略与响应指南](https://wenku.csdn.net/doc/5f6b2umknn?spm=1055.2569.3001.10343) 依照GB/T19716标准,组织应制定信息安全事件管理策略,明确组织内各个层级的角色与职责。此外,需要设置信息安全事件响应组(ISIRT),并为其配备必要的资源、
recommend-type

Angular插件增强Application Insights JavaScript SDK功能

资源摘要信息:"Microsoft Application Insights JavaScript SDK-Angular插件" 知识点详细说明: 1. 插件用途与功能: Microsoft Application Insights JavaScript SDK-Angular插件主要用途在于增强Application Insights的Javascript SDK在Angular应用程序中的功能性。通过使用该插件,开发者可以轻松地在Angular项目中实现对特定事件的监控和数据收集,其中包括: - 跟踪路由器更改:插件能够检测和报告Angular路由的变化事件,有助于开发者理解用户如何与应用程序的导航功能互动。 - 跟踪未捕获的异常:该插件可以捕获并记录所有在Angular应用中未被捕获的异常,从而帮助开发团队快速定位和解决生产环境中的问题。 2. 兼容性问题: 在使用Angular插件时,必须注意其与es3不兼容的限制。es3(ECMAScript 3)是一种较旧的JavaScript标准,已广泛被es5及更新的标准所替代。因此,当开发Angular应用时,需要确保项目使用的是兼容现代JavaScript标准的构建配置。 3. 安装与入门: 要开始使用Application Insights Angular插件,开发者需要遵循几个简单的步骤: - 首先,通过npm(Node.js的包管理器)安装Application Insights Angular插件包。具体命令为:npm install @microsoft/applicationinsights-angularplugin-js。 - 接下来,开发者需要在Angular应用的适当组件或服务中设置Application Insights实例。这一过程涉及到了导入相关的类和方法,并根据Application Insights的官方文档进行配置。 4. 基本用法示例: 文档中提到的“基本用法”部分给出的示例代码展示了如何在Angular应用中设置Application Insights实例。示例中首先通过import语句引入了Angular框架的Component装饰器以及Application Insights的类。然后,通过Component装饰器定义了一个Angular组件,这个组件是应用的一个基本单元,负责处理视图和用户交互。在组件类中,开发者可以设置Application Insights的实例,并将插件添加到实例中,从而启用特定的功能。 5. TypeScript标签的含义: TypeScript是JavaScript的一个超集,它添加了类型系统和一些其他特性,以帮助开发更大型的JavaScript应用。使用TypeScript可以提高代码的可读性和可维护性,并且可以利用TypeScript提供的强类型特性来在编译阶段就发现潜在的错误。文档中提到的标签"TypeScript"强调了该插件及其示例代码是用TypeScript编写的,因此在实际应用中也需要以TypeScript来开发和维护。 6. 压缩包子文件的文件名称列表: 在实际的项目部署中,可能会用到压缩包子文件(通常是一些JavaScript库的压缩和打包后的文件)。在本例中,"applicationinsights-angularplugin-js-main"很可能是该插件主要的入口文件或者压缩包文件的名称。在开发过程中,开发者需要确保引用了正确的文件,以便将插件的功能正确地集成到项目中。 总结而言,Application Insights Angular插件是为了加强在Angular应用中使用Application Insights Javascript SDK的能力,帮助开发者更好地监控和分析应用的运行情况。通过使用该插件,可以跟踪路由器更改和未捕获异常等关键信息。安装与配置过程简单明了,但是需要注意兼容性问题以及正确引用文件,以确保插件能够顺利工作。
recommend-type

"互动学习:行动中的多样性与论文攻读经历"

多样性她- 事实上SCI NCES你的时间表ECOLEDO C Tora SC和NCESPOUR l’Ingén学习互动,互动学习以行动为中心的强化学习学会互动,互动学习,以行动为中心的强化学习计算机科学博士论文于2021年9月28日在Villeneuve d'Asq公开支持马修·瑟林评审团主席法布里斯·勒菲弗尔阿维尼翁大学教授论文指导奥利维尔·皮耶昆谷歌研究教授:智囊团论文联合主任菲利普·普雷教授,大学。里尔/CRISTAL/因里亚报告员奥利维耶·西格德索邦大学报告员卢多维奇·德诺耶教授,Facebook /索邦大学审查员越南圣迈IMT Atlantic高级讲师邀请弗洛里安·斯特鲁布博士,Deepmind对于那些及时看到自己错误的人...3谢谢你首先,我要感谢我的两位博士生导师Olivier和Philippe。奥利维尔,"站在巨人的肩膀上"这句话对你来说完全有意义了。从科学上讲,你知道在这篇论文的(许多)错误中,你是我可以依