Tag: openssl

从EVP_PKEY密钥对中提取公钥?

我正在使用OpenSSL的高级EVP_*()函数在我的应用程序中实现加密/解密方案,因此我可以轻松切换所使用的实际算法,而无需更改API调用。 我可以相对轻松地创建一个密钥对 : // dumbed down, no error checking for brevity EVP_PKEY * pkey; // can change EVP_PKEY_RSA to something else here EVP_PKEY_CTX * context = EVP_PKEY_CTX_new_id( EVP_PKEY_RSA, NULL ); EVP_PKEY_keygen_init( ctx ); // could set parameters here EVP_PKEY_keygen( context, &pkey ); // … EVP_PKEY_CTX_free( context ); pkey现在拥有一对密钥,即密钥和公钥。 这对事物的秘密方面来说很好,但显然我想只提取公共关键组件以供公共方面使用。 我能够找到特定于RSA的函数 ,但没有使用高级EVP_*() API。 救命?

未调用SSL_CTX_set_tlsext_servername_callback回调函数

我正在编写一个https服务器,我需要在使用SNI的ssl_accept()之前从客户端获取主机名。 我使用SSL_CTX_set_tlsext_servername_callback()来接收主机名,但根本不会调用回调。 这是我的代码的一部分 // Server Name Indication callback from OpenSSL static int serverNameCallback(SSL *ssl, int *ad, void *arg) { if (ssl == NULL) return SSL_TLSEXT_ERR_NOACK; const char* servername = SSL_get_servername(ssl, TLSEXT_NAMETYPE_host_name); printf(“ServerName: %s\n”, servername); } int main() { //some code const SSL_METHOD *method; SSL_CTX *ctx; method = SSLv3_server_method(); ctx = SSL_CTX_new(method); if ( ctx == […]

如何以编程方式从证书中提取信息?

我有一个生成的证书,但我希望能够从证书中提取信息,例如国家,有效性,公钥等。 我必须将从证书中重新获得的这些信息与我在C程序中存储的其他信息进行比较。 我知道如果我使用这样的函数,它会打印出证书信息: void print_certificate(const char* cert) { X509 *x509 = NULL; BIO *i = BIO_new(BIO_s_file()); BIO *o = BIO_new_fp(stdout,BIO_NOCLOSE); if((BIO_read_filename(i, cert) <= 0) || ((x509 = PEM_read_bio_X509_AUX(i, NULL, NULL, NULL)) == NULL)) { printf("Bad certificate, unable to read\n"); } X509_print_ex(o, x509, XN_FLAG_COMPAT, X509_FLAG_COMPAT); if(x509) X509_free(x509); } 但我想要的只是信息的某些部分。 怎么做到呢? 谢谢

MD5 HMAC与OpenSSL

我试图用OpenSSL生成MD5 HMAC并且大部分代码都是借用的。 生成的hmac不正确: #include #include #include #include #include #include #include #include #include #include int main() { unsigned char* key = (unsigned char*) “2012121220121212201212122012121220121212201212122012121220121212”; unsigned char* data = (unsigned char*) “johndoejohndoejohndoejohndoejohndoejohndoejohndoejohndoejohndoejohndoejohndoejohndoe”; unsigned char* expected = (unsigned char*) “abcd1d87dca34f334786307d0da4fcbd”; unsigned char* result; // unsigned int result_len = 16; unsigned int result_len = 16; int i; static char […]

如何在C ++中使用openssl / md5来加密字符串?

我需要在我的程序中将md5中的字符串加密。 有一个lib openssl,但我是一个新手。 如何使用它来加密一个字符串,哪里可以找到一个好的doc,教我如何使用这个lib,还有其他函数如aes? 我试过这段代码: int main() { unsigned char result[MD5_DIGEST_LENGTH]; const unsigned char* str; str = (unsigned char*)”hello”; unsigned int long_size = 100; MD5(str,long_size,result); } 但是编译器告诉我:未定义的MD5引用。 为什么MD5有未定义的引用?

如何将OpenSSL与emscripten相关联?

我正在尝试编译一些使用OpenSSL和emscripten的C代码,但是我得到了未解决的符号警告,例如: warning: unresolved symbol: SHA256_Init warning: unresolved symbol: SHA256_Final warning: unresolved symbol: SHA256_Update 我使用这个命令编译代码: emcc SHA256.c -lssl -lcrypto -L /usr/local/openssl-1.0.2k/lib/ -I /usr/local/openssl-1.0.2k/include -s WASM=1 -o SHA256.html –emrun 使用以下源代码 #include #include #include #include #include #include void sha256(char *string, char outputBuffer[65]) { unsigned char hash[SHA256_DIGEST_LENGTH]; SHA256_CTX sha256; SHA256_Init(&sha256); SHA256_Update(&sha256, string, strlen(string)); SHA256_Final(hash, &sha256); int i = 0; […]

