×

openssl加密照片demo

openssl加密照片demo(如何用C语言来使用openssl rsa进行公钥加密,已有公钥和明文)

admin admin 发表于2024-07-28 12:34:10 浏览7 评论0

抢沙发发表评论

大家好,今天小编来为大家解答以下的问题,关于openssl加密照片demo,如何用C语言来使用openssl rsa进行公钥加密,已有公钥和明文这个很多人还不知道,现在让我们一起来看看吧!

本文目录

如何用C语言来使用openssl rsa进行公钥加密,已有公钥和明文

1. 本程序使用2048位密钥对,每次加密时,原始数据的最大长度为245字节,加密后的密文长度为256字节.(采用打PADDING 的加密方式)2. 如果所加密数据长度大于245字节,请分多次加密,后将密文按顺序存储;解密时,每次读取256字节,进行解密,将解密后的数据依次按顺序存储,即可还原原始数据.#include 《stdio.h》#include 《stdlib.h》#include 《string.h》#include 《errno.h》#include 《openssl/rsa.h》#include 《openssl/pem.h》#include 《openssl/err.h》#define OPENSSLKEY "test.key"#define PUBLICKEY "test_pub.key"#define BUFFSIZE 1024char *my_encrypt(char *str, char *path_key); //加密char *my_decrypt(char *str, char *path_key); //解密int main(void){char *source = "i like dancing !!!";char *ptf_en, *ptf_de;printf("source is :%s\n", source);//1.加密ptf_en = my_encrypt(source, PUBLICKEY);if (ptf_en == NULL){return 0;}else{printf("ptf_en is :%s\n", ptf_en);}//2.解密ptf_de = my_decrypt(ptf_en, OPENSSLKEY);if (ptf_de == NULL){return 0;}else{printf("ptf_de is :%s\n", ptf_de);}if(ptf_en) free(ptf_en);if(ptf_de) free(ptf_de);return 0;}//加密char *my_encrypt(char *str, char *path_key){char *p_en = NULL;RSA *p_rsa = NULL;FILE *file = NULL;int lenth = 0; //flen为源文件长度, rsa_len为秘钥长度//1.打开秘钥文件if((file = fopen(path_key, "rb")) == NULL){perror("fopen() error 111111111 ");goto End;} //2.从公钥中获取 加密的秘钥if((p_rsa = PEM_read_RSA_PUBKEY(file, NULL,NULL,NULL )) == NULL){ERR_print_errors_fp(stdout);goto End;}lenth = strlen(str);p_en = (char *)malloc(256);if(!p_en){perror("malloc() error 2222222222");goto End;} memset(p_en, 0, 256);//5.对内容进行加密if(RSA_public_encrypt(lenth, (unsigned char*)str, (unsigned char*)p_en, p_rsa, RSA_PKCS1_PADDING) 《 0){perror("RSA_public_encrypt() error 2222222222");goto End;}End://6.释放秘钥空间, 关闭文件if(p_rsa) RSA_free(p_rsa);if(file) fclose(file);return p_en;} //解密char *my_decrypt(char *str, char *path_key){char *p_de = NULL;RSA *p_rsa = NULL;FILE *file = NULL;//1.打开秘钥文件file = fopen(path_key, "rb");if(!file){perror("fopen() error 22222222222");goto End;} //2.从私钥中获取 解密的秘钥if((p_rsa = PEM_read_RSAPrivateKey(file, NULL,NULL,NULL )) == NULL){ERR_print_errors_fp(stdout);goto End;}p_de = (char *)malloc(245);if(!p_de){perror("malloc() error ");goto End;} memset(p_de, 0, 245);//5.对内容进行加密if(RSA_private_decrypt(256, (unsigned char*)str, (unsigned char*)p_de, p_rsa, RSA_PKCS1_PADDING) 《 0){perror("RSA_public_encrypt() error ");goto End;}End://6.释放秘钥空间, 关闭文件if(p_rsa) RSA_free(p_rsa);if(file) fclose(file);return p_de;}

iOS使用openSSL加密应该怎么做

