社区
系统维护与使用区
帖子详情
linux openssl aes解密的问题
HULIHONG
2010-04-14 05:33:01
问题:在windows下用aes(128)加密的文件,在linux下解密失败(直接用Linux 自带的openssl解密的),报bad magic number错误, 反过来也是失败的(报invalid buffersize decrypt)。
请问一下:有没有可能会正确呢?都是用aes(128)加密解密的
谢谢。
...全文
499
3
打赏
收藏
linux openssl aes解密的问题
问题:在windows下用aes(128)加密的文件,在linux下解密失败(直接用Linux 自带的openssl解密的),报bad magic number错误, 反过来也是失败的(报invalid buffersize decrypt)。 请问一下:有没有可能会正确呢?都是用aes(128)加密解密的 谢谢。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
3 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
HULIHONG
2010-04-15
打赏
举报
回复
来个会的啊, 哥哥姐姐们
一品川
2010-04-15
打赏
举报
回复
那我更不会了,顶
steptodream
2010-04-14
打赏
举报
回复
这个真不会 帮顶
openssl
evp
aes
加
解密
算法调试例程
0、此例程调试环境 运行uname -a的结果如下:
Linux
freescale 3.0.35-2666-gbdde708-g6f31253 #1 SMP PREEMPT Thu Nov 30 15:45:33 CST 2017 armv7l GNU/
Linux
简称2017 armv7l GNU/
Linux
1、
openssl
直接处理
AES
的API 在
openssl
/
aes
.h定义。是基本的
AES
库函数接口,可以直接调用,但是那个接口是没有填充的。而如果要与Java通信,必须要有填充模式。所以看第2条。 2、利用
openssl
EVP接口 在
openssl
/evp.h中定义。在这个接口中提供的
AES
是默认是pkcs5padding方式填充方案。 3、注意
openssl
新老版本的区别 看如下这段 One of the primary differences between master (
OpenSSL
1.1.0) and the 1.0.2 version is that many types have been made opaque, i.e. applications are no longer allowed to look inside the internals of the structures. The biggest impact on applications is that: 1)You cannot instantiate these structures directly on the stack. So instead of: EVP_CIPHER_CTX ctx; you must instead do: EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new(); .... EVP_CIPHER_CTX_free(ctx); 2)You must only use the provided accessor functions to access the internals of the structure. 4、注意加密的内容是数据不限制是否为字符串
openssl
接口加密的是数据,不限制是否为字符串,我看到有些人在加密时使用strlen(),来获取要加密的长度,如果是对字符串加密的话没有
问题
,如果不是字符串的话,用它获取的长度是到第一个0处,因为这个函数获取的是字符串长度,字符串是以零为终止的。 5、在调用EVP_EncryptFinal_ex时不要画蛇添足 正常加
解密
处理过程,引用网友的代码如下,经测试正确。 int kk_encrypt(unsigned char *plaintext, int plaintext_len, unsigned char *key, unsigned char *iv, unsigned char *ciphertext) { EVP_CIPHER_CTX *ctx; int len; int ciphertext_len; ctx = EVP_CIPHER_CTX_new(); EVP_EncryptInit_ex(ctx, EVP_
aes
_128_cbc(), NULL, key, iv); //EVP_EncryptInit_ex(ctx, EVP_
aes
_128_ecb(), NULL, key, iv); EVP_EncryptUpdate(ctx, ciphertext, &len;, plaintext, plaintext_len); ciphertext_len = len; EVP_EncryptFinal_ex(ctx, ciphertext + len, &len;); ciphertext_len += len; EVP_CIPHER_CTX_free(ctx); return ciphertext_len; } int kk_decrypt(unsigned char *ciphertext, int ciphertext_len, unsigned char *key, unsigned char *iv, unsigned char *plaintext) { EVP_CIPHER_CTX *ctx; int len; int plaintext_len; ctx = EVP_CIPHER_CTX_new(); EVP_DecryptInit_ex(ctx, EVP_
aes
_128_cbc(), NULL, key, iv); //EVP_DecryptInit_ex(ctx, EVP_
aes
_128_ecb(), NULL, key, iv); EVP_DecryptUpdate(ctx, plaintext, &len;, ciphertext, ciphertext_len); plaintext_len = len; EVP_DecryptFinal_ex(ctx, plaintext + len, &len;); plaintext_len += len; EVP_CIPHER_CTX_free(ctx); return plaintext_len; } 我看到有人提供的代码在加密长度正好是16字节的整数倍时特意不去调用EVP_EncryptFinal_ex,这实在是画蛇添足啊,不论什么情况下,最后一定要调用EVP_EncryptFinal_ex一次,然后结束加密过程。 6、Base64陷阱 如果用到了base64,要注意如下: 1)base64算法是将3个字节变成4个可显示字符。所以在如果数据长度不是3字节对齐时,会补0凑齐。 2)在
解密
时先要解base64,再解
AES
。在解base64后,要减掉补上的0。算法就去查看base64后的字符串尾处有几个=号,最多是2个,如果正好要加密的数据是3的倍数,不需要补0,那么base64后的数据尾处就没有=,如果补了1个0,就有一个=号。 算法如下: int encode_str_size = EVP_EncodeBlock(base64, en, el); int length = EVP_DecodeBlock(base64_out, base64, encode_str_size ); //EVP_DecodeBlock内部同样调用EVP_DecodeInit + EVP_DecodeUpdate + Evp_DecodeFinal实现,但是并未处理尾部的'='字符,因此结果字符串长度总是为3的倍数 while(base64[--encode_str_size] == '=') length--; 算法网友提供,测试正确。
解决
Linux
操作系统下
AES
解密
失败的
问题
Windows上加
解密
正常,
linux
上加密正常,
解密
时发生如下异常: javax.crypto.BadPaddingException: Given final block not properly padded at com.sun.crypto.provider.SunJCE_f.b(DashoA13*..) at com.sun.crypto.provider.SunJCE_f.b(DashoA13*..) at com.sun.crypto.provider.
AES
Cipher.engineDoFinal(DashoA13*..) at javax.crypto.Ciphe
C语言使用
openSSL
库
AES
模块实现加密功能详解
主要介绍了C语言使用
openSSL
库
AES
模块实现加密功能,详细分析了C语言加密的相关概念、原理及
AES
模块加密具体实现技巧,需要的朋友可以参考下
C 语言实现
aes
加
解密
C 语言实现
aes
加
解密
OpenSSL
加
解密
文件
解密
程序
Qt界面程序, 调用
OpenSSL
加密库, 采用
AES
, RSA完成本地文件加密; 本压缩包支持
Linux
32bit
系统维护与使用区
19,614
社区成员
74,562
社区内容
发帖
与我相关
我的任务
系统维护与使用区
系统使用、管理、维护问题。可以是Ubuntu, Fedora, Unix等等
复制链接
扫一扫
分享
社区描述
系统使用、管理、维护问题。可以是Ubuntu, Fedora, Unix等等
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章