如何调用openssl 的加解密算法 进行base64 aes-128-ecb 模式的加解密?

zzxap 2011-04-29 03:09:18
熟悉的指点一下


...全文
1194 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
yfy21g 2013-11-19
  • 打赏
  • 举报
回复

这是我写的解密函数,希望指导一下啊
yfy21g 2013-11-19
  • 打赏
  • 举报
回复
EVP_DecryptFinal_es这个函数调用的返回值是0,不知道哪里出错,储存解密后的的数组也是空的,好像根本没写入一样,希望能指导一下
zzxap 2011-05-03
  • 打赏
  • 举报
回复
root@ubuntu3:~/openssl-0.9.8e# ./config --disable-shared --enable-static --prefix=/usr/local/openssl --openssldir=/usr/local/openssl

Operating system: x86_64-whatever-linux2
Configuring for linux-x86_64
Usage: Configure [no-<cipher> ...] [enable-<cipher> ...] [-Dxxx] [-lxxx] [-Lxxx] [-fxxx] [-Kxxx] [no-hw-xxx|no-hw] [[no-]threads] [[no-]shared] [[no-]zlib|zlib-dynamic] [no-asm] [no-dso] [no-krb5] [386] [--prefix=DIR] [--openssldir=OPENSSLDIR] [--with-xxx[=vvv]] [--test-sanity] os/compiler[:flags]
海盗医生 2011-04-29
  • 打赏
  • 举报
回复
添加静态库 libeay32.a
静态库在OPENSSL下边有,记得放到当前程序路径下或者把引用路径加到工程
zzxap 2011-04-29
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 wangyutao0232000 的回复:]

OPENSSL SDK有吗?
从网上DOWN个吧 openssl-0.9.8g
里边有对应头文件和LIB 把它引入到工程
[/Quote]
#include <openssl/evp.h>
引用头文件还不行吗?

还是 undefined reference to `EVP_EncryptUpdate'
海盗医生 2011-04-29
  • 打赏
  • 举报
回复
#define MAX_ENCRYPT_LEN 1024
写错了 ,把MAX_SIGN_MSG修改MAX_ENCRYPT_LEN 即可

因为在我工程里是同一值,直接COPY了,没有修改
zzxap 2011-04-29
  • 打赏
  • 举报
回复


MAX_SIGN_MSG 没定义 openssl已经ok

海盗医生 2011-04-29
  • 打赏
  • 举报
回复
OPENSSL SDK有吗?
从网上DOWN个吧 openssl-0.9.8g
里边有对应头文件和LIB 把它引入到工程

zzxap 2011-04-29
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 wangyutao0232000 的回复:]

提供个加密函数代码:
C/C++ code

#define MAX_ENCRYPT_LEN 1024
void MyEncrypt(const unsigned char *sMsg, int cbMsg, unsigned char *sEncryptMsg, int &cbEncryptMsg)
{
OpenSSL_add_all_algorithms();
/……
[/Quote]

RAND_bytes()没定义
EVP_EncryptUpdate( )没定义
zzxap 2011-04-29
  • 打赏
  • 举报
回复
我试试,多谢你
zzxap 2011-04-29
  • 打赏
  • 举报
回复
急用解密。。。
海盗医生 2011-04-29
  • 打赏
  • 举报
回复
const unsigned char *sMsg 需要密的明文
写错了,这个应该是 需要密的明文
海盗医生 2011-04-29
  • 打赏
  • 举报
回复
提供个加密函数代码:

#define MAX_ENCRYPT_LEN 1024
void MyEncrypt(const unsigned char *sMsg, int cbMsg, unsigned char *sEncryptMsg, int &cbEncryptMsg)
{
OpenSSL_add_all_algorithms();
//产生会话密钥
unsigned char SessionKey[16];
RAND_bytes(SessionKey,16);

//加密
EVP_CIPHER_CTX ctx;
EVP_CIPHER_CTX_init(&ctx);
if(EVP_EncryptInit_ex(&ctx,EVP_get_cipherbynid(NID_aes_128_ecb),NULL,SessionKey,NULL))
{
int offseti=0;
int offseto=0;
int offsett=0;
for(;;)
{
if(cbMsg-offseti<=MAX_ENCRYPT_LEN)
{
EVP_EncryptUpdate(&ctx, sEncryptMsg+offseto, &offsett, sMsg+offseti, cbMsg-offseti);
offseto+=offsett;
break;
}
else
{
EVP_EncryptUpdate(&ctx, sEncryptMsg+offseto, &offsett, sMsg+offseti, MAX_SIGN_MSG);
offseti+=MAX_SIGN_MSG;
offseto+=offsett;
}
}
EVP_EncryptFinal_ex(&ctx, sEncryptMsg+offseto, &offsett);
offseto+=offsett;
cbEncryptMsg=offseto;
}
EVP_CIPHER_CTX_cleanup(&ctx);
}


参数解释:
const unsigned char *sMsg 需要解密的明文
int cbMsg 明文长度
unsigned char *sEncryptMsg 输出密文
int &cbEncryptMsg 密文长度

好了,这个函数刚写的,验证了一下,是没有问题的
解密与这个比较类似,你懂的
海盗医生 2011-04-29
  • 打赏
  • 举报
回复
== 写个例子给你
zzxap 2011-04-29
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wangyutao0232000 的回复:]

OPENSSL base64 aes-128-ecb 涉及的API:
加密:
EVP_CIPHER_CTX_init
EVP_EncryptInit_ex
EVP_EncryptUpdate
EVP_EncryptFinal_ex
解密:
EVP_CIPHER_CTX_init
EVP_DecryptInit_ex
EVP_DecryptUpdate
EVP_DecryptF……
[/Quote]
EVP_DecryptInit_ex返回的是int 。解密得到的结果保存到哪了?结果要转换成string
zzxap 2011-04-29
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wangyutao0232000 的回复:]

OPENSSL base64 aes-128-ecb 涉及的API:
加密:
EVP_CIPHER_CTX_init
EVP_EncryptInit_ex
EVP_EncryptUpdate
EVP_EncryptFinal_ex
解密:
EVP_CIPHER_CTX_init
EVP_DecryptInit_ex
EVP_DecryptUpdate
EVP_DecryptF……
[/Quote]


一段string "asdfasdfasdf" 怎样转换成 &ctx
海盗医生 2011-04-29
  • 打赏
  • 举报
回复
OPENSSL base64 aes-128-ecb 涉及的API:
加密:
EVP_CIPHER_CTX_init
EVP_EncryptInit_ex
EVP_EncryptUpdate
EVP_EncryptFinal_ex
解密:
EVP_CIPHER_CTX_init
EVP_DecryptInit_ex
EVP_DecryptUpdate
EVP_DecryptFinal_ex

example:

Encrypt
EVP_EncryptInit_ex(&ctx,EVP_get_cipherbynid(NID_aes_128_ecb),NULL,SessionKey,NULL);

Decrypt
EVP_DecryptInit_ex(&ctx,EVP_get_cipherbynid(NID_aes_128_ecb),NULL,SessionKey,NULL);

其中SessionKey为加密和解密使用的密钥,一般使用对称会话密钥,通常用RAND_bytes随机函数产生,也可以通过DH、椭圆等产生会话密钥

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