使用VS2005下的Visual Studio 2005 Command Prompt进入控制台模式(这个模式会自动设置各种环境变量) 、解压缩openssl的包,进入openssl的目录 、perl configure VC-WIN32 尽量在这个目录下执行该命令,否则找不到Configure文件,或者指定完整的Configure文件路径。 、ms\do_ms 在解压目录下执行ms\do_ms命令 、nmake -f ms\ntdll.mak编译后在openssl解压目录下执行,完成编译后。输出的文件在out32dll里面,包括应用程序的可执行文件、lib文件和dll文件 注意:在运行第五步时,cl编译器会抱怨说.\crypto\des\enc_read.c文件的read是The POSIX name for this item is deprecated(不被推荐的),建议使用_read。呵呵,我可不想将OpenSSL中的所有的read函数修改为_read。再看cl的错误代码 error C2220,于是上MSDN上查找: warning treated as error - no object file generated /WX tells the compiler to treat all warnings as errors. Since an error occurred, no object or executable file was generated. 是由于设置了/WX选项,将所有的警告都作为错误对待,所以。。。 于是打开OpenSSL目录下的MS目录下的ntdll.mak文件,将CFLAG的/WX选项去掉,存盘。

调用openssl中的evp.h加密解密中出的问题

我没用过这个语言,所以解答的可能不太正确。以下我只是建议(以下是基于我编程时的经验说的,有可能由于语言上的差异造成疑问。)首先问几个问题:"将src中原文读入数组in中"文件应该是字节集吧你用数组做什么呢?这些是你的代码中的一些涉及到16的代码:1、//key为16字节2、for(i=0;i《16;i++)这个可能是算法上的问题。至于写入代码,没看到什么引起异常的东西。解决:(假设以上判断正确,因为你的程序只要不加密16的整数倍大小文件就没错。)你可以试试一个双向判断加密时如果正好是16的整数倍在文件头或文件尾加入某些多余数据。解密时分析是否曾经加入过数据并在解密前将文件还原这只代表我个人观点 我不是专家我也只是建议……

请问有没有c或c加加的openssl的rsa分段加密例子demo超过117个字节的明文

#include《stdio.h》#include《stdlib.h》#include《string.h》#include《openssl/rsa.h》#include《openssl/engine.h》int main(int argc, char* argv){   printf("openssl_test begin\n");   RSA* rsa=NULL;   char originstr="hello\n";   //这是我们需要加密的原始数据   //allocate RSA structure,首先需要申请一个RSA结构题用于存放生成的公私钥,这里rsa就是这个结构体的指针   rsa = RSA_new();   if(rsa==NULL)    {         printf("RSA_new failed\n");                   return -1;    }    //generate RSA keys   BIGNUM* exponent;    exponent = BN_new();        //生成RSA公私钥之前需要选择一个奇数(odd number)来用于生成公私钥    if(exponent ==NULL)    {       printf("BN_new failed\n");        goto FAIL1;    }    if(0==BN_set_word(exponent,65537))    //这里选择奇数65537    {      printf("BN_set_word failed\n");       goto FAIL1;    }            //这里modulus的长度选择4096,小于1024的modulus长度都是不安全的,容易被破解    if(0==RSA_generate_key_ex(rsa,4096,exponent,NULL))      {       printf("RSA_generate_key_ex failed\n");        goto FAIL;          }    char* cipherstr = NULL;    //分配一段空间用于存储加密后的数据,这个空间的大小由RSA_size函数根据rsa算出    cipherstr = malloc(RSA_size(rsa));     if(cipherstr==NULL)    {       printf("malloc cipherstr buf failed\n");       goto FAIL1;    }   //下面是实际的加密过程,最后一个参数padding type,有以下几种。    /*RSA_PKCS1_PADDINGPKCS #1 v1.5 padding. This currently is the most widely used mode.RSA_PKCS1_OAEP_PADDINGEME-OAEP as defined in PKCS #1 v2.0 with SHA-1, MGF1 and an empty encoding parameter. This mode is recommended for all new applications.RSA_SSLV23_PADDINGPKCS #1 v1.5 padding with an SSL-specific modification that denotes that the server is SSL3 capable.RSA_NO_PADDINGRaw RSA encryption. This mode should only be used to implement cryptographically sound padding modes in the application code. Encrypting user data directly with RSA is insecure.*/    //这里首先用公钥进行加密,选择了RSA_PKCS1_PADDING  if(RSA_size(rsa)!=RSA_public_encrypt(strlen(originstr)+1,originstr,cipherstr,rsa,RSA_PKCS1_PADDING))    {       printf("encryption failure\n");        goto FAIL2;    }    printf("the original string is %s\n",originstr);    printf("the encrypted string is %s\n",cipherstr);    //Now, let’s decrypt the string with private key    //下面来用私钥解密,首先需要一个buffer用于存储解密后的数据,这个buffer的长度要足够(小于RSA_size(rsa))    //这里分配一个长度为250的字符数组,应该是够用的。    char decrypted_str;    int decrypted_len;    if(-1=(decrypted_len=RSA_private_decrypt(256,cipherstr,decrypted_str,rsa,RSA_PKCS1_PADDING)))    {       printf("decryption failure\n");        goto FAIL2;    }    printf("decrypted string length is %d,decryped_str is %s\n",decrypted_len,decrypted_str);FAIL2:      free(cipherstr);FAIL1:    BN_free(exponent);FAIL:   RSA_free(rsa);   return 0;}以上是源代码,下面使用下面的编译命令在源码所在路径下生成可执行文件    gcc *.c -o openssl_test -lcrypto -ldl -L/usr/local/ssl/lib -I/usr/local/ssl/include其中,-lcrypto和-ldl是必须的,前者是OpenSSL中的加密算法库,后者是用于成功加载动态库。