OpenSSL RSA:无法加密/解密长度超过16个字节的消息

我正在研究一个使用OpenSSL进行基本RSA加密和解密的简单程序。 它对于小消息(<16字节)工作正常,但对于任何事情都失败了。 我知道公钥加密的局限性在于您无法加密任何比密钥大小更长的内容。 在我的情况下,我使用的是1024位密钥,因此我应该使用128字节(由于填充可能会略微减少),对吗? 如果是这样,那不是我正在经历的。 这是我的程序的输出,有15个字节: Generating RSA keypair…done. Message to encrypt: 0123456789ABCDE 16 bytes encrypted Decrypted message: 0123456789ABCDE 并且有16个字节: Generating RSA keypair…done. Message to encrypt: 0123456789ABCDEF 16 bytes encrypted 140153837057696:error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt:evp_enc.c:467: Decrypted message: (null) 似乎无论如何,只加密了16个字节。 我的加密function(通过修复更新): unsigned char* rsa_seal(EVP_PKEY *pub_key, unsigned char *msg, size_t **enc_msg_len, unsigned char **sym_key, int *sym_key_len, unsigned char […]

EDH-RSA-DES-CBC3-SHA的“无共享密码”错误

我想用密码EDH-RSA-DES-CBC3-SHA测试TLS 1.0连接。 我用openssl s_server和s_client测试。 工作良好。 连接和数据交换都很好。 openssl s_server -accept 4433 -cert server.pem -key serverkey.pem -cipher EDH-RSA-DES-CBC3-SHA -tls1 openssl s_client -connect 127.0.0.1:443 -cipher EDH-RSA-DES-CBC3-SHA -tls1 共享密码:EDH-RSA-DES-CBC3-SHA 现在,我有另一个简单的OpenSSL服务器代码。 使用this和s_client连接失败,服务器抛出以下内容: 3077613304:错误:1408A0C1:SSL例程:SSL3_GET_CLIENT_HELLO:无共享密码:s3_srvr.c:1361 我检查s_server / s_client使用的库和我的服务器应用程序使用的库是否相同如下: cat /proc/9515/maps | awk ‘{print $6}’ | grep ‘\.so’ | sort | uniq | grep -e ssl -e libcrypto /usr/lib/libcrypto.so.1.0.1e /usr/lib/libssl.so.1.0.1e 但是, 对于像AES128-SHA这样的其他密码,从s_client到我的服务器应用程序的连接也没问题。 以下是我在服务器代码中设置ctx […]

我的加密安全是openPGP / SMIME吗?

我正在尝试在更大的项目中编写一个简单的文件加密/解密。 由于许可证问题,我想避免使用libgpgme。 openPGP标准是复杂的项目时间框架。 我想用openssl做我的加密东西。 现在我实现了以下内容: 加密(pseude代码): RAND_bytes(aes_key) RAND_bytes(aes_salt) EVP_BytesToKey(EVP_aes_256_cbc(), EVP_sha1(), (const unsigned char *)aes_salt, aes_key, sizeof(aes_key), 5, key, iv); 然后我aes256我的数据 EVP_EncryptInit_ex(&e_ctx, EVP_aes_256_cbc(), NULL, key, iv); 然后我用RSA加密密钥和iv RSA_public_encrypt(flen, (unsigned char *)key, encryptedKey, rsa, RSA_PKCS1_PADDING ); RSA_public_encrypt(flen, (unsigned char *)iv, encryptedIV, rsa, RSA_PKCS1_PADDING ); 然后我将128位密钥和iv保存在我文件的“顶部”(256Bytes标题)。 解密: – >读取前256字节(拆分为密钥和iv) – >解密密钥和iv用本地RSA私钥(当然RSA私钥不在文件中) – >使用密钥和iv解密数据 我对那段代码安全吗?

具有ECDHE密钥和证书的服务器无法正常工作

我使用下面的server.c源码,我生成了 有罪的宿主cert.pem 罪孽深重,host.key 如下所述: 椭圆曲线CA指南 运行程序时会出现以下错误: 140722397161136:错误:10071065:椭圆曲线例程:func(113):reason(101):ec_lib.c:995:140722397161136:错误:0B080075:x509证书例程:func(128):reason(117):x509_cmp.c: 346: 我编译使用: gcc server.c -ldl -lcrypto -lssl -o Server 我认为错误发生在这一行 if (SSL_CTX_use_PrivateKey_file(ctx, KeyFile, SSL_FILETYPE_PEM) <= 0) server.c #include #include #include #include #include #include #include #include #include #include “openssl/ssl.h” #include “openssl/err.h” #define FAIL -1 int OpenListener(int port) { int sd; struct sockaddr_in addr; sd = socket(PF_INET, SOCK_STREAM, 0); bzero(&addr, […]