当前位置: 首页 > 知识库问答 >
问题:

c - C语言 AES CBC 128 PCSKPadding7 解密问题?

詹联
2023-08-15

老师们好:

下面是一段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;}

共有1个答案

彭梓
2023-08-15
// 解密前重新设置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