求用OpenSSL做的RSA文件加密程序实例,VC++6.0的,各位大侠帮帮忙,急用呀,多谢啦

#include 《openssl/rsa.h》 #include 《openssl/sha.h》 int main() { RSA *r; int bits=1024,ret,len,flen,padding,i; unsigned long e=RSA_3; BIGNUM *bne; unsigned char*key,*p; BIO *b; unsigned charfrom; bne=BN_new(); ret=BN_set_word(bne,e); r=RSA_new(); ret=RSA_generate_key_ex(r,bits,bne,NULL); if(ret!=1) { printf("RSA_generate_key_ex err!\n"); return -1; } /* 私钥i2d */ b=BIO_new(BIO_s_mem()); ret=i2d_RSAPrivateKey_bio(b,r); key=malloc(1024); len=BIO_read(b,key,1024); BIO_free(b); b=BIO_new_file("rsa.key","w"); ret=i2d_RSAPrivateKey_bio(b,r); BIO_free(b); /* 私钥d2i */ /* 公钥i2d */ /* 公钥d2i */ /* 私钥加密 */ flen=RSA_size(r); printf("please select private enc padding : \n"); printf("1.RSA_PKCS1_PADDING\n"); printf("3.RSA_NO_PADDING\n"); printf("5.RSA_X931_PADDING\n"); scanf("%d",&padding); if(padding==RSA_PKCS1_PADDING) flen-=11; else if(padding==RSA_X931_PADDING) flen-=2; else if(padding==RSA_NO_PADDING) flen=flen; else { printf("rsa not surport !\n"); return -1; } for(i=0;i《flen;i++) memset(&from,i,1); len=RSA_private_encrypt(flen,from,to,r,padding); if(len《=0) { printf("RSA_private_encrypt err!\n"); return -1; } len=RSA_public_decrypt(len,to,out,r,padding); if(len《=0) { printf("RSA_public_decrypt err!\n"); return -1; } if(memcmp(from,out,flen)) { printf("err!\n"); return -1; } /* */ printf("please select public enc padding : \n"); printf("1.RSA_PKCS1_PADDING\n"); printf("2.RSA_SSLV23_PADDING\n"); printf("3.RSA_NO_PADDING\n"); printf("4.RSA_PKCS1_OAEP_PADDING\n"); scanf("%d",&padding); flen=RSA_size(r); if(padding==RSA_PKCS1_PADDING) flen-=11; else if(padding==RSA_SSLV23_PADDING) flen-=11; else if(padding==RSA_X931_PADDING) flen-=2; else if(padding==RSA_NO_PADDING) flen=flen; else if(padding==RSA_PKCS1_OAEP_PADDING) flen=flen-2 * SHA_DIGEST_LENGTH-2 ; else { printf("rsa not surport !\n"); return -1; } for(i=0;i《flen;i++) memset(&from,i+1,1); len=RSA_public_encrypt(flen,from,to,r,padding); if(len《=0) { printf("RSA_public_encrypt err!\n"); return -1; } len=RSA_private_decrypt(len,to,out,r,padding); if(len《=0) { printf("RSA_private_decrypt err!\n"); return -1; } if(memcmp(from,out,flen)) { printf("err!\n"); return -1; } printf("test ok!\n"); RSA_free(r); return 0; }上述程序中当采用公钥RSA_SSLV23_PADDING加密,用私钥RSA_SSLV23_PADDING解密时会报错,原因是openssl源代码错误: rsa_ssl.c函数RSA_padding_check_SSLv23有: if (k == -1) /* err */ { RSAerr(RSA_F_RSA_PADDING_CHECK_SSLV23,RSA_R_SSLV3_ROLLBACK_ATTACK); return (-1); }修改为k!=-1即可。各种padding对输入数据长度的要求:私钥加密: RSA_PKCS1_PADDING RSA_size-11 RSA_NO_PADDING RSA_size-0 RSA_X931_PADDING RSA_size-2公钥加密 RSA_PKCS1_PADDING RSA_size-11 RSA_SSLV23_PADDING RSA_size-11 RSA_X931_PADDING RSA_size-2 RSA_NO_PADDING RSA_size-0 RSA_PKCS1_OAEP_PADDING RSA_size-2 * SHA_DIGEST_LENGTH-2

