Tag: openssl

如何从X509中删除扩展程序?

我正在创建一个api来修改C中的X509证书,我想添加一种删除扩展的方法(例如subjectNameAlt )。 我如何通过OpenSSL API执行此操作?

在OS X 10.7上使用gcc的OpenSSL

我在OS X 10.7上使用TextEdit和gcc来制作小型终端程序。 我正在尝试学习如何编写OpenSSL,但我正在编写剧集(由于已弃用的问题 – 更多内容)。 我已经用Google搜索并搜索了所有内容,但我读到的所有内容都是2011年之前(当问题出现时),特定于iOS(我正在为OS X编程但尝试独立于平台)或谈论使用XCode(我没有 – 我更喜欢TextEdit)。 任何人都可以指出如何使用gcc在OS X上安装OpenSSL程序的简单,一步一步的正确方向? 为了记录,这是我采取的确切步骤: 通过macports安装OpenSSL ‘openssl version’返回“OpenSSL 1.0.1e 2013年2月11日” 我正在尝试编译此文件: http : //saju.net.in/code/misc/openssl_aes.c.txt 我已经改名为’aes.c’而我正在使用’gcc -o aes aes.c’ 我尝试了以下标志(没有结果):-lcrypto,lssl,-Wno-error = deprecated-declarations 我从gcc获得的具体输出如下: Brads-MacBook-Air:Desktop brad$ gcc -o aes aes.c -lssl -lcrypto -Wno-error=deprecated-declarations aes.c: In function ‘aes_init’: aes.c:30: warning: ‘EVP_BytesToKey’ is deprecated (declared at /usr/include/openssl/evp.h:572) aes.c:30: warning: ‘EVP_aes_256_cbc’ is […]

使用KEY的Openssl / libcrypto AES 128编码

