社区
C语言
帖子详情
Linux c AES/ CBC/PKCS7/PKCS5加密代码有个接口函数没有看懂。
才华高于颜值
2018-08-22 06:00:39
int Aes128cbc_Pkcs7_Enc(bw4 * input,int inlen,const word_t * wkey,bw4 * output,const bw4 * iv);
这个函数接口如何传参呢能给写个demo吗,因为没有注释,不知道如何传参数,麻烦大牛帮我写个main方法~
...全文
457
回复
打赏
收藏
Linux c AES/ CBC/PKCS7/PKCS5加密代码有个接口函数没有看懂。
int Aes128cbc_Pkcs7_Enc(bw4 * input,int inlen,const word_t * wkey,bw4 * output,const bw4 * iv); 这个函数接口如何传参呢能给写个demo吗,因为没有注释,不知道如何传参数,麻烦大牛帮我写个main方法~
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
赵4老师
2018-08-23
打赏
举报
回复
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。
提醒:再牛×的老师也无法代替学生自己领悟和上厕所!
单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。
AES
128 ECB、
CBC
模式
加密
解密函数(C语言实现 -单片机/嵌入式)
基于c语言实现
AES
128_ECB、
AES
128_
CBC
两种模式
加密
,数据使用
PKCS7
Padding算法对齐,程序已验证
java、Android、javaScript、ios 通用
AES
加密
、解密 已实际使用
java、Android、javaScript(可以改成vue)、ios
AES
加密
通用,可在服务端
加密
,客户端解密,也可在客户端
加密
,服务端解密;由于csdn会自动把积分改到50,可以发邮件到1622007541@qq.com 免费送
delphi 实现
AES
加/解密
AES
是一种使用安全码进行信息
加密
的标准。 它支持 128 位、192 位和 256 位长度的密匙。
加密
算法的实现在 El
AES
.pas 单元中。 本人将其
加密
方法封装在
AES
.pas 单元中, 只需要调用两个标准函数就可以完成字符串的
加密
和解密。
著名的TomCrypt
加密
解密函数库
一个超大
加密
函数库
加密
支持的
加密
函数 Blowfish XTEA RC5 RC6 SAFER+ Rijndael (aka
AES
) Twofish SAFER (K64, SK64, K128, SK128) RC2 DES, 3DES CAST5 Noekeon Skipjack Anubis (with optional tweak as proposed by the developers) Khazad Chaining Modes (这部分我不用,不知道怎么翻译) Modes come with a start, encrypt/decrypt and set/get IV interfaces. Mode supported. ECB
CBC
OFB CFB CTR 单向 Hash 函数 支持的hash方式. MD2 MD4 MD5 (较为常用) SHA-1 SHA-224/256/384/512 (Rinick推荐) TIGER-192 RIPE-MD 128/160 WHIRLPOOL 信息认证 FIPS-198 HMAC (支持所有hash函数) CMAC, 也称OMAC1 (支持所有
加密
函数) PMAC Authentication Pelican MAC 信息
加密
认证模式 EAX Mode OCB Mode CCM Mode (NIST spec) GCM Mode (IEEE spec) 伪随机数生成器(部分其他函数要使用) Yarrow (based algorithm) RC4 支持 /dev/random, /dev/urandom 以及 Win32 CSP RNG Fortuna SOBER-128 公钥算法 RSA (using PKCS #1 v2.1) ECC (EC-DSA X9.62 数字签名标准, X9.63 EC-DH,密钥交换标准) Rinick添加了一个ECC
加密
和解密的函数,用于实现软件注册等功能 DSA (用户可以自己定义算法制造数字签名) 支持的其他标准 PKCS #1 (v2.1 padding) PKCS #5 ASN.1 DER for SEQUENCE, INTEGER, BIT STRING, OCTET STRING, OBJECT IDENTIFIER, IA5 STRING, PRINTABLE STRING, UTCTIME, CHOICE and NULL types.
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
是默认是
pkcs5
padding方式填充方案。 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--; 算法网友提供,测试正确。
C语言
69,371
社区成员
243,082
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章