如何使用Openssl,已经有Key文件,如何使用这个文件进行加密和解密

个东西,我这边需要将一个字符串加密以后传递给第三方公司提供的jsp页面。加密方式是第三方提供一个Key文件,就像银行网银用的文件证书一样,使用RSA方式加密的。现在第三方公司给我了两个文件:server.cer和test.pfx。 他们给的ReadME文件内容如下:p ,可以用于解密和加密两个功能。cer里只包含公

openssl提供 DES_ecb3_encrypt方法

一. 利用openssl命令进行BASE64编码解码(base64 encode/decode) 1. BASE64编码命令 对字符串‘abc’进行base64编码: # echo abc | openssl base64 YWJjCg== (编码结果) 如果对一个文件进行base64编码(文件名t.txt): # openssl base64 -in t.txt 2. BASE64解码命令 求base64后的字符串‘YWJjCg==’的原文: # echo YWJjCg== | openssl base64 -d abc (解码结果) 如果对一个文件进行base64解码(文件名t.base64): # openssl base64 -d -in t.base64二. 利用openssl命令进行md5/sha1摘要(digest) 1. 对字符串‘abc’进行md5摘要计算:echo abc | openssl md5 若对某文件进行md5摘要计算:openssl md5 -in t.txt 2. 对字符串‘abc’进行sha1摘要计算:echo abc | openssl sha1 若对某文件进行sha1摘要计算:openssl sha1 -in t.txt三. 利用openssl命令进行AES/DES3加密解密(AES/DES3 encrypt/decrypt) 对字符串‘abc’进行aes加密,使用密钥123,输出结果以base64编码格式给出: # echo abc | openssl aes-128-cbc -k 123 -base64 U2FsdGVkX18ynIbzARm15nG/JA2dhN4mtiotwD7jt4g= (结果) 对以上结果进行解密处理: # echo U2FsdGVkX18ynIbzARm15nG/JA2dhN4mtiotwD7jt4g= | openssl aes-128-cbc -d -k 123 -base64 abc (结果) 若要从文件里取原文(密文)进行加密(解密),只要指定 -in 参数指向文件名就可以了。 进行des3加解密,只要把命令中的aes-128-cbc换成des3就可以了。另外,站长团上有产品团购,便宜有保证

