老师们好:
下面是一段C 语言结合openssl库做 AES CBC 128 PCSKPadding7 加密, 加密的部分是可以, 解密是总是出现乱码。请老师们帮忙给看看:
程序输出如下:
Ciphertext (Base64): O4SkNWTfpKVOSrvpdcwbXg==
Decrypted text: :▒▒1aٞ▒tp▒▒L▒$b;▒▒5dߤ▒NJ▒▒u▒
代码如下
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <openssl/aes.h>#include <openssl/evp.h>#include <openssl/bio.h>#include <openssl/buffer.h>// PKCS7Padding填充函数int pkcs7padding(unsigned char *data, int len, int block_size) { int pad_len = block_size - (len % block_size); for (int i = 0; i < pad_len; i++) { data[len + i] = pad_len; } return len + pad_len;}// PKCS7Padding去除填充函数int pkcs7unpadding(unsigned char *data, int len) { int pad_len = data[len - 1]; return len - pad_len;}// AES CBC加密函数void aes_cbc_encrypt(unsigned char *plaintext, int plaintext_len, unsigned char *key, unsigned char *iv, unsigned char *ciphertext) { AES_KEY aes_key; AES_set_encrypt_key(key, 128, &aes_key); AES_cbc_encrypt(plaintext, ciphertext, plaintext_len, &aes_key, iv, AES_ENCRYPT);}// AES CBC解密函数void aes_cbc_decrypt(unsigned char *ciphertext, int ciphertext_len, unsigned char *key, unsigned char *iv, unsigned char *plaintext) { AES_KEY aes_key; AES_set_decrypt_key(key, 128, &aes_key); AES_cbc_encrypt(ciphertext, plaintext, ciphertext_len, &aes_key, iv, AES_DECRYPT);}// Base64编码函数char* base64_encode(const unsigned char* input, int length) { BIO *bio, *b64; BUF_MEM *bufferPtr; b64 = BIO_new(BIO_f_base64()); bio = BIO_new(BIO_s_mem()); bio = BIO_push(b64, bio); // 忽略换行符 BIO_set_flags(bio, BIO_FLAGS_BASE64_NO_NL); BIO_write(bio, input, length); BIO_flush(bio); BIO_get_mem_ptr(bio, &bufferPtr); char *output = (char*)malloc(bufferPtr->length + 1); memcpy(output, bufferPtr->data, bufferPtr->length); output[bufferPtr->length] = '\0'; BIO_free_all(bio); return output;}// Base64解码函数unsigned char* base64_decode(const char* input, int length, int* decoded_length) { BIO *bio, *b64; unsigned char *buffer = (unsigned char*)malloc(length); memset(buffer, 0, length); b64 = BIO_new(BIO_f_base64()); bio = BIO_new_mem_buf((void*)input, length); bio = BIO_push(b64, bio); // 忽略换行符 BIO_set_flags(bio, BIO_FLAGS_BASE64_NO_NL); int decoded_len = BIO_read(bio, buffer, length); BIO_free_all(bio); *decoded_length = decoded_len; unsigned char* output = (unsigned char*)malloc(decoded_len + 1); memcpy(output, buffer, decoded_len); output[decoded_len] = '\0'; free(buffer); return output;}int main() { unsigned char key[16] = "0000000000123456"; // 128位密钥 unsigned char iv[16] = "0000000000123456"; // 初始向量 unsigned char plaintext[] = "123456"; int plaintext_len = strlen((char *)plaintext); // 计算填充后的长度 int padded_len = pkcs7padding(plaintext, plaintext_len, 16); unsigned char ciphertext[padded_len]; unsigned char decrypted_text[padded_len]; // 加密 aes_cbc_encrypt(plaintext, padded_len, key, iv, ciphertext); // Base64编码 char* base64_encoded = base64_encode(ciphertext, padded_len); printf("Ciphertext (Base64): %s\n", base64_encoded); // Base64解码 int decoded_len; unsigned char* decoded_ciphertext = base64_decode(base64_encoded, strlen(base64_encoded), &decoded_len); // 解密 aes_cbc_decrypt(decoded_ciphertext, decoded_len, key, iv, decrypted_text); // 去除填充字节 int decrypted_len = pkcs7unpadding(decrypted_text, decoded_len); decrypted_text[decrypted_len] = '\0'; printf("Decrypted text: %s\n", decrypted_text); free(base64_encoded); free(decoded_ciphertext); return 0;}
// 解密前重新设置IVunsigned char decrypt_iv[16] = "0000000000123456";// 解密aes_cbc_decrypt(decoded_ciphertext, decoded_len, key, decrypt_iv, decrypted_text);// 去除填充字节int pad_len = decrypted_text[decoded_len - 1];int decrypted_len = decoded_len - pad_len;// 检查填充是否正确for (int i = 0; i < pad_len; i++) { if (decrypted_text[decrypted_len + i] != pad_len) { printf("Padding error\n"); return -1; }}decrypted_text[decrypted_len] = '\0';
本文向大家介绍C语言实现加密解密功能,包括了C语言实现加密解密功能的使用技巧和注意事项,需要的朋友参考一下 加密主要是通过一种算法对原内容进行处理,使原来内容不直观可见。解密过程通常要知道加密的算法,然后对加密后的内容进行逆处理,从而实现解密功能。当然解密也有一些暴力破解的方法。接下来以 c 语言 为例讲解一种简单的加密解密以及暴力破解字符串的方法,带您走进加密解密技术的大门。 先讲一下凯撒加密,
我正在创建一个应用程序,我保存了一些隐私文档。我想把那些文件保存为加密格式。 我在谷歌搜索C语言的AES加密/解密alto。我找不到实现AES的标准算法。
本文向大家介绍C语言实现密码本,包括了C语言实现密码本的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了C语言实现密码本的具体代码,供大家参考,具体内容如下 功能简述: 1.账号登陆(密码验证,三次锁定账号) 2.功能选择:1、查看所有密码 2、新增密码 3、删除密码 4、修改密码 5、查询密码 6、解除锁定 7、退出登陆 3.保存密码,文件加密 4.流程图: 数据定义部分 界面与用户
老师们好: C 语言实现, 给定一个字符串长度不是16字节倍数时,请将字符串左边用0填充,使其长度为16字节的整倍数。 期望得到下面给出的结果
C类语言破解 1、bp MessageBoxA(W)(断对话框)—Ctrl+N 2、Point-H法 3、bp GetDlgItem/GetWindowTextA(W)/GetWindowTextLengthA(W) (断输入框) 4、字符串法—插件/搜索所有参考文本
在欢迎你拥抱OpenFOAM之前,首先欢迎来到C++的世界! 若有程序员说 xxx语言是世界上最好的语言 不严重的情况是整个聊天群下午就会爆掉了,严重的是会引起人身攻击的。虽然PHP直接在官方文档里面说 PHP is the best language for web programming 但C++并没有说C++ is the best language for scientific compu