我正在使用AES-128-ECB加密某个字符串,然后将结果保存在文件中,例如test.enc这是我执行加密的方法: int do_crypt(char *outfile) { unsigned char outbuf[1024]; int outlen, tmplen; unsigned char key[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}; char intext[] = “Some Text”; EVP_CIPHER_CTX ctx; FILE *out; EVP_CIPHER_CTX_init(&ctx); EVP_EncryptInit_ex(&ctx, EVP_aes_128_ecb(), NULL, key, NULL); if(!EVP_EncryptUpdate(&ctx, outbuf, &outlen, intext, strlen(intext))) { /* Error */ return 0; } /* Buffer passed to EVP_EncryptFinal() must be after data just * encrypted […]

EVP读取PEM私钥不能正常工作

当我运行以下代码生成密钥时,将其写入字符串,将其打印出来,将其读入密钥,然后再次打印,对OpenSSL_1_0_2e : #include #include #include #include #include #define RSA_KEYLEN 2048 int main() { // Key generation EVP_PKEY_CTX *ctx = EVP_PKEY_CTX_new_id(EVP_PKEY_RSA, NULL); EVP_PKEY* key = NULL; EVP_PKEY_keygen_init(ctx); EVP_PKEY_CTX_set_rsa_keygen_bits(ctx, RSA_KEYLEN); EVP_PKEY_keygen(ctx, &key); EVP_PKEY_CTX_free(ctx); // Serialize to string unsigned char* keyStr; BIO *bio = BIO_new(BIO_s_mem()); PEM_write_bio_PrivateKey(bio, key, NULL, NULL, 0, 0, NULL); int priKeyLen = BIO_pending(bio); keyStr = […]

Visual Studio使用下划线前缀为符号构建OpenSSL

我正在尝试向Visual Studio 2013中添加一个项目,该项目将在Visual Studio GUI中构建OpenSSL。 我正在使用“makefile”项目设置作为起点。 我已经成功地在Visual Studio命令行窗口上构建OpenSSL,并且它可以工作。 但是,当我尝试使用我在命令行中使用的完全相同的命令通过项目构建OpenSSL时,我得到链接错误(LNK2001)。 使用dumpbin查看生成的.lib文件,我看到当我通过GUI构建OpenSSL时,下划线(’_’)会附加到所有导出(因此,一个名为BIO_read的函数将变为_BIO_read )。 微软有关于LNK2001的说法: https ://msdn.microsoft.com/en-us/library/f6xx1b1z.aspx ? f = 255 & MSPPError = -2147217396 具体来说,它说: 当符号未解析时,您可以通过以下准则获取有关该function的信息: 在x86平台上,用C编译的名称或C ++中的extern“C”名称的调用约定装饰是: __cdecl 函数具有下划线(_)前缀。 我认为使用稍微不同的参数调用cl会使它发出下划线前缀,但我无法弄清楚究竟有什么不同 – 命令行没有区别,如果环境变量存在差异,我找不到一个相关的。 有什么想法在这里发生了什么?

具有直接呼叫和间接呼叫的Openssl线程安全回调函数注册

我正在Linux中编写一个C库(比方说,libA),它利用Openssl来执行base64编解码器,哈希等。其他一些项目(例如projB)利用libA来做某事,而这些项目本身也调用了Openssl API。 因此,projB以两种方式调用Openssl API: 直接调用Openssl API:projB – > Openssl 间接调用Openssl API:projB – > libA – > Openssl 同时,它正式宣布 Openssl不是线程安全的,除非在Openssl中注册了至少两个回调函数: void ssl_locking_function(int mode,int n,const char * file,int line) unsigned long ssl_threadid_function() libA向projB公开以下API: int InitA(无效) int ActionStuff() void DestroyA() 为了确保Openssl的线程安全,有两个解决方案: #1。 libA在InitA()中将回调函数注册到Openssl中 #2。 在调用libA API之前,projB在初始化时将回调函数注册到Openssl中,并且libA不进行回调注册 对于解决方案#1,libA本身是线程安全的,关于调用Openssl API。 但是,projB还必须确保其线程安全性,并且它将采取类似的操作将回调函数注册到Openssl中。 假设libA注册以下回调函数 void ssl_locking_function_A(int mode,int n,const char * file,int line) […]

如何为RSA / AES加密生成密码

我想通过套接字发送使用RSA加密的大数据。 我用openssl和c 。 由于RSA解密速度很慢,我首先使用通用和直接的方式使用AES加密数据,然后使用RSA加密使用的AES密码。 然后我通过套接字发送AES加密数据和RSA加密密码,并以相反的方式进行加密。 我使用AES进行AES加密: EVP_CIPHER_CTX en; unsigned char password[65]; int i, x = 0; unsigned char key[32], iv[32]; unsigned char *ciphertext; i = dataLength + AES_BLOCK_SIZE -1; ciphertext = (unsigned char *)malloc(i); EVP_CIPHER_CTX_init(&en); EVP_EncryptInit_ex(&en, EVP_aes_256_cbc(), NULL, key, iv); EVP_EncryptUpdate(&en, ciphertext, &i, (unsigned char*)data, dataLength); EVP_EncryptFinal_ex(&en, ciphertext+i, &x); 但是如何安全地创建key和iv ? 现在我使用以下function: EVP_BytesToKey(EVP_aes_256_cbc(), EVP_sha1(), salt, […]

如何在C中复制SHA512哈希

我有以下代码来计算sha512哈希: #include #include #include int main() { char *password = “test”; char hash[SHA512_DIGEST_LENGTH]; SHA512(password, strlen(password), hash); return 0; } 如何以hex打印出计算出的哈希值? 谢谢

RSA_private_encrypt总是失败

我正在学习在我的程序中使用OpenSSL库。 在代码中我生成一个私钥,我立即使用该密钥加密消息。 但总是失败。 请帮助我。 private_key = RSA_generate_key(RSA_KEY_LENGTH, RSA_3, NULL, NULL); if (RSA_check_key(private_key) < 1) { printf("generate_key: key generation failed\n"); exit(-1); } unsigned char msg[25]; unsigned char cipher[128]; strcpy((char*)msg, "hello"); int ret = RSA_private_encrypt(25, msg, cipher, private_key, RSA_PKCS1_OAEP_PADDING); if (ret < 0) { printf("encryption in key generation failed\n"); printf ("%s\n", ERR_error_string (ERR_get_error (), (char *) cipher)); […]

OpenSSL的BN_bn2binfunction出现问题

我正在尝试在OpenSSL中使用BN_ *函数。 具体来说,我有以下代码: #import BIGNUM * num = BN_new(); BN_set_word(num, 42); char * buffer = malloc((BN_num_bytes(num)+1) * sizeof(char)); buffer[BN_num_bytes(num)] = ‘\0’; int len = BN_bn2bin(num, buffer); printf(“42 in binary is %s\n”, buffer); 但是,当我这样做时,我没有得到一串零和一个零。 相反,它打印”42 in binary is *” 。 据我所知,从网上可用的非常有限的例子我已经比较过这个例子,我已经正确地实现了这一点。 任何想法为什么它不起作用?