谁能给个使用openssl加密函数的MFC例子

刚用过,看用这个函数就行了,按照自己需要改#include "stdafx.h"#include 《openssl/rand.h》#include 《openssl/bio.h》#include 《openssl/ssl.h》#include 《openssl/err.h》//-----------------------------***隐藏网址***int getPages(const TCHAR* host_addr, const int host_port, const TCHAR* pObject,CString &strText){ //转换域名到IP hostent *pHostent=gethostbyname(host_addr); if (pHostent==NULL) return -1; hostent& he = *pHostent; if(he.h_addr_list==NULL) return -1; SOCKET sockfd; if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { //DebugMsg("Socket Error: %s", strerror(errno)); return -1; } struct sockaddr_in server_addr; server_addr.sin_family = AF_INET; server_addr.sin_port = htons(host_port); memcpy ( &server_addr.sin_addr.s_addr, he.h_addr_list,he.h_length); //server_addr.sin_addr.s_addr = inet_addr(host_addr); if (connect(sockfd, (struct sockaddr *) (&server_addr), sizeof(struct sockaddr)) == -1) { //DebugMsg("Connect Error:%s", strerror(errno)); return -1; } SSL *ssl; SSL_CTX *ctx; // SSL initialize SSL_library_init(); SSL_load_error_strings(); ctx = SSL_CTX_new(SSLv23_client_method()); if (ctx == NULL) { //DebugMsg("SSL CTX new failed!");// AfxMessageBox("CTX创建失败"); return -1; } ssl = SSL_new(ctx); if (ssl == NULL) { //DebugMsg("SSL new failed!"); //AfxMessageBox("ssl创建失败"); return -1; } // link socket & SSL int ret = SSL_set_fd(ssl, sockfd); if (ret == 0) { //DebugMsg("SSL link socket failed!");//AfxMessageBox("关连SOCKET失败"); return -1; } RAND_poll(); while (RAND_status() == 0) { unsigned short rand_ret = rand() % 65536; RAND_seed(&rand_ret, sizeof(rand_ret)); } // SSL connect ret = SSL_connect(ssl); if (ret != 1) { //DebugMsg("SSL connect failed!"); //AfxMessageBox("ssl连接失败"); return -1; }***隐藏网址*** int totalsend = 0; int requestLen = strlen(pObject); while (totalsend 《 requestLen) { int send = SSL_write(ssl,pObject + totalsend, requestLen - totalsend); if (send == -1) { //DebugMsg("SSL send failed!"); //AfxMessageBox("SSL send failed!"); } totalsend += send; //DebugMsg("%d bytes send OK!", totalsend); }***隐藏网址*** int responseLen = 0; int i = 0; TCHAR buffer; memset(buffer, 0, 8); TCHAR returnBuffer; memset(returnBuffer, 0, 4096); int p = 0; while ((responseLen = SSL_read(ssl, buffer, 1)) == 1 && p《4096) { returnBuffer; p++; if (i 《 4) { if (buffer == ’\n’) i++; else i = 0; } } //DebugMsg("%s", returnBuffer); //AfxMessageBox(returnBuffer);strText=returnBuffer; // shutdown community ret = SSL_shutdown(ssl); if (ret != 1) { //DebugMsg("SSL shutdown failed!"); //AfxMessageBox("SSL shutdown failed!"); return -1; } SSL_free(ssl); SSL_CTX_free(ctx); ERR_free_strings(); closesocket(sockfd); WSACleanup(); return 0;}

如何用C语言来使用openssl rsa进行公钥加密,已有公钥和明文的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于如何用C语言来使用openssl rsa进行公钥加密,已有公钥和明文、如何用C语言来使用openssl rsa进行公钥加密,已有公钥和明文的信息别忘了在本站进行查